Bladeren bron

Handle sync and service unload correctly

When sync started and service is unloaded in meantime, it can happen that
sync will call sync_* functions on unloaded service.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto@redhat.com>
(cherry picked from commit 6f6988afff632c6c5068becc855aa4a37a656183)
Jan Friesse 13 jaren geleden
bovenliggende
commit
ffa3f5b7d7
2 gewijzigde bestanden met toevoegingen van 22 en 7 verwijderingen
  1. 4 0
      exec/main.c
  2. 18 7
      exec/sync.c

+ 4 - 0
exec/main.c

@@ -264,6 +264,10 @@ static int corosync_sync_callbacks_retrieve (
 		return (-1);
 	}
 
+	if (callbacks == NULL) {
+		return (0);
+	}
+
 	callbacks->name = corosync_service[service_id]->name;
 
 	callbacks->sync_init = corosync_service[service_id]->sync_init;

+ 18 - 7
exec/sync.c

@@ -231,7 +231,10 @@ static void sync_barrier_handler (unsigned int nodeid, const void *msg)
 		log_printf (LOGSYS_LEVEL_DEBUG, "Committing synchronization for %s",
 			my_service_list[my_processing_idx].name);
 		my_service_list[my_processing_idx].state = ACTIVATE;
-		my_service_list[my_processing_idx].sync_activate ();
+
+		if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) {
+			my_service_list[my_processing_idx].sync_activate ();
+		}
 
 		my_processing_idx += 1;
 		if (my_service_list_entries == my_processing_idx) {
@@ -544,14 +547,20 @@ static int schedwrk_processor (const void *context)
 			}
 		}
 
-		my_service_list[my_processing_idx].sync_init (my_trans_list,
-			my_trans_list_entries, my_member_list,
-			my_member_list_entries,
-			&my_ring_id);
+		if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) {
+			my_service_list[my_processing_idx].sync_init (my_trans_list,
+				my_trans_list_entries, my_member_list,
+				my_member_list_entries,
+				&my_ring_id);
+		}
 	}
 	if (my_service_list[my_processing_idx].state == PROCESS) {
 		my_service_list[my_processing_idx].state = PROCESS;
-		res = my_service_list[my_processing_idx].sync_process ();
+		if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) {
+			res = my_service_list[my_processing_idx].sync_process ();
+		} else {
+			res = 0;
+		}
 		if (res == 0) {
 			sync_barrier_enter();
 		} else {
@@ -595,7 +604,9 @@ void sync_abort (void)
 	ENTER();
 	if (my_state == SYNC_PROCESS) {
 		schedwrk_destroy (my_schedwrk_handle);
-		my_service_list[my_processing_idx].sync_abort ();
+		if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) {
+			my_service_list[my_processing_idx].sync_abort ();
+		}
 	}
 
 	/* this will cause any "old" barrier messages from causing