mupdate doesn't replicate quota information

Diego Woitasen diego at woitasen.com.ar
Tue Dec 4 12:22:39 EST 2007


I'm playing with Cyrus Murder in replicated mode. All operations are
working really fine, except quota informacion replication.

The scenario is described in:
http://lists.andrew.cmu.edu/pipermail/info-cyrus/2007-November/027829.html

After read the code quickly I saw it's not supported.

My solution is a little patch that adds quota_directory option in
imapd.conf. Using quota db type legacy, we can put the quotadb in the
shared storage. I didn't try with other db types.

diff -Nur cyrus-imapd-2.3.10/imap/quota_db.c cyrus-ws/imap/quota_db.c
--- cyrus-imapd-2.3.10/imap/quota_db.c	2007-08-15 14:20:57.000000000 -0300
+++ cyrus-ws/imap/quota_db.c	2007-11-30 14:05:14.993312000 -0300
@@ -242,12 +242,12 @@
 
     /* create db file name */
     if (!fname) {
-	size_t fname_len = strlen(config_dir)+strlen(FNAME_QUOTADB)+1;
+	size_t fname_len = strlen(quota_dir)+strlen(FNAME_QUOTADB)+1;
 	
 	fname = xmalloc(fname_len);
 	tofree = fname;
 
-	strlcpy(fname, config_dir, fname_len);
+	strlcpy(fname, quota_dir, fname_len);
 	strlcat(fname, FNAME_QUOTADB, fname_len);
     }
 
diff -Nur cyrus-imapd-2.3.10/lib/imapoptions cyrus-ws/lib/imapoptions
--- cyrus-imapd-2.3.10/lib/imapoptions	2007-10-18 15:14:48.000000000 -0300
+++ cyrus-ws/lib/imapoptions	2007-11-30 14:44:06.367646834 -0300
@@ -826,6 +826,9 @@
    allowed in envelope tests.  When disabled, ANY grammatically correct header
    will be allowed. */
 
+{ "quotadirectory", NULL, STRING }
+/* The pathname of the quota database directory. Default is config directory. */
+
 # Commented out - used by libsasl
 # { "sasl_auto_transition", 0, SWITCH }
 /* If enabled, the SASL library will automatically create authentication
diff -Nur cyrus-imapd-2.3.10/lib/libconfig.c cyrus-ws/lib/libconfig.c
--- cyrus-imapd-2.3.10/lib/libconfig.c	2007-07-18 15:56:11.000000000 -0300
+++ cyrus-ws/lib/libconfig.c	2007-11-30 14:09:09.031608000 -0300
@@ -69,6 +69,7 @@
 /* cached configuration variables accessible to the external world */
 const char *config_filename= NULL;       /* filename of configuration file */
 const char *config_dir = NULL;		 /* ie /var/imap */
+const char *quota_dir = NULL;		 /* ie /var/imap */
 const char *config_defpartition = NULL;  /* /var/spool/imap */
 const char *config_servername= NULL;	 /* gethostname() */
 const char *config_mupdate_server = NULL;/* NULL */
@@ -219,6 +220,8 @@
 	fatal("configdirectory option not specified in configuration file",
 	      EC_CONFIG);
     }
+    if (!quota_dir)
+    	quota_dir = config_dir;
 
     /* Scan options to see if we need to replace {configdirectory} */
     /* xxx need to scan overflow options as well! */
@@ -449,6 +452,8 @@
 
 		if(opt == IMAPOPT_CONFIGDIRECTORY)
 		    config_dir = imapopts[opt].val.s;
+		if(opt == IMAPOPT_QUOTADIRECTORY)
+		    quota_dir = imapopts[opt].val.s;
 
 		break;
 	    }
diff -Nur cyrus-imapd-2.3.10/lib/libconfig.h cyrus-ws/lib/libconfig.h
--- cyrus-imapd-2.3.10/lib/libconfig.h	2007-07-18 15:56:11.000000000 -0300
+++ cyrus-ws/lib/libconfig.h	2007-11-30 14:53:35.863766630 -0300
@@ -66,6 +66,7 @@
 /* cached configuration variables accessable to external world */
 extern const char *config_filename;
 extern const char *config_dir;
+extern const char *quota_dir;
 extern const char *config_defpartition;
 extern const char *config_servername;
 extern const char *config_mupdate_server;

-- 

--------------
Diego Woitasen


More information about the Cyrus-devel mailing list