summaryrefslogtreecommitdiff
path: root/ctdb/server/ctdb_lock_helper.c
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@gmail.com>2016-02-09 11:59:30 +1100
committerMartin Schwenke <martins@samba.org>2016-03-07 11:29:00 +0100
commitace23f0a81b057fbabd7e75a777688fee81bce94 (patch)
treea3b6ec6e737ddbe9fd5d04be7a75bf3ab3e737e6 /ctdb/server/ctdb_lock_helper.c
parent00b9e76904bb1108e0f06d0dba4df89394d58252 (diff)
downloadsamba-ace23f0a81b057fbabd7e75a777688fee81bce94.tar.gz
ctdb-locking: Use real-time only for actual record or DB locking
Use real-time priority only for obtaining record and database locks. Do not open databases with real-time priority as it can cause thundering herd on fcntl lock while opening tdb database. Also relinquish real-time priority after the lock is obtained. Signed-off-by: Amitay Isaacs <amitay@gmail.com> Reviewed-by: Martin Schwenke <martin@meltin.net> Autobuild-User(master): Martin Schwenke <martins@samba.org> Autobuild-Date(master): Mon Mar 7 11:29:00 CET 2016 on sn-devel-144
Diffstat (limited to 'ctdb/server/ctdb_lock_helper.c')
-rw-r--r--ctdb/server/ctdb_lock_helper.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/ctdb/server/ctdb_lock_helper.c b/ctdb/server/ctdb_lock_helper.c
index 4f1fe2d5e10..cdcbb4ac635 100644
--- a/ctdb/server/ctdb_lock_helper.c
+++ b/ctdb/server/ctdb_lock_helper.c
@@ -69,6 +69,7 @@ static int lock_record(const char *dbpath, const char *dbflags, const char *dbke
TDB_DATA key;
struct tdb_context *tdb;
int tdb_flags;
+ bool realtime;
/* No error checking since CTDB always passes sane values */
tdb_flags = strtol(dbflags, NULL, 0);
@@ -87,12 +88,22 @@ static int lock_record(const char *dbpath, const char *dbflags, const char *dbke
return 1;
}
+ realtime = set_scheduler();
+ if (! realtime) {
+ fprintf(stderr, "%s: Unable to set real-time scheduler priority\n",
+ progname);
+ }
+
if (tdb_chainlock(tdb, key) < 0) {
fprintf(stderr, "%s: Error getting record lock (%s)\n",
progname, tdb_errorstr(tdb));
return 1;
}
+ if (realtime) {
+ reset_scheduler();
+ }
+
return 0;
}
@@ -102,6 +113,7 @@ static int lock_db(const char *dbpath, const char *dbflags)
{
struct tdb_context *tdb;
int tdb_flags;
+ bool realtime;
/* No error checking since CTDB always passes sane values */
tdb_flags = strtol(dbflags, NULL, 0);
@@ -112,12 +124,22 @@ static int lock_db(const char *dbpath, const char *dbflags)
return 1;
}
+ realtime = set_scheduler();
+ if (! realtime) {
+ fprintf(stderr, "%s: Unable to set real-time scheduler priority\n",
+ progname);
+ }
+
if (tdb_lockall(tdb) < 0) {
fprintf(stderr, "%s: Error getting db lock (%s)\n",
progname, tdb_errorstr(tdb));
return 1;
}
+ if (realtime) {
+ reset_scheduler();
+ }
+
return 0;
}
@@ -136,11 +158,6 @@ int main(int argc, char *argv[])
exit(1);
}
- if (!set_scheduler()) {
- fprintf(stderr, "%s: Unable to set real-time scheduler priority\n",
- progname);
- }
-
log_fd = atoi(argv[1]);
close(STDOUT_FILENO);
close(STDERR_FILENO);