public inbox for lvm2-cvs@sourceware.org
help / color / mirror / Atom feed
* LVM2/daemons/lvmetad Makefile lvmetad-core.c t ...
@ 2011-07-19 16:48 mornfall
  0 siblings, 0 replies; only message in thread
From: mornfall @ 2011-07-19 16:48 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	mornfall@sourceware.org	2011-07-19 16:48:14

Modified files:
	daemons/lvmetad: Makefile lvmetad-core.c test.sh testclient.c 

Log message:
	Work out some more details in metadata update in lvmetad.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/Makefile.diff?cvsroot=lvm2&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/lvmetad-core.c.diff?cvsroot=lvm2&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/test.sh.diff?cvsroot=lvm2&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/testclient.c.diff?cvsroot=lvm2&r1=1.7&r2=1.8

--- LVM2/daemons/lvmetad/Makefile	2011/06/27 13:44:33	1.2
+++ LVM2/daemons/lvmetad/Makefile	2011/07/19 16:48:13	1.3
@@ -28,3 +28,6 @@
 
 check: testclient lvmetad
 	./test.sh "$(BUILDDIR)/libdm:$(BUILDDIR)/daemons/dmeventd"
+
+clean:
+	rm -f testclient lvmetad
--- LVM2/daemons/lvmetad/lvmetad-core.c	2011/07/19 14:13:59	1.7
+++ LVM2/daemons/lvmetad/lvmetad-core.c	2011/07/19 16:48:13	1.8
@@ -18,10 +18,11 @@
 {
 	const char *uuid = daemon_request_str(r, "uuid", "NONE");
 	fprintf(stderr, "[D] vg_by_uuid: %s (vgs = %p)\n", uuid, s->vgs);
-	struct config_node *metadata = dm_hash_lookup(s->vgs, uuid);
-	if (!metadata)
+	struct config_tree *cft = dm_hash_lookup(s->vgs, uuid);
+	if (!cft || !cft->root)
 		return daemon_reply_simple("failed", "reason = %s", "uuid not found", NULL);
-	fprintf(stderr, "[D] metadata: %p\n", metadata);
+
+	struct config_node *metadata = cft->root;
 
 	response res = { .buffer = NULL };
 	struct config_node *n;
@@ -67,16 +68,16 @@
 	if (pvid) {
 		const char *vgid = dm_hash_lookup(s->pvid_to_vgid, pvid);
 		assert(vgid);
-		struct config_node *vg = dm_hash_lookup(s->vgs, vgid);
+		struct config_tree *vg = dm_hash_lookup(s->vgs, vgid);
 		assert(vg);
-		update_pv_status_in_vg(s, vg);
+		update_pv_status_in_vg(s, vg->root);
 	} else {
 		struct dm_hash_node *n = dm_hash_get_first(s->vgs);
 		while (n) {
-			struct config_node *vg = dm_hash_get_data(s->vgs, n);
+			struct config_tree *vg = dm_hash_get_data(s->vgs, n);
 			fprintf(stderr, "[D] checking VG: %s\n",
 				find_config_str(vg, "metadata/id", "?"));
-			update_pv_status_in_vg(s, vg);
+			update_pv_status_in_vg(s, vg->root);
 			n = dm_hash_get_next(s->vgs, n);
 		}
 	}
@@ -84,11 +85,38 @@
 
 static int update_metadata(lvmetad_state *s, const char *vgid, struct config_node *metadata)
 {
-	struct config_node *metadata_clone =
-		clone_config_node_with_mem(s->mem, metadata, 0);
-	/* TODO: seqno-based comparison with existing metadata version */
-	dm_hash_insert(s->vgs, vgid, (void*) metadata_clone);
-	fprintf(stderr, "[D] metadata stored at %p\n", metadata_clone);
+	struct config_tree *old = dm_hash_lookup(s->vgs, vgid);
+	int seq = find_config_int(metadata, "metadata/seqno", -1);
+	int haveseq = -1;
+
+	if (old)
+		haveseq = find_config_int(old->root, "metadata/seqno", -1);
+
+	if (seq < 0)
+		return 0; /* bad */
+
+	if (seq == haveseq) {
+		// TODO: compare old->root with metadata to ensure equality
+		return 1;
+	}
+
+	if (seq < haveseq) {
+		// TODO: we may want to notify the client that their metadata is
+		// out of date?
+		return 1;
+	}
+
+	if (haveseq >= 0 && haveseq < seq) {
+		/* need to update what we have since we found a newer version */
+		destroy_config_tree(old);
+		dm_hash_remove(s->vgs, vgid);
+	}
+
+	struct config_tree *cft = create_config_tree(NULL, 0);
+	cft->root = clone_config_node(cft, metadata, 0);
+	dm_hash_insert(s->vgs, vgid, cft);
+
+	return 1;
 }
 
 static response pv_add(lvmetad_state *s, request r)
@@ -106,8 +134,12 @@
 		const char *vgid = daemon_request_str(r, "metadata/id", NULL);
 		if (!vgid)
 			return daemon_reply_simple("failed", "reason = %s", "need VG UUID", NULL);
+		if (daemon_request_int(r, "metadata/seqno", -1) < 0)
+			return daemon_reply_simple("failed", "reason = %s", "need VG seqno", NULL);
 
-		update_metadata(s, vgid, metadata);
+		if (!update_metadata(s, vgid, metadata))
+			return daemon_reply_simple("failed", "reason = %s",
+						   "metadata update failed", NULL);
 	}
 
 	update_pv_status(s, NULL);
--- LVM2/daemons/lvmetad/test.sh	2011/06/27 13:44:33	1.1
+++ LVM2/daemons/lvmetad/test.sh	2011/07/19 16:48:13	1.2
@@ -3,9 +3,11 @@
 export LD_LIBRARY_PATH="$1"
 
 test -n "$2" && {
-    ./lvmetad -f &
+    rm -f /var/run/lvmetad.{socket,pid}
+    chmod +rx lvmetad
+    valgrind ./lvmetad -f &
     PID=$!
-    sleep .1
+    sleep 1
     ./testclient
     kill $PID
     exit 0
--- LVM2/daemons/lvmetad/testclient.c	2011/07/18 14:48:30	1.7
+++ LVM2/daemons/lvmetad/testclient.c	2011/07/19 16:48:13	1.8
@@ -17,6 +17,9 @@
 	"    pv1 {\n"
 	"        id = \"bbcd-efgh\"\n"
 	"    }\n"
+	"    pv2 {\n"
+	"        id = \"cbcd-efgh\"\n"
+	"    }\n"
 	"}\n"
 	"}\n";
 


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-07-19 16:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-19 16:48 LVM2/daemons/lvmetad Makefile lvmetad-core.c t mornfall

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).