[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Cluster-devel] cluster/cmirror-kernel/src dm-cmirror-client.c



CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	STABLE
Changes by:	jbrassow sourceware org	2006-07-07 17:09:54

Modified files:
	cmirror-kernel/src: dm-cmirror-client.c 

Log message:
	- If a cluster mirror was removed, and a new one created fast enough, the
	processes could overlap such that the creation would fail to register
	with cman because the remove hadn't unregistered yet (-EEXIST)

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-client.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.4.3&r2=1.1.4.4

--- cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c	2006/06/29 19:49:32	1.1.4.3
+++ cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c	2006/07/07 17:09:54	1.1.4.4
@@ -1222,26 +1222,31 @@
 };
 
 static int mirror_set_count = 0; /* used to prevent multiple cluster [dis]connects */
+static DECLARE_MUTEX(cmirror_register_lock);
 
 static int cluster_connect(void)
 {
-	int r;
+	int r = 0;
 
-	if (mirror_set_count++)
-		return 0;
+	down(&cmirror_register_lock);
+
+	if (mirror_set_count++) {
+		up(&cmirror_register_lock);
+		goto out;
+	}
 
 	r = kcl_register_service("clustered_log", 13, SERVICE_LEVEL_GDLM, &clog_ops,
 				 1, NULL, &local_id);
 	if (r) {
-		DMWARN("Couldn't register clustered_log service");
-		return r;
+		DMWARN("Couldn't register clustered_log service.  Reason: %d", r);
+		goto out;
 	}
 
 	r = start_server();
 	if(r){
 		DMWARN("Unable to start clustered log server daemon");
 		kcl_unregister_service(local_id);
-		return r;
+		goto out;
 	}
 
 	r = kcl_join_service(local_id);
@@ -1252,13 +1257,19 @@
 		kcl_unregister_service(local_id);
 	}
 
+out:
+	up(&cmirror_register_lock);
 	return r;
 }
 
 static int cluster_disconnect(void)
 {
-	if (--mirror_set_count)
+	down(&cmirror_register_lock);
+
+	if (--mirror_set_count) {
+		up(&cmirror_register_lock);
 		return 0;
+	}
 
 	/* By setting 'shutting_down', the server will not be suspended **
 	** when a stop is received */
@@ -1267,6 +1278,7 @@
 	stop_server();
 	kcl_unregister_service(local_id);
 
+	up(&cmirror_register_lock);
 	return 0;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]