[Cluster-devel] cluster/cman/qdisk Makefile README disk.c disk ...

lhh at sourceware.org lhh at sourceware.org
Fri Jun 23 16:01:05 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL4
Changes by:	lhh at sourceware.org	2006-06-23 16:01:02

Modified files:
	cman/qdisk     : Makefile README disk.c disk.h main.c 
Added files:
	cman/qdisk     : mkqdisk.c proc.c 

Log message:
	Implements 'label' support for qdisk.  Uses /proc/partitions for device
	info & scans devices for signatures.  Useful in environments where a
	device is present but maybe numbered differently on different nodes
	depending on the host/SAN configuration.
	
	Also adds initialization utility which must be run before qdiskd will
	use a given partition.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/mkqdisk.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/proc.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/README.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/disk.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.2&r2=1.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/disk.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/main.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.1&r2=1.1.2.2

--- cluster/cman/qdisk/Makefile	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/Makefile	2006/06/23 16:01:02	1.1.2.2
@@ -19,26 +19,31 @@
 CFLAGS +=-I${incdir} -I${top_srcdir}/config \
          -Wall -Werror -Wstrict-prototypes -Wshadow -D_GNU_SOURCE -g
 
-TARGET=qdiskd
+TARGET=qdiskd mkqdisk
 
 all: ${TARGET}
 
 copytobin: all
 	cp ${TARGET} ${top_srcdir}/bin
 
-install: qdiskd
+install: ${TARGET}
 	install -d ${sbindir}
-	install qdiskd ${sbindir}
+	install ${TARGET} ${sbindir}
 
 qdiskd: disk.o crc32.o disk_util.o main.o score.o bitmap.o clulog.o \
-	gettid.o ../lib/libcman.a
+	gettid.o proc.o ../lib/libcman.a
 	gcc -o $@ $^ -lpthread -L../lib -lccs
 
+mkqdisk: disk.o crc32.o disk_util.o \
+	 proc.o mkqdisk.o
+	gcc -o $@ $^ 
+
+
 %.o: %.c
 	$(CC) -c -o $@ $^ $(INCLUDES) $(CFLAGS)
 
 clean:
-	rm -f *.o qdiskd
+	rm -f *.o ${TARGET}
 
 uninstall:
-	${UNINSTALL} qdiskd ${sbindir}
+	${UNINSTALL} ${TARGET} ${sbindir}
--- cluster/cman/qdisk/README	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/README	2006/06/23 16:01:02	1.1.2.2
@@ -213,8 +213,16 @@
     min_score="3"	  Absolute minimum score to be consider one's
 			  self "alive".  If omitted, or set to 0, the
 			  default function "floor((n+1)/2)" is used.
-    device="/dev/sda1"/>  This is the device the quorum daemon will use.
+    device="/dev/sda1"    This is the device the quorum daemon will use.
 			  This device must be the same on all nodes.
+    label="mylabel"/>     This overrides the device field if present.
+			  If specified, the quorum daemon will read
+			  /proc/partitions and check for qdisk signatures
+			  on every block device found, comparing the label
+			  against the specified label.  This is useful in
+			  configurations where the block device name
+			  differs on a per-node basis.
+
 
 3.2.  The <heuristic> tag
 
@@ -249,3 +257,18 @@
 * The worst-case for improperly configured quorum heuristics is a race
 to fence where two partitions simultaneously try to kill each other.
 
+3.5. Creating a quorum disk partition
+
+3.5.1. The mkqdisk utility.
+
+The mkqdisk utility can create and list currently configured quorum disks
+visible to the local node.
+
+  mkqdisk -L		List available quorum disks.
+
+  mkqdisk -f <label>	Find a quorum device by the given label.
+
+  mkqdisk -c <device> -l <label>
+			Initialize <device> and name it <label>.  This
+			will destroy all data on the device, so be careful
+			when running this command.
--- cluster/cman/qdisk/disk.c	2006/05/22 17:32:42	1.1.2.2
+++ cluster/cman/qdisk/disk.c	2006/06/23 16:01:02	1.1.2.3
@@ -336,7 +336,8 @@
 		       "diskRawReadShadow: can't seek to offset %d.\n",
 		       (int) readOffset);
 #endif
-		return ENODATA;
+		errno = ENODATA;
+		return -1;
 	}
 
 	ret = diskRawRead(fd, buf, len);
@@ -345,7 +346,8 @@
 		fprintf(stderr, "diskRawReadShadow: aligned read "
 		       "returned %d, not %d.\n", ret, len);
 #endif
-		return ENODATA;
+		errno = ENODATA;
+		return -1;
 	}
 
 	/* Decode the header portion so we can run a checksum on it. */
@@ -360,7 +362,8 @@
 		       "fd = %d offset = %d len = %d\n", fd,
 		       (int) readOffset, len);
 #endif
-		return EPROTO;
+		errno = EPROTO;
+		return -1;
 	}
 
 	return 0;
@@ -655,7 +658,7 @@
 
 
 static int
-header_init(int fd, char *clustername)
+header_init(int fd, char *label)
 {
 	quorum_header_t qh;
 
@@ -675,6 +678,9 @@
 		return -1;
 	}
 
+	/* Copy in the cluster/label name */
+	snprintf(qh.qh_cluster, sizeof(qh.qh_cluster)-1, label);
+
 	if ((qh.qh_timestamp = (uint64_t)time(NULL)) <= 0) {
 		perror("time");
 		return -1;
@@ -691,7 +697,7 @@
 
 
 int
-qdisk_init(char *partname, char *clustername)
+qdisk_init(char *partname, char *label)
 {
 	int fd;
 	status_block_t ps, wps;
@@ -710,7 +716,7 @@
 		return -1;
 	}
 
-	if (header_init(fd, clustername) < 0) {
+	if (header_init(fd, label) < 0) {
 		return -1;
 	}
 
--- cluster/cman/qdisk/disk.h	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/disk.h	2006/06/23 16:01:02	1.1.2.2
@@ -238,6 +238,7 @@
 	int qc_unused;
 	cman_handle_t qc_ch;
 	char *qc_device;
+	char *qc_label;
 	char *qc_status_file;
 } qd_ctx;
 
@@ -259,4 +260,10 @@
 int qd_init(qd_ctx *ctx, cman_handle_t ch, int me);
 void qd_destroy(qd_ctx *ctx);
 
+/* proc.c */
+int find_partitions(const char *partfile, const char *label,
+		    char *devname, size_t devlen, int print);
+int check_device(char *device, char *label, quorum_header_t *qh);
+
+
 #endif
--- cluster/cman/qdisk/main.c	2006/05/18 14:52:49	1.1.2.1
+++ cluster/cman/qdisk/main.c	2006/06/23 16:01:02	1.1.2.2
@@ -880,6 +880,12 @@
 		ctx->qc_device = val;
 	}
 
+	/* Get label (overrides device) */
+	snprintf(query, sizeof(query), "/cluster/quorumd/@label");
+	if (ccs_get(ccsfd, query, &val) == 0) {
+		ctx->qc_label = val;
+	}
+
 	/* Get status file */
 	snprintf(query, sizeof(query), "/cluster/quorumd/@status_file");
 	if (ccs_get(ccsfd, query, &val) == 0) {
@@ -917,6 +923,7 @@
 	node_info_t ni[MAX_NODES_DISK];
 	struct h_data h[10];
 	char debug = 0, foreground = 0;
+	char device[128];
 
 	while ((rv = getopt(argc, argv, "fd")) != EOF) {
 		switch (rv) {
@@ -958,6 +965,32 @@
 		return -1;
 	}
 
+	if (ctx.qc_label) {
+		if (find_partitions("/proc/partitions",
+				    ctx.qc_label, device,
+				    sizeof(device), 0) != 0) {
+			clulog_and_print(LOG_CRIT, "Unable to match label"
+					 " '%s' to any device\n",
+					 ctx.qc_label);
+			return -1;
+		}
+
+		if (ctx.qc_device)
+			free(ctx.qc_device);
+
+		ctx.qc_device = strdup(device);
+
+		clulog(LOG_INFO, "Quorum Partition: %s Label: %s\n",
+		       ctx.qc_device, ctx.qc_label);
+	} else if (ctx.qc_device) {
+		if (check_device(ctx.qc_device, NULL, NULL) != 0) {
+			clulog(LOG_CRIT,
+			       "Specified partition %s does not have a "
+			       "qdisk label\n", ctx.qc_device);
+			return -1;
+		}
+	}
+
 	if (!foreground)
                 daemon(0,0);
 




More information about the Cluster-devel mailing list