[Cluster-devel] cluster/gfs2 libgfs2/fs_geometry.c libgfs2/lib ...

rpeterso at sourceware.org rpeterso at sourceware.org
Thu Nov 30 15:29:50 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL5
Changes by:	rpeterso at sourceware.org	2006-11-30 15:29:48

Modified files:
	gfs2/libgfs2   : fs_geometry.c libgfs2.h 
	gfs2/mkfs      : main_mkfs.c 
	gfs2/man       : mkfs.gfs2.8 

Log message:
	Resolves: bz217798: Need to port Resource Group optimization from
	gfs1 to gfs2.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/fs_geometry.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2&r2=1.2.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/libgfs2.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.7&r2=1.7.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/main_mkfs.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.8.2.1&r2=1.8.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/man/mkfs.gfs2.8.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.1&r2=1.1.2.2

--- cluster/gfs2/libgfs2/fs_geometry.c	2006/06/06 14:20:41	1.2
+++ cluster/gfs2/libgfs2/fs_geometry.c	2006/11/30 15:29:48	1.2.2.1
@@ -34,13 +34,25 @@
  */
 
 static uint64_t
-how_many_rgrps(struct gfs2_sbd *sdp, struct subdevice *sdev)
+how_many_rgrps(struct gfs2_sbd *sdp, struct subdevice *sdev,
+			   int rgsize_specified)
 {
-	uint64_t nrgrp = DIV_RU(sdev->length,
-				(sdp->rgsize << 20) / sdp->bsize);
+	uint64_t nrgrp;
+
+	while (TRUE) {
+		nrgrp = DIV_RU(sdev->length, (sdp->rgsize << 20) / sdp->bsize);
+
+		if (rgsize_specified || /* If user specified an rg size or */
+			nrgrp <= GFS2_EXCESSIVE_RGS || /* not an excessive # of rgs or  */
+			sdp->rgsize >= 2048)     /* we've reached the max rg size */
+			break;
+
+		sdp->rgsize += GFS2_DEFAULT_RGSIZE; /* Try again w/bigger rgs */
+	}
 
 	if (sdp->debug)
-		printf("  nrgrp = %"PRIu64"\n", nrgrp);
+		printf("  rg sz = %"PRIu32"\n  nrgrp = %"PRIu64"\n", sdp->rgsize,
+			   nrgrp);
 
 	return nrgrp;
 }
@@ -53,14 +65,16 @@
  */
 
 void
-compute_rgrp_layout(struct gfs2_sbd *sdp, int new_fs)
+compute_rgrp_layout(struct gfs2_sbd *sdp, int rgsize_specified)
 {
 	struct subdevice *sdev;
 	struct rgrp_list *rl, *rlast = NULL;
 	osi_list_t *tmp, *head = &sdp->rglist;
 	uint64_t rgrp, nrgrp;
 	unsigned int x;
+	int new_fs;
 
+	new_fs = TRUE;
 	for (x = 0; x < sdp->device.nsubdev; x++) {
 		sdev = sdp->device.subdev + x;
 
@@ -74,7 +88,7 @@
 		if (sdp->debug)
 			printf("\nData Subdevice %u\n", x);
 
-		nrgrp = how_many_rgrps(sdp, sdev);
+		nrgrp = how_many_rgrps(sdp, sdev, rgsize_specified);
 
 		for (rgrp = 0; rgrp < nrgrp; rgrp++) {
 			zalloc(rl, sizeof(struct rgrp_list));
--- cluster/gfs2/libgfs2/libgfs2.h	2006/09/20 15:23:34	1.7
+++ cluster/gfs2/libgfs2/libgfs2.h	2006/11/30 15:29:48	1.7.2.1
@@ -237,6 +237,7 @@
 #define GFS2_DEFAULT_UTSIZE         (1)
 #define GFS2_DEFAULT_QCSIZE         (1)
 #define GFS2_MIN_GROW_SIZE          (10)
+#define GFS2_EXCESSIVE_RGS          (10000)
 
 #define DATA (1)
 #define META (2)
@@ -373,7 +374,7 @@
 int gfs2_set_bitmap(struct gfs2_sbd *sdp, uint64_t blkno, int state);
 
 /* fs_geometry.c */
-void compute_rgrp_layout(struct gfs2_sbd *sdp, int new_fs);
+void compute_rgrp_layout(struct gfs2_sbd *sdp, int rgsize_specified);
 void build_rgrps(struct gfs2_sbd *sdp);
 
 /* fs_ops.c */
--- cluster/gfs2/mkfs/main_mkfs.c	2006/11/28 18:40:52	1.8.2.1
+++ cluster/gfs2/mkfs/main_mkfs.c	2006/11/30 15:29:48	1.8.2.2
@@ -197,7 +197,10 @@
 		printf("  override = %d\n", sdp->override);
 		printf("  proto = %s\n", sdp->lockproto);
 		printf("  quiet = %d\n", sdp->quiet);
-		printf("  rgsize = %u\n", sdp->rgsize);
+		if (sdp->rgsize==-1)
+			printf("  rgsize = optimize for best performance\n");
+		else
+			printf("  rgsize = %u\n", sdp->rgsize);
 		printf("  table = %s\n", sdp->locktable);
 		printf("  utsize = %u\n", sdp->utsize);
 		printf("  device = %s\n", sdp->device_name);
@@ -327,11 +330,12 @@
 	struct gfs2_sbd sbd, *sdp = &sbd;
 	unsigned int x;
 	int error;
+	int rgsize_specified = 0;
 
 	memset(sdp, 0, sizeof(struct gfs2_sbd));
 	sdp->bsize = GFS2_DEFAULT_BSIZE;
 	sdp->jsize = GFS2_DEFAULT_JSIZE;
-	sdp->rgsize = GFS2_DEFAULT_RGSIZE;
+	sdp->rgsize = -1;
 	sdp->utsize = GFS2_DEFAULT_UTSIZE;
 	sdp->qcsize = GFS2_DEFAULT_QCSIZE;
 	sdp->time = time(NULL);
@@ -341,6 +345,11 @@
 		osi_list_init(&sdp->buf_hash[x]);
 
 	decode_arguments(argc, argv, sdp);
+	if (sdp->rgsize == -1)                 /* if rg size not specified */
+		sdp->rgsize = GFS2_DEFAULT_RGSIZE; /* default it for now */
+	else
+		rgsize_specified = TRUE;
+
 	verify_arguments(sdp);
 
 	sdp->device_fd = open(sdp->device_name, O_RDWR);
@@ -360,7 +369,7 @@
 
 	/* Compute the resource group layouts */
 
-	compute_rgrp_layout(sdp, TRUE);
+	compute_rgrp_layout(sdp, rgsize_specified);
 
 	/* Build ondisk structures */
 
--- cluster/gfs2/man/mkfs.gfs2.8	2006/11/28 18:40:53	1.1.2.1
+++ cluster/gfs2/man/mkfs.gfs2.8	2006/11/30 15:29:48	1.1.2.2
@@ -48,7 +48,11 @@
 .TP
 \fB-r\fP \fIMegaBytes\fR
 gfs2_mkfs will try to make Resource Groups about this big.
-The default is 256 MB.
+Minimum RG size is 32 MB.  Maximum RG size is 2048 MB.
+A large RG size may increase performance on very large file systems.
+If not specified, mkfs.gfs2 will choose the RG size based on the size
+of the file system: average size file systems will have 256 MB RGs, and
+bigger file systems will have bigger RGs for better performance.
 .TP
 \fB-t\fP \fILockTableName\fR 
 The lock table field appropriate to the lock module you're using.




More information about the Cluster-devel mailing list