[SCM] CTDB repository - branch 2.5 updated - ctdb-2.5.1-22-gfdc0daa
Amitay Isaacs
amitay at samba.org
Tue Jan 21 01:50:47 MST 2014
The branch, 2.5 has been updated
via fdc0daae4b680990b2ebe7140a6aec7d8e33b959 (commit)
via 29a7a7f4eafddadcd6a288027fcca4d66044851e (commit)
from fe68ada3ea823771864fb5f9751eb041227740e2 (commit)
http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=2.5
- Log -----------------------------------------------------------------
commit fdc0daae4b680990b2ebe7140a6aec7d8e33b959
Author: Amitay Isaacs <amitay at gmail.com>
Date: Thu Jan 16 13:05:58 2014 +1100
daemon: Simplify listing event scripts using scandir
Instead of using RB tree for sorting the script names (incorrectly since
it's only using the leading numbers in the script name), use scandir
with alphasort.
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
Autobuild-User(master): Martin Schwenke <martins at samba.org>
Autobuild-Date(master): Tue Jan 21 06:41:25 CET 2014 on sn-devel-104
(Imported from commit eee450fec2f7cb5f45c47162fd5b7c0717978598)
commit 29a7a7f4eafddadcd6a288027fcca4d66044851e
Author: Amitay Isaacs <amitay at gmail.com>
Date: Thu Dec 19 13:01:25 2013 +1100
daemon: Do not run monitor event if any other event is already running
Any currently running monitor events are cancelled if any other events
are scheduled. However, this does not stop monitor events to be run
when other events are already running.
Keep track of the number of active events and schedule monitor event
only if there are no active events.
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
(Imported from commit cbffbb7c2f406fc1d8ebad3c531cc2757232690e)
-----------------------------------------------------------------------
Summary of changes:
include/ctdb_private.h | 1 +
server/eventscript.c | 149 ++++++++++++++++++------------------------------
2 files changed, 56 insertions(+), 94 deletions(-)
Changeset truncated at 500 lines:
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index eba4045..b95b2c7 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -526,6 +526,7 @@ struct ctdb_context {
TALLOC_CTX *release_ips_ctx; /* a context used to automatically drop all IPs if we fail to recover the node */
TALLOC_CTX *event_script_ctx;
+ int active_events;
struct ctdb_event_script_state *current_monitor;
struct ctdb_scripts_wire *last_status[CTDB_EVENT_MAX];
diff --git a/server/eventscript.c b/server/eventscript.c
index 0feb32b..b85fed5 100644
--- a/server/eventscript.c
+++ b/server/eventscript.c
@@ -100,10 +100,33 @@ int32_t ctdb_control_get_event_script_status(struct ctdb_context *ctdb,
return 0;
}
-struct ctdb_script_tree_item {
- const char *name;
- int error;
-};
+/* To ignore directory entry return 0, else return non-zero */
+static int script_filter(const struct dirent *de)
+{
+ int namelen = strlen(de->d_name);
+
+ /* Ignore . and .. */
+ if (namelen < 3) {
+ return 0;
+ }
+
+ /* Skip temporary files left behind by emacs */
+ if (de->d_name[namelen-1] == '~') {
+ return 0;
+ }
+
+ /* Filename should start with [0-9][0-9]. */
+ if (!isdigit(de->d_name[0]) || !isdigit(de->d_name[1]) ||
+ de->d_name[2] != '.') {
+ return 0;
+ }
+
+ if (namelen > MAX_SCRIPT_NAME) {
+ return 0;
+ }
+
+ return 1;
+}
/* Return true if OK, otherwise set errno. */
static bool check_executable(const char *dir, const char *name)
@@ -135,117 +158,40 @@ static bool check_executable(const char *dir, const char *name)
static struct ctdb_scripts_wire *ctdb_get_script_list(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx)
{
- DIR *dir;
- struct dirent *de;
- struct stat st;
- trbt_tree_t *tree;
+ struct dirent **namelist;
struct ctdb_scripts_wire *scripts;
- TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
- struct ctdb_script_tree_item *tree_item;
int count;
- /*
- the service specific event scripts
- */
- if (stat(ctdb->event_script_dir, &st) != 0 &&
- errno == ENOENT) {
- DEBUG(DEBUG_CRIT,("No event script directory found at '%s'\n", ctdb->event_script_dir));
- talloc_free(tmp_ctx);
- return NULL;
- }
-
- /* create a tree to store all the script names in */
- tree = trbt_create(tmp_ctx, 0);
-
/* scan all directory entries and insert all valid scripts into the
tree
*/
- dir = opendir(ctdb->event_script_dir);
- if (dir == NULL) {
- DEBUG(DEBUG_CRIT,("Failed to open event script directory '%s'\n", ctdb->event_script_dir));
- talloc_free(tmp_ctx);
+ count = scandir(ctdb->event_script_dir, &namelist, script_filter, alphasort);
+ if (count == -1) {
+ DEBUG(DEBUG_CRIT, ("Failed to read event script directory '%s' - %s\n",
+ ctdb->event_script_dir, strerror(errno)));
return NULL;
}
- count = 0;
- while ((de=readdir(dir)) != NULL) {
- int namlen;
- unsigned num;
-
- namlen = strlen(de->d_name);
-
- if (namlen < 3) {
- continue;
- }
-
- if (de->d_name[namlen-1] == '~') {
- /* skip files emacs left behind */
- continue;
- }
-
- if (de->d_name[2] != '.') {
- continue;
- }
-
- if (sscanf(de->d_name, "%02u.", &num) != 1) {
- continue;
- }
-
- if (strlen(de->d_name) > MAX_SCRIPT_NAME) {
- DEBUG(DEBUG_ERR,("Script name %s too long! %u chars max",
- de->d_name, MAX_SCRIPT_NAME));
- continue;
- }
-
- tree_item = talloc(tree, struct ctdb_script_tree_item);
- if (tree_item == NULL) {
- DEBUG(DEBUG_ERR, (__location__ " Failed to allocate new tree item\n"));
- closedir(dir);
- talloc_free(tmp_ctx);
- return NULL;
- }
-
- tree_item->error = 0;
- if (!check_executable(ctdb->event_script_dir, de->d_name)) {
- tree_item->error = errno;
- }
-
- tree_item->name = talloc_strdup(tree_item, de->d_name);
- if (tree_item->name == NULL) {
- DEBUG(DEBUG_ERR,(__location__ " Failed to allocate script name.\n"));
- closedir(dir);
- talloc_free(tmp_ctx);
- return NULL;
- }
-
- /* store the event script in the tree */
- trbt_insert32(tree, (num<<16)|count++, tree_item);
- }
- closedir(dir);
-
/* Overallocates by one, but that's OK */
- scripts = talloc_zero_size(tmp_ctx,
+ scripts = talloc_zero_size(mem_ctx,
sizeof(*scripts)
+ sizeof(scripts->scripts[0]) * count);
if (scripts == NULL) {
DEBUG(DEBUG_ERR, (__location__ " Failed to allocate scripts\n"));
- talloc_free(tmp_ctx);
+ free(namelist);
return NULL;
}
scripts->num_scripts = count;
for (count = 0; count < scripts->num_scripts; count++) {
- tree_item = trbt_findfirstarray32(tree, 1);
-
- strcpy(scripts->scripts[count].name, tree_item->name);
- scripts->scripts[count].status = -tree_item->error;
-
- /* remove this script from the tree */
- talloc_free(tree_item);
+ strcpy(scripts->scripts[count].name, namelist[count]->d_name);
+ scripts->scripts[count].status = 0;
+ if (!check_executable(ctdb->event_script_dir, namelist[count]->d_name)) {
+ scripts->scripts[count].status = -errno;
+ }
}
- talloc_steal(mem_ctx, scripts);
- talloc_free(tmp_ctx);
+ free(namelist);
return scripts;
}
@@ -645,6 +591,11 @@ static int event_script_destructor(struct ctdb_event_script_state *state)
status = 0;
}
+ state->ctdb->active_events--;
+ if (state->ctdb->active_events < 0) {
+ ctdb_fatal(state->ctdb, "Active events < 0");
+ }
+
/* This is allowed to free us; talloc will prevent double free anyway,
* but beware if you call this outside the destructor!
* the callback hangs off a different context so we walk the list
@@ -750,6 +701,14 @@ static int ctdb_event_script_callback_v(struct ctdb_context *ctdb,
}
}
+ /* Do not run new monitor events if some event is already running */
+ if (call == CTDB_EVENT_MONITOR && ctdb->active_events > 0) {
+ if (callback != NULL) {
+ callback(ctdb, -ECANCELED, private_data);
+ }
+ return 0;
+ }
+
/* Kill off any running monitor events to run this event. */
if (ctdb->current_monitor) {
struct ctdb_event_script_state *ms = talloc_get_type(ctdb->current_monitor, struct ctdb_event_script_state);
@@ -816,6 +775,8 @@ static int ctdb_event_script_callback_v(struct ctdb_context *ctdb,
talloc_set_destructor(state, event_script_destructor);
+ ctdb->active_events++;
+
/* Nothing to do? */
if (state->scripts->num_scripts == 0) {
talloc_free(state);
--
CTDB repository
More information about the samba-cvs
mailing list