diff --git a/SOURCES/0061-Ticket-48005-ns-slapd-crash-in-shutdown-phase.patch b/SOURCES/0061-Ticket-48005-ns-slapd-crash-in-shutdown-phase.patch deleted file mode 100644 index 3d59efe..0000000 --- a/SOURCES/0061-Ticket-48005-ns-slapd-crash-in-shutdown-phase.patch +++ /dev/null @@ -1,1057 +0,0 @@ -From 2e87dafa9d39e6ab08382612be762c25afa80d4f Mon Sep 17 00:00:00 2001 -From: Noriko Hosoi -Date: Sun, 15 Feb 2015 17:34:12 -0800 -Subject: [PATCH] Ticket #48005 - ns-slapd crash in shutdown phase - -Description: There was a small window that long running tasks access its -own task object after it's aready released by main thread in the shutdown -period. This patch adds refcounter to such threads and make destructor -wait until the counter becomes 0. Plus, the shutdown check is added to -their task callbacks. - -Following tasks are updated by this patch: - slapd/task.c: "fixup tombstones" - posix-winsync/posix-winsync-config.c: "memberuid task" - replication/repl5_replica_config.c: "cleanallruv" - replication/repl5_replica_config.c: "abort cleanallruv" - syntaxes/validate_task.c: "syntax validate" - automember/automember.c: "automember rebuild membership" - automember/automember.c: "automember export updates" - automember/automember.c: "automember map updates" - linkedattrs/linked_attrs.c: "fixup linked attributes" - memberof/memberof.c: "memberof task" - schema_reload/schema_reload.c: "schema reload task" - usn/usn_cleanup.c: "USN tombstone cleanup task" - -Following tasks are already covered: - slapd/task.c: "import" - slapd/task.c: "index" - slapd/task.c: "upgradedb" - -Following tasks are processed in an ordinary worker thread; no need to change - slapd/task.c: "sysconfig reload" - slapd/task.c: "export" - slapd/task.c: "backup" - slapd/task.c: "restore" - -(cherry picked from commit ab2e26de21beb5a92d2a18ab5a20db9637b83c7a) -(cherry picked from commit eebbabbaba8f024671158f527a169fc378ff01d6) - -Conflicts: - ldap/servers/plugins/memberof/memberof.c ---- - ldap/servers/plugins/automember/automember.c | 70 ++++++++++++++++++---- - ldap/servers/plugins/linkedattrs/fixup_task.c | 40 +++++++++++-- - ldap/servers/plugins/memberof/memberof.c | 26 +++++++- - ldap/servers/plugins/memberof/memberof.h | 2 +- - .../plugins/posix-winsync/posix-group-task.c | 40 ++++++++++--- - .../plugins/replication/repl5_replica_config.c | 58 ++++++++++++++++++ - ldap/servers/plugins/schema_reload/schema_reload.c | 23 ++++++- - ldap/servers/plugins/syntaxes/validate_task.c | 26 +++++++- - ldap/servers/plugins/usn/usn_cleanup.c | 58 +++++++++++++----- - ldap/servers/slapd/slapi-plugin.h | 9 +++ - ldap/servers/slapd/slapi-private.h | 2 - - ldap/servers/slapd/task.c | 47 +++++++++++++-- - 12 files changed, 348 insertions(+), 53 deletions(-) - -diff --git a/ldap/servers/plugins/automember/automember.c b/ldap/servers/plugins/automember/automember.c -index 6a8fd22..b2914db 100644 ---- a/ldap/servers/plugins/automember/automember.c -+++ b/ldap/servers/plugins/automember/automember.c -@@ -119,9 +119,9 @@ static int automember_task_add_map_entries(Slapi_PBlock *pb, Slapi_Entry *e, Sla - void automember_rebuild_task_thread(void *arg); - void automember_export_task_thread(void *arg); - void automember_map_task_thread(void *arg); --void automember_task_destructor(Slapi_Task *task); --void automember_task_export_destructor(Slapi_Task *task); --void automember_task_map_destructor(Slapi_Task *task); -+static void automember_task_destructor(Slapi_Task *task); -+static void automember_task_export_destructor(Slapi_Task *task); -+static void automember_task_map_destructor(Slapi_Task *task); - - #define DEFAULT_FILE_MODE PR_IRUSR | PR_IWUSR - -@@ -1962,11 +1962,15 @@ fetch_attr(Slapi_Entry *e, const char *attrname, const char *default_val) - return slapi_value_get_string(val); - } - --void -+static void - automember_task_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->bind_dn); - slapi_sdn_free(&mydata->base_dn); -@@ -1976,11 +1980,15 @@ automember_task_destructor(Slapi_Task *task) - } - } - --void -+static void - automember_task_export_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->ldif_out); - slapi_ch_free_string(&mydata->bind_dn); -@@ -1991,11 +1999,15 @@ automember_task_export_destructor(Slapi_Task *task) - } - } - --void -+static void - automember_task_map_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->ldif_out); - slapi_ch_free_string(&mydata->ldif_in); -@@ -2114,7 +2126,8 @@ out: - * Search using the basedn, filter, and scope provided from the task data. - * Then loop of each entry, and apply the membership if applicable. - */ --void automember_rebuild_task_thread(void *arg){ -+void automember_rebuild_task_thread(void *arg) -+{ - Slapi_Task *task = (Slapi_Task *)arg; - struct configEntry *config = NULL; - Slapi_PBlock *search_pb = NULL, *fixup_pb = NULL; -@@ -2124,6 +2137,12 @@ void automember_rebuild_task_thread(void *arg){ - int result = 0; - int i = 0; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error( SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, -+ "automember_rebuild_task_thread --> refcount incremented.\n" ); - /* - * Fetch our task data from the task - */ -@@ -2192,7 +2211,8 @@ void automember_rebuild_task_thread(void *arg){ - if (slapi_dn_issuffix(slapi_entry_get_dn(entries[i]), config->scope) && - (slapi_filter_test_simple(entries[i], config->filter) == 0)) - { -- if(automember_update_membership(config, entries[i], NULL)){ -+ if (slapi_is_shutting_down() || -+ automember_update_membership(config, entries[i], NULL)) { - result = SLAPI_PLUGIN_FAILURE; - automember_config_unlock(); - goto out; -@@ -2226,6 +2246,9 @@ out: - } - slapi_task_inc_progress(task); - slapi_task_finish(task, result); -+ slapi_task_dec_refcount(task); -+ slapi_log_error( SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, -+ "automember_rebuild_task_thread <-- refcount decremented.\n" ); - } - - /* -@@ -2328,7 +2351,8 @@ out: - return rv; - } - --void automember_export_task_thread(void *arg){ -+void automember_export_task_thread(void *arg) -+{ - Slapi_Task *task = (Slapi_Task *)arg; - Slapi_PBlock *search_pb = NULL; - Slapi_Entry **entries = NULL; -@@ -2340,6 +2364,13 @@ void automember_export_task_thread(void *arg){ - int i = 0; - int rc = 0; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error( SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, -+ "automember_export_task_thread --> refcount incremented.\n" ); -+ - td = (task_data *)slapi_task_get_data(task); - slapi_task_begin(task, 1); - slapi_task_log_notice(task, "Automember export task starting. Exporting changes to (%s)", td->ldif_out); -@@ -2394,7 +2425,8 @@ void automember_export_task_thread(void *arg){ - if (slapi_dn_issuffix(slapi_sdn_get_dn(td->base_dn), config->scope) && - (slapi_filter_test_simple(entries[i], config->filter) == 0)) - { -- if(automember_update_membership(config, entries[i], ldif_fd)){ -+ if (slapi_is_shutting_down() || -+ automember_update_membership(config, entries[i], ldif_fd)) { - result = SLAPI_DSE_CALLBACK_ERROR; - automember_config_unlock(); - goto out; -@@ -2423,6 +2455,9 @@ out: - } - slapi_task_inc_progress(task); - slapi_task_finish(task, result); -+ slapi_task_dec_refcount(task); -+ slapi_log_error( SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, -+ "automember_export_task_thread <-- refcount decremented.\n" ); - } - - /* -@@ -2507,7 +2542,8 @@ out: - * Read in the text entries from ldif_in, and convert them to slapi_entries. - * Then, write to ldif_out what the updates would be if these entries were added - */ --void automember_map_task_thread(void *arg){ -+void automember_map_task_thread(void *arg) -+{ - Slapi_Task *task = (Slapi_Task *)arg; - Slapi_Entry *e = NULL; - int result = SLAPI_DSE_CALLBACK_OK; -@@ -2527,6 +2563,12 @@ void automember_map_task_thread(void *arg){ - #endif - int rc = 0; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error( SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, -+ "automember_map_task_thread --> refcount incremented.\n" ); - td = (task_data *)slapi_task_get_data(task); - slapi_task_begin(task, 1); - slapi_task_log_notice(task, "Automember map task starting... Reading entries from (%s)" -@@ -2586,7 +2628,8 @@ void automember_map_task_thread(void *arg){ - if (slapi_dn_issuffix(slapi_entry_get_dn_const(e), config->scope) && - (slapi_filter_test_simple(e, config->filter) == 0)) - { -- if(automember_update_membership(config, e, ldif_fd_out)){ -+ if (slapi_is_shutting_down() || -+ automember_update_membership(config, e, ldif_fd_out)) { - result = SLAPI_DSE_CALLBACK_ERROR; - slapi_entry_free(e); - slapi_ch_free_string(&entrystr); -@@ -2620,6 +2663,9 @@ out: - } - slapi_task_inc_progress(task); - slapi_task_finish(task, result); -+ slapi_task_dec_refcount(task); -+ slapi_log_error( SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, -+ "automember_map_task_thread <-- refcount decremented.\n" ); - } - - /* -diff --git a/ldap/servers/plugins/linkedattrs/fixup_task.c b/ldap/servers/plugins/linkedattrs/fixup_task.c -index db3c693..3a01fed 100644 ---- a/ldap/servers/plugins/linkedattrs/fixup_task.c -+++ b/ldap/servers/plugins/linkedattrs/fixup_task.c -@@ -119,6 +119,10 @@ linked_attrs_fixup_task_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->linkdn); - slapi_ch_free_string(&mydata->bind_dn); -@@ -137,6 +141,12 @@ linked_attrs_fixup_task_thread(void *arg) - int found_config = 0; - int rc = 0; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, LINK_PLUGIN_SUBSYSTEM, -+ "linked_attrs_fixup_task_thread --> refcount incremented.\n" ); - /* Fetch our task data from the task */ - td = (task_data *)slapi_task_get_data(task); - -@@ -154,8 +164,8 @@ linked_attrs_fixup_task_thread(void *arg) - linked_attrs_read_lock(); - main_config = linked_attrs_get_config(); - if (!PR_CLIST_IS_EMPTY(main_config)) { -- struct configEntry *config_entry = NULL; -- PRCList *list = PR_LIST_HEAD(main_config); -+ struct configEntry *config_entry = NULL; -+ PRCList *list = PR_LIST_HEAD(main_config); - - while (list != main_config) { - config_entry = (struct configEntry *) list; -@@ -204,6 +214,10 @@ linked_attrs_fixup_task_thread(void *arg) - - /* this will queue the destruction of the task */ - slapi_task_finish(task, rc); -+ -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, LINK_PLUGIN_SUBSYSTEM, -+ "linked_attrs_fixup_task_thread <-- refcount decremented.\n"); - } - - static void -@@ -269,7 +283,7 @@ linked_attrs_fixup_links(struct configEntry *config) - if(rc == 0){ - slapi_back_transaction_commit(fixup_pb); - } else { -- slapi_back_transaction_abort(fixup_pb); -+ slapi_back_transaction_abort(fixup_pb); - } - slapi_pblock_destroy(fixup_pb); - } -@@ -352,11 +366,20 @@ linked_attrs_remove_backlinks_callback(Slapi_Entry *e, void *callback_data) - int rc = 0; - Slapi_DN *sdn = slapi_entry_get_sdn(e); - char *type = (char *)callback_data; -- Slapi_PBlock *pb = slapi_pblock_new(); -+ Slapi_PBlock *pb = NULL; - char *val[1]; - LDAPMod mod; - LDAPMod *mods[2]; - -+ /* -+ * If the server is ordered to shutdown, stop the fixup and return an error. -+ */ -+ if (slapi_is_shutting_down()) { -+ rc = -1; -+ goto bail; -+ } -+ -+ pb = slapi_pblock_new(); - /* Remove all values of the passed in type. */ - val[0] = 0; - -@@ -377,7 +400,7 @@ linked_attrs_remove_backlinks_callback(Slapi_Entry *e, void *callback_data) - slapi_modify_internal_pb(pb); - - slapi_pblock_destroy(pb); -- -+bail: - return rc; - } - -@@ -394,6 +417,13 @@ linked_attrs_add_backlinks_callback(Slapi_Entry *e, void *callback_data) - LDAPMod mod; - LDAPMod *mods[2]; - -+ /* -+ * If the server is ordered to shutdown, stop the fixup and return an error. -+ */ -+ if (slapi_is_shutting_down()) { -+ rc = -1; -+ goto done; -+ } - /* Setup the modify operation. Only the target will - * change, so we only need to do this once. */ - val[0] = linkdn; -diff --git a/ldap/servers/plugins/memberof/memberof.c b/ldap/servers/plugins/memberof/memberof.c -index 7e3e308..14bad98 100644 ---- a/ldap/servers/plugins/memberof/memberof.c -+++ b/ldap/servers/plugins/memberof/memberof.c -@@ -2636,6 +2636,12 @@ void memberof_fixup_task_thread(void *arg) - int rc = 0; - Slapi_PBlock *fixup_pb = NULL; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, MEMBEROF_PLUGIN_SUBSYSTEM, -+ "memberof_fixup_task_thread --> refcount incremented.\n" ); - /* Fetch our task data from the task */ - td = (task_data *)slapi_task_get_data(task); - -@@ -2702,6 +2708,9 @@ void memberof_fixup_task_thread(void *arg) - - /* this will queue the destruction of the task */ - slapi_task_finish(task, rc); -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, MEMBEROF_PLUGIN_SUBSYSTEM, -+ "memberof_fixup_task_thread <-- refcount decremented.\n"); - } - - /* extract a single value from the entry (as a string) -- if it's not in the -@@ -2793,8 +2802,14 @@ out: - void - memberof_task_destructor(Slapi_Task *task) - { -+ slapi_log_error( SLAPI_LOG_PLUGIN, MEMBEROF_PLUGIN_SUBSYSTEM, -+ "memberof_task_destructor -->\n" ); - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->dn); - slapi_ch_free_string(&mydata->bind_dn); -@@ -2803,6 +2818,8 @@ memberof_task_destructor(Slapi_Task *task) - slapi_ch_free((void **)&mydata); - } - } -+ slapi_log_error( SLAPI_LOG_PLUGIN, MEMBEROF_PLUGIN_SUBSYSTEM, -+ "memberof_task_destructor <--\n" ); - } - - int memberof_fix_memberof(MemberOfConfig *config, char *dn, char *filter_str) -@@ -2841,6 +2858,13 @@ int memberof_fix_memberof_callback(Slapi_Entry *e, void *callback_data) - memberof_del_dn_data del_data = {0, config->memberof_attr}; - Slapi_ValueSet *groups = 0; - -+ /* -+ * If the server is ordered to shutdown, stop the fixup and return an error. -+ */ -+ if (slapi_is_shutting_down()) { -+ rc = -1; -+ goto bail; -+ } - /* get a list of all of the groups this user belongs to */ - groups = memberof_get_groups(config, sdn); - -@@ -2889,6 +2913,6 @@ int memberof_fix_memberof_callback(Slapi_Entry *e, void *callback_data) - } - - slapi_valueset_free(groups); -- -+bail: - return rc; - } -diff --git a/ldap/servers/plugins/memberof/memberof.h b/ldap/servers/plugins/memberof/memberof.h -index 6d56081..59029d7 100644 ---- a/ldap/servers/plugins/memberof/memberof.h -+++ b/ldap/servers/plugins/memberof/memberof.h -@@ -81,7 +81,7 @@ typedef struct memberofconfig { - char *memberof_attr; - int allBackends; - Slapi_DN *entryScope; -- Slapi_DN *entryScopeExcludeSubtree; -+ Slapi_DN *entryScopeExcludeSubtree; - Slapi_Filter *group_filter; - Slapi_Attr **group_slapiattrs; - } MemberOfConfig; -diff --git a/ldap/servers/plugins/posix-winsync/posix-group-task.c b/ldap/servers/plugins/posix-winsync/posix-group-task.c -index c5ea729..c76545a 100644 ---- a/ldap/servers/plugins/posix-winsync/posix-group-task.c -+++ b/ldap/servers/plugins/posix-winsync/posix-group-task.c -@@ -165,6 +165,10 @@ posix_group_task_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *) slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->dn); - slapi_ch_free_string(&mydata->filter_str); -@@ -172,6 +176,8 @@ posix_group_task_destructor(Slapi_Task *task) - slapi_ch_free((void **) &mydata); - } - } -+ slapi_log_error(SLAPI_LOG_PLUGIN, POSIX_WINSYNC_PLUGIN_NAME, -+ "posix_group_task_destructor <--\n"); - } - - #if 0 /* NOT USED */ -@@ -245,17 +251,28 @@ posix_group_fix_memberuid_callback(Slapi_Entry *e, void *callback_data) - "_fix_memberuid ==>\n"); - cb_data *the_cb_data = (cb_data *) callback_data; - -- int rc; -+ int rc = 0; - Slapi_Attr *muid_attr = NULL; - Slapi_Value *v = NULL; - -- Slapi_Mods *smods = slapi_mods_new(); -- -- char *dn = slapi_entry_get_dn(e); -- Slapi_DN *sdn = slapi_entry_get_sdn(e); -+ Slapi_Mods *smods = NULL; -+ char *dn = NULL; -+ Slapi_DN *sdn = NULL; - LDAPMod **mods = NULL; - int is_posix_group = 0; - -+ /* -+ * If the server is ordered to shutdown, stop the fixup and return an error. -+ */ -+ if (slapi_is_shutting_down()) { -+ rc = -1; -+ goto bail; -+ } -+ -+ smods = slapi_mods_new(); -+ dn = slapi_entry_get_dn(e); -+ sdn = slapi_entry_get_sdn(e); -+ - if (hasObjectClass(e, "posixGroup")) { - is_posix_group = 1; - } -@@ -441,7 +458,7 @@ posix_group_fix_memberuid_callback(Slapi_Entry *e, void *callback_data) - slapi_pblock_destroy(mod_pb); - } - slapi_mods_free(&smods); -- -+bail: - slapi_log_error(SLAPI_LOG_PLUGIN, POSIX_WINSYNC_PLUGIN_NAME, - "_fix_memberuid <==\n"); - /* -@@ -450,7 +467,7 @@ posix_group_fix_memberuid_callback(Slapi_Entry *e, void *callback_data) - * uniqueMember attribute. But "not found" error shoud not - * be returned, which stops the further fixup task. - */ -- return 0; -+ return rc; - } - - static void -@@ -463,6 +480,12 @@ posix_group_fixup_task_thread(void *arg) - task_data *td = NULL; - int rc = 0; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, POSIX_WINSYNC_PLUGIN_NAME, -+ "posix_group_fixup_task_thread --> refcount incremented.\n" ); - /* Fetch our task data from the task */ - td = (task_data *) slapi_task_get_data(task); - -@@ -491,4 +514,7 @@ posix_group_fixup_task_thread(void *arg) - - slapi_log_error(SLAPI_LOG_PLUGIN, POSIX_WINSYNC_PLUGIN_NAME, - "_task_thread <==\n"); -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, POSIX_WINSYNC_PLUGIN_NAME, -+ "posix_group_fixup_task_thread <-- refcount decremented.\n"); - } -diff --git a/ldap/servers/plugins/replication/repl5_replica_config.c b/ldap/servers/plugins/replication/repl5_replica_config.c -index 3bc3916..1570ba7 100644 ---- a/ldap/servers/plugins/replication/repl5_replica_config.c -+++ b/ldap/servers/plugins/replication/repl5_replica_config.c -@@ -109,6 +109,8 @@ static CSN* replica_cleanallruv_find_maxcsn(Replica *replica, ReplicaId rid, cha - static int replica_cleanallruv_get_replica_maxcsn(Repl_Agmt *agmt, char *rid_text, char *basedn, CSN **csn); - static void preset_cleaned_rid(ReplicaId rid); - static multimaster_mtnode_extension * _replica_config_get_mtnode_ext (const Slapi_Entry *e); -+static void replica_cleanall_ruv_destructor(Slapi_Task *task); -+static void replica_cleanall_ruv_abort_destructor(Slapi_Task *task); - - /* - * Note: internal add/modify/delete operations should not be run while -@@ -1509,6 +1511,10 @@ replica_cleanall_ruv_task(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, - rc = SLAPI_DSE_CALLBACK_ERROR; - goto out; - } -+ -+ /* register our destructor for waiting the task is done */ -+ slapi_task_set_destructor_fn(task, replica_cleanall_ruv_destructor); -+ - /* - * Get our task settings - */ -@@ -1752,6 +1758,13 @@ replica_cleanallruv_thread(void *arg) - int aborted = 0; - int rc = 0; - -+ if (!data) { -+ return; /* no data */ -+ } -+ if (data->task) { -+ slapi_task_inc_refcount(data->task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, repl_plugin_name, "replica_cleanallruv_thread --> refcount incremented.\n"); -+ } - /* - * Initialize our settings - */ -@@ -1974,6 +1987,8 @@ done: - } - if(data->task){ - slapi_task_finish(data->task, rc); -+ slapi_task_dec_refcount(data->task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, repl_plugin_name, "replica_cleanallruv_thread <-- refcount decremented.\n"); - } - if(data->payload){ - ber_bvfree(data->payload); -@@ -1989,6 +2004,36 @@ done: - slapi_ch_free((void **)&data); - } - -+static void -+replica_cleanall_ruv_destructor(Slapi_Task *task) -+{ -+ slapi_log_error( SLAPI_LOG_PLUGIN, repl_plugin_name, -+ "replica_cleanall_ruv_destructor -->\n" ); -+ if (task) { -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } -+ } -+ slapi_log_error( SLAPI_LOG_PLUGIN, repl_plugin_name, -+ "replica_cleanall_ruv_destructor <--\n" ); -+} -+ -+static void -+replica_cleanall_ruv_abort_destructor(Slapi_Task *task) -+{ -+ slapi_log_error( SLAPI_LOG_PLUGIN, repl_plugin_name, -+ "replica_cleanall_ruv_abort_destructor -->\n" ); -+ if (task) { -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } -+ } -+ slapi_log_error( SLAPI_LOG_PLUGIN, repl_plugin_name, -+ "replica_cleanall_ruv_abort_destructor <--\n" ); -+} -+ - /* - * Loop over the agmts, and check if they are in the last phase of cleaning, meaning they have - * released cleanallruv data from the config -@@ -2775,6 +2820,10 @@ replica_cleanall_ruv_abort(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter - - /* allocate new task now */ - task = slapi_new_task(slapi_entry_get_ndn(e)); -+ -+ /* register our destructor for waiting the task is done */ -+ slapi_task_set_destructor_fn(task, replica_cleanall_ruv_abort_destructor); -+ - /* - * Get our task settings - */ -@@ -2921,6 +2970,13 @@ replica_abort_task_thread(void *arg) - int release_it = 0; - int count = 0, rc = 0; - -+ if (!data) { -+ return; /* no data */ -+ } -+ if (data->task) { -+ slapi_task_inc_refcount(data->task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, repl_plugin_name, "replica_abort_task_thread --> refcount incremented.\n"); -+ } - cleanruv_log(data->task, ABORT_CLEANALLRUV_ID, "Aborting task for rid(%d)...",data->rid); - - /* -@@ -3028,6 +3084,8 @@ done: - - if(data->task){ - slapi_task_finish(data->task, agmt_not_notified); -+ slapi_task_dec_refcount(data->task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, repl_plugin_name, "replica_abort_task_thread <-- refcount incremented.\n"); - } - if(data->repl_obj && release_it) - object_release(data->repl_obj); -diff --git a/ldap/servers/plugins/schema_reload/schema_reload.c b/ldap/servers/plugins/schema_reload/schema_reload.c -index b1a5bb8..25336fe 100644 ---- a/ldap/servers/plugins/schema_reload/schema_reload.c -+++ b/ldap/servers/plugins/schema_reload/schema_reload.c -@@ -86,6 +86,7 @@ static int schemareload_add(Slapi_PBlock *pb, Slapi_Entry *e, - void *arg); - static int schemareload_start(Slapi_PBlock *pb); - static int schemareload_close(Slapi_PBlock *pb); -+static void schemareload_destructor(Slapi_Task *task); - - /* - * Init function -@@ -159,6 +160,12 @@ schemareload_thread(void *arg) - int total_work = 2; - task_data *td = NULL; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, "schemareload", -+ "schemareload_thread --> refcount incremented.\n" ); - /* Fetch our task data from the task */ - td = (task_data *)slapi_task_get_data(task); - -@@ -174,7 +181,11 @@ schemareload_thread(void *arg) - rv = slapi_validate_schema_files(td->schemadir); - slapi_task_inc_progress(task); - -- if (LDAP_SUCCESS == rv) { -+ if (slapi_is_shutting_down()) { -+ slapi_task_log_notice(task, "Server is shuttoing down; Schema validation aborted."); -+ slapi_task_log_status(task, "Server is shuttoing down; Schema validation aborted."); -+ slapi_log_error(SLAPI_LOG_FATAL, "schemareload", "Server is shuttoing down; Schema validation aborted."); -+ } else if (LDAP_SUCCESS == rv) { - slapi_task_log_notice(task, "Schema validation passed."); - slapi_task_log_status(task, "Schema validation passed."); - slapi_log_error(SLAPI_LOG_FATAL, "schemareload", "Schema validation passed.\n"); -@@ -199,16 +210,18 @@ schemareload_thread(void *arg) - slapi_task_log_status(task, "Schema reload task failed."); - slapi_log_error(SLAPI_LOG_FATAL, "schemareload", "Schema reload task failed.\n"); - } -- PR_Unlock(schemareload_lock); - } else { - slapi_task_log_notice(task, "Schema validation failed."); - slapi_task_log_status(task, "Schema validation failed."); - slapi_log_error(SLAPI_LOG_FATAL, "schemareload", "Schema validation failed.\n"); -- PR_Unlock(schemareload_lock); - } -+ PR_Unlock(schemareload_lock); - - /* this will queue the destruction of the task */ - slapi_task_finish(task, rv); -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, "schemareload", -+ "schemareload_thread <-- refcount decremented.\n"); - } - - /* extract a single value from the entry (as a string) -- if it's not in the -@@ -233,6 +246,10 @@ schemareload_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->schemadir); - slapi_ch_free_string(&mydata->bind_dn); -diff --git a/ldap/servers/plugins/syntaxes/validate_task.c b/ldap/servers/plugins/syntaxes/validate_task.c -index 99f6309..71b4b7e 100644 ---- a/ldap/servers/plugins/syntaxes/validate_task.c -+++ b/ldap/servers/plugins/syntaxes/validate_task.c -@@ -179,6 +179,10 @@ syntax_validate_task_destructor(Slapi_Task *task) - { - if (task) { - task_data *mydata = (task_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } - if (mydata) { - slapi_ch_free_string(&mydata->dn); - slapi_ch_free_string(&mydata->filter_str); -@@ -197,6 +201,12 @@ syntax_validate_task_thread(void *arg) - task_data *td = NULL; - Slapi_PBlock *search_pb = slapi_pblock_new(); - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, SYNTAX_PLUGIN_SUBSYSTEM, -+ "syntax_validate_task_thread --> refcount incremented.\n" ); - /* Fetch our task data from the task */ - td = (task_data *)slapi_task_get_data(task); - -@@ -231,16 +241,26 @@ syntax_validate_task_thread(void *arg) - - /* this will queue the destruction of the task */ - slapi_task_finish(task, rc); -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, SYNTAX_PLUGIN_SUBSYSTEM, -+ "syntax_validate_task_thread <-- refcount decremented.\n"); - } - - static int - syntax_validate_task_callback(Slapi_Entry *e, void *callback_data) - { -- int rc = 0; -- char *dn = slapi_entry_get_dn(e); -+ int rc = 0; -+ char *dn = slapi_entry_get_dn(e); - task_data *td = (task_data *)callback_data; - Slapi_PBlock *pb = NULL; - -+ /* -+ * If the server is ordered to shutdown, stop the fixup and return an error. -+ */ -+ if (slapi_is_shutting_down()) { -+ rc = -1; -+ goto bail; -+ } - /* Override the syntax checking config to force syntax checking. */ - if (slapi_entry_syntax_check(NULL, e, 1) != 0) { - char *error_text = NULL; -@@ -261,7 +281,7 @@ syntax_validate_task_callback(Slapi_Entry *e, void *callback_data) - /* Keep a tally of the number of invalid entries found. */ - slapi_counter_increment(td->invalid_entries); - } -- -+bail: - return rc; - } - -diff --git a/ldap/servers/plugins/usn/usn_cleanup.c b/ldap/servers/plugins/usn/usn_cleanup.c -index c12dfd2..dd07b4c 100644 ---- a/ldap/servers/plugins/usn/usn_cleanup.c -+++ b/ldap/servers/plugins/usn/usn_cleanup.c -@@ -49,6 +49,8 @@ struct usn_cleanup_data { - - static int usn_cleanup_add(Slapi_PBlock *pb, Slapi_Entry *e, - Slapi_Entry *eAfter, int *returncode, char *returntext, void *arg); -+static void usn_cleanup_task_destructor(Slapi_Task *task); -+ - - int - usn_cleanup_start(Slapi_PBlock *pb) -@@ -83,8 +85,14 @@ usn_cleanup_thread(void *arg) - Slapi_PBlock *delete_pb = NULL; - char *filter = "objectclass=nsTombstone"; - -+ if (!task) { -+ return; /* no task */ -+ } - slapi_log_error(SLAPI_LOG_TRACE, USN_PLUGIN_SUBSYSTEM, - "--> usn_cleanup_thread\n"); -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, USN_PLUGIN_SUBSYSTEM, -+ "usn_cleanup_thread --> refcount incremented.\n" ); - - if (NULL == usn_get_identity()) { /* plugin is not initialized */ - slapi_task_log_notice(task, "USN plugin is not initialized\n"); -@@ -195,14 +203,12 @@ bail: - if (cleanup_data->maxusn_to_delete) { - slapi_ch_free_string(&filter); - } -- slapi_ch_free_string(&cleanup_data->maxusn_to_delete); -- slapi_ch_free_string(&cleanup_data->suffix); -- slapi_ch_free_string(&cleanup_data->bind_dn); -- slapi_ch_free((void **)&cleanup_data); - - /* this will queue the destruction of the task */ - slapi_task_finish(task, rv); -- -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, USN_PLUGIN_SUBSYSTEM, -+ "usn_cleanup_thread <-- refcount decremented.\n"); - slapi_log_error(SLAPI_LOG_TRACE, USN_PLUGIN_SUBSYSTEM, - "<-- usn_cleanup_thread\n"); - } -@@ -283,7 +289,7 @@ usn_cleanup_add(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, - backend = slapi_entry_attr_get_charptr(e, "backend"); - maxusn = slapi_entry_attr_get_charptr(e, "maxusn_to_delete"); - -- if (NULL == suffix && NULL == backend) { -+ if (!suffix && !backend) { - slapi_log_error(SLAPI_LOG_FATAL, USN_PLUGIN_SUBSYSTEM, - "USN tombstone cleanup: Both suffix and backend are missing.\n"); - *returncode = LDAP_PARAM_ERROR; -@@ -292,7 +298,7 @@ usn_cleanup_add(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, - } - - /* suffix is not given, but backend is; get the suffix */ -- if (NULL == suffix && NULL != backend) { -+ if (!suffix && backend) { - be = slapi_be_select_by_instance_name(backend); - be_suffix = slapi_be_getsuffix(be, 0); - if (be_suffix) { -@@ -317,12 +323,6 @@ usn_cleanup_add(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, - goto bail; - } - -- cleanup_data = -- (struct usn_cleanup_data *)slapi_ch_malloc(sizeof(struct usn_cleanup_data)); -- cleanup_data->suffix = slapi_ch_strdup(suffix); -- cleanup_data->maxusn_to_delete = slapi_ch_strdup(maxusn); -- cleanup_data->bind_dn = slapi_ch_strdup(bind_dn); -- - /* allocate new task now */ - task = slapi_plugin_new_task(slapi_entry_get_ndn(e), arg); - if (task == NULL) { -@@ -330,11 +330,21 @@ usn_cleanup_add(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, - "USN tombstone cleanup: unable to allocate new task.\n"); - *returncode = LDAP_OPERATIONS_ERROR; - rv = SLAPI_DSE_CALLBACK_ERROR; -- slapi_ch_free((void**)&cleanup_data); - goto bail; - } - -+ /* register our destructor for cleaning up our private data */ -+ slapi_task_set_destructor_fn(task, usn_cleanup_task_destructor); -+ - /* Stash our argument in the task for use by the task thread */ -+ cleanup_data = -+ (struct usn_cleanup_data *)slapi_ch_malloc(sizeof(struct usn_cleanup_data)); -+ cleanup_data->suffix = suffix; -+ suffix = NULL; /* don't free in this function */ -+ cleanup_data->maxusn_to_delete = maxusn; -+ maxusn = NULL; /* don't free in this function */ -+ cleanup_data->bind_dn = bind_dn; -+ bind_dn = NULL; /* don't free in this function */ - slapi_task_set_data(task, cleanup_data); - - /* start the USN tombstone cleanup task as a separate thread */ -@@ -361,3 +371,23 @@ bail: - return rv; - } - -+static void -+usn_cleanup_task_destructor(Slapi_Task *task) -+{ -+ slapi_log_error(SLAPI_LOG_PLUGIN, USN_PLUGIN_SUBSYSTEM, "usn_cleanup_task_destructor -->\n"); -+ if (task) { -+ struct usn_cleanup_data *mydata = (struct usn_cleanup_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } -+ if (mydata) { -+ slapi_ch_free_string(&mydata->suffix); -+ slapi_ch_free_string(&mydata->maxusn_to_delete); -+ slapi_ch_free_string(&mydata->bind_dn); -+ /* Need to cast to avoid a compiler warning */ -+ slapi_ch_free((void **)&mydata); -+ } -+ } -+ slapi_log_error(SLAPI_LOG_PLUGIN, USN_PLUGIN_SUBSYSTEM, "usn_cleanup_task_destructor <--\n"); -+} -diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h -index 0ae3601..dfe75eb 100644 ---- a/ldap/servers/slapd/slapi-plugin.h -+++ b/ldap/servers/slapd/slapi-plugin.h -@@ -7958,6 +7958,15 @@ void slapi_plugin_op_finished(void *arg); - #define RDN_IS_CONFLICT 0x2 - int slapi_is_special_rdn(const char *rdn, int flag); - -+/** -+ * Sleeps for PRIntervalTime ticks defined in NSPR library -+ * -+ * \param PRIntervalTime ticks -+ * -+ * \return Nothing -+ */ -+void DS_Sleep(PRIntervalTime ticks); -+ - #ifdef __cplusplus - } - #endif -diff --git a/ldap/servers/slapd/slapi-private.h b/ldap/servers/slapd/slapi-private.h -index 921c397..9ca1950 100644 ---- a/ldap/servers/slapd/slapi-private.h -+++ b/ldap/servers/slapd/slapi-private.h -@@ -1245,8 +1245,6 @@ void bervalarray_add_berval_fast(struct berval ***vals, const struct berval *add - - /***** End of items added for the replication plugin. ***********************/ - --void DS_Sleep(PRIntervalTime ticks); -- - /* macro to specify the behavior of upgradedb & upgradednformat */ - #define SLAPI_UPGRADEDB_FORCE 0x1 /* reindex all (no check w/ idl switch) */ - #define SLAPI_UPGRADEDB_SKIPINIT 0x2 /* call upgradedb as part of other op */ -diff --git a/ldap/servers/slapd/task.c b/ldap/servers/slapd/task.c -index 98ec88c..19a52a3 100644 ---- a/ldap/servers/slapd/task.c -+++ b/ldap/servers/slapd/task.c -@@ -113,6 +113,8 @@ static const char *fetch_attr(Slapi_Entry *e, const char *attrname, - static Slapi_Entry *get_internal_entry(Slapi_PBlock *pb, char *dn); - static void modify_internal_entry(char *dn, LDAPMod **mods); - -+static void fixup_tombstone_task_destructor(Slapi_Task *task); -+ - /*********************************** - * Public Functions - ***********************************/ -@@ -2218,6 +2220,12 @@ task_fixup_tombstone_thread(void *arg) - int fixup_count = 0; - int rc, i, j; - -+ if (!task) { -+ return; /* no task */ -+ } -+ slapi_task_inc_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, TASK_TOMBSTONE_FIXUP, -+ "fixup_tombstone_task_thread --> refcount incremented.\n" ); - slapi_task_begin(task, 1); - slapi_task_log_notice(task, "Beginning tombstone fixup task...\n"); - slapi_log_error(SLAPI_LOG_REPL, TASK_TOMBSTONE_FIXUP, -@@ -2233,8 +2241,14 @@ task_fixup_tombstone_thread(void *arg) - - /* Okay check the specified backends only */ - for(i = 0; base && base[i]; i++){ -- Slapi_PBlock *search_pb = slapi_pblock_new(); -+ Slapi_PBlock *search_pb = NULL; -+ -+ if (slapi_is_shutting_down()) { -+ rc = -1; -+ goto bail; -+ } - -+ search_pb = slapi_pblock_new(); - /* find entries that need fixing... */ - slapi_search_internal_set_pb(search_pb, base[i], LDAP_SCOPE_SUBTREE, - filter, NULL, 0, NULL, NULL, plugin_get_default_component_id(), 0); -@@ -2247,8 +2261,7 @@ task_fixup_tombstone_thread(void *arg) - slapi_log_error(SLAPI_LOG_REPL, TASK_TOMBSTONE_FIXUP, - "Failed to search backend for tombstones, error %d\n", rc); - slapi_pblock_destroy(search_pb); -- slapi_task_finish(task, rc); -- return; -+ goto bail; - } - - slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entries); -@@ -2281,9 +2294,11 @@ task_fixup_tombstone_thread(void *arg) - slapi_log_error(SLAPI_LOG_REPL, TASK_TOMBSTONE_FIXUP, "%s %d tombstones.\n", - task_data->stripcsn ? "Stripped" : "Fixed", fixup_count); - slapi_task_inc_progress(task); -+bail: - slapi_task_finish(task, rc); -- slapi_ch_array_free(base); -- slapi_ch_free((void **)&task_data); -+ slapi_task_dec_refcount(task); -+ slapi_log_error(SLAPI_LOG_PLUGIN, TASK_TOMBSTONE_FIXUP, -+ "fixup_tombstone_task_thread <-- refcount decremented.\n" ); - } - - -@@ -2387,6 +2402,8 @@ task_fixup_tombstones_add(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *eAfter, - } - - task = slapi_new_task(slapi_entry_get_ndn(e)); -+ /* register our destructor for cleaning up our private data */ -+ slapi_task_set_destructor_fn(task, fixup_tombstone_task_destructor); - task_data = (struct task_tombstone_data *)slapi_ch_calloc(1, sizeof(struct task_tombstone_data)); - task_data->base = base; - task_data->task = task; -@@ -2422,6 +2439,26 @@ done: - return SLAPI_DSE_CALLBACK_OK; - } - -+static void -+fixup_tombstone_task_destructor(Slapi_Task *task) -+{ -+ slapi_log_error(SLAPI_LOG_PLUGIN, TASK_TOMBSTONE_FIXUP, -+ "fixup_tombstone_task_destructor -->\n" ); -+ if (task) { -+ struct task_tombstone_data *mydata = (struct task_tombstone_data *)slapi_task_get_data(task); -+ while (slapi_task_get_refcount(task) > 0) { -+ /* Yield to wait for the fixup task finishes. */ -+ DS_Sleep (PR_MillisecondsToInterval(100)); -+ } -+ if (mydata) { -+ slapi_ch_array_free(mydata->base); -+ slapi_ch_free((void **)&mydata); -+ } -+ } -+ slapi_log_error(SLAPI_LOG_PLUGIN, TASK_TOMBSTONE_FIXUP, -+ "fixup_tombstone_task_destructor <--\n" ); -+} -+ - /* cleanup old tasks that may still be in the DSE from a previous session - * (this can happen if the server crashes [no matter how unlikely we like - * to think that is].) --- -1.9.3 - diff --git a/SPECS/389-ds-base.spec b/SPECS/389-ds-base.spec index 6ca4a58..b9fcb60 100644 --- a/SPECS/389-ds-base.spec +++ b/SPECS/389-ds-base.spec @@ -25,7 +25,7 @@ Summary: 389 Directory Server (base) Name: 389-ds-base Version: 1.3.3.1 -Release: %{?relprefix}15%{?prerel}%{?dist} +Release: %{?relprefix}13%{?prerel}%{?dist} License: GPLv2 with exceptions URL: http://port389.org/ Group: System Environment/Daemons @@ -175,7 +175,6 @@ Patch57: 0057-Ticket-47989-Windows-Sync-accidentally-cleared-raw_e.patc Patch58: 0058-Ticket-47991-upgrade-script-fails-if-etc-and-var-are.patch Patch59: 0059-Ticket-47988-Schema-learning-mechanism-in-replicatio.patch Patch60: 0060-Ticket-47988-Schema-learning-mechanism-in-replicatio.patch -Patch61: 0061-Ticket-48005-ns-slapd-crash-in-shutdown-phase.patch %description 389 Directory Server is an LDAPv3 compliant server. The base package includes @@ -287,7 +286,6 @@ cp %{SOURCE2} README.devel %patch58 -p1 %patch59 -p1 %patch60 -p1 -%patch61 -p1 %build %if %{use_openldap} @@ -350,44 +348,35 @@ ninst=0 # number of instances found in total if [ -n "$DEBUGPOSTTRANS" ] ; then output=$DEBUGPOSTTRANS fi -echo looking for services in %{_sysconfdir}/systemd/system/%{groupname}.wants/* >> $output 2>&1 || : +echo looking for services in %{_sysconfdir}/systemd/system/%{groupname}.wants/* > $output 2>&1 || : for service in %{_sysconfdir}/systemd/system/%{groupname}.wants/* ; do if [ ! -f "$service" ] ; then continue ; fi # in case nothing matches inst=`echo $service | sed -e 's,%{_sysconfdir}/systemd/system/%{groupname}.wants/,,'` - echo found instance $inst - getting status >> $output 2>&1 || : + echo found instance $inst - getting status > $output 2>&1 || : if /bin/systemctl -q is-active $inst ; then - echo instance $inst is running >> $output 2>&1 || : + echo instance $inst is running > $output 2>&1 || : instances="$instances $inst" else - echo instance $inst is not running >> $output 2>&1 || : + echo instance $inst is not running > $output 2>&1 || : fi ninst=`expr $ninst + 1` done if [ $ninst -eq 0 ] ; then - echo no instances to upgrade >> $output 2>&1 || : + echo no instances to upgrade > $output 2>&1 || : exit 0 # have no instances to upgrade - just skip the rest fi # shutdown all instances -echo shutting down all instances . . . >> $output 2>&1 || : -for inst in $instances ; do - echo stopping instance $inst >> $output 2>&1 || : - /bin/systemctl stop $inst >> $output 2>&1 || : -done -echo remove pid files . . . >> $output 2>&1 || : +echo shutting down all instances . . . > $output 2>&1 || : +/bin/systemctl stop %{groupname} > $output 2>&1 || : +echo remove pid files . . . > $output 2>&1 || : /bin/rm -f /var/run/%{pkgname}*.pid /var/run/%{pkgname}*.startpid # do the upgrade -echo upgrading instances . . . >> $output 2>&1 || : -DEBUGPOSTSETUPOPT=`/usr/bin/echo $DEBUGPOSTSETUP | /usr/bin/sed -e "s/[^d]//g"` -if [ -n "$DEBUGPOSTSETUPOPT" ] ; then - %{_sbindir}/setup-ds.pl -l $output -$DEBUGPOSTSETUPOPT -u -s General.UpdateMode=offline >> $output 2>&1 || : -else - %{_sbindir}/setup-ds.pl -l $output -u -s General.UpdateMode=offline >> $output 2>&1 || : -fi - +echo upgrading instances . . . > $output 2>&1 || : +%{_sbindir}/setup-ds.pl -l $output -u -s General.UpdateMode=offline > $output 2>&1 || : # restart instances that require it for inst in $instances ; do - echo restarting instance $inst >> $output 2>&1 || : - /bin/systemctl start $inst >> $output 2>&1 || : + echo restarting instance $inst > $output 2>&1 || : + /bin/systemctl start $inst > $output 2>&1 || : done exit 0 @@ -448,16 +437,6 @@ fi %{_libdir}/%{pkgname}/libns-dshttpd.so* %changelog -* Mon Feb 23 2015 Noriko Hosoi - 1.3.3.1-15 -- release 1.3.3.1-15 -- Setting correct build tag 'rhel-7.1-z-candidate' - -* Mon Feb 23 2015 Noriko Hosoi - 1.3.3.1-14 -- release 1.3.3.1-14 -- Resolves: bug 1189154 - DNS errors after IPA upgrade due to broken ReplSync (DS 48030) - Fixes spec file to make sure all the server instances are stopped before upgrade -- Resolves: bug 1186548 - ns-slapd crash in shutdown phase (DS 48005) - * Sun Jan 25 2015 Noriko Hosoi - 1.3.3.1-13 - release 1.3.3.1-13 - Resolves: bug 1183655 - Fixed Covscan FORWARD_NULL defects (DS 47988)