]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/cyrus-imapd-2.1.3-flock.patch
Umfassend am Mailserver gearbeitet:
[people/pmueller/ipfire-2.x.git] / src / patches / cyrus-imapd-2.1.3-flock.patch
diff --git a/src/patches/cyrus-imapd-2.1.3-flock.patch b/src/patches/cyrus-imapd-2.1.3-flock.patch
deleted file mode 100644 (file)
index b74b99d..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---- cyrus-imapd-2.1.3/lib/lock_flock.c Tue Oct  2 16:08:13 2001
-+++ cyrus-imapd-2.1.3-patched/lib/lock_flock.c Tue Apr 16 09:44:58 2002
-@@ -51,6 +51,10 @@
- #endif
- #include "lock.h"
-+#include <syslog.h>
-+
-+/* Locking timeout parameter */
-+#define MAXTIME 99
- const char *lock_method_desc = "flock";
-@@ -69,6 +73,18 @@
-  * 'failaction' is provided, it is filled in with a pointer to a fixed
-  * string naming the action that failed.
-  *
-+ *  Modified by jwade 4/16/2002 to work around seen file locking problem
-+ *  Added locking timeout parameter to allow processes that are  
-+ *  waiting for a lock to eventually time out
-+ *
-+ *  Calls flock() in non-blocking fashion and then retries until a 
-+ *  maximum delay is reached or the lock succeeds.
-+ *  
-+ *  As written, uses a quadratic backoff on retries with MAXTIME being
-+ *  the longest interval delay.   Total delay time is the sum of the squares
-+ *  of all integers whose square is less than MAXTIME.  In the case of 
-+ *  MAXTIME = 99 this is 0+1+4+9+16+25+36+49+64+81= 285 Seconds   
-+ *  This time is arbitrary and can be adjusted
-  */
- int lock_reopen(fd, filename, sbuf, failaction)
- int fd;
-@@ -79,17 +95,29 @@
-     int r;
-     struct stat sbuffile, sbufspare;
-     int newfd;
-+    int delay=0, i=0;
-     if (!sbuf) sbuf = &sbufspare;
--    for (;;) {
--      r = flock(fd, LOCK_EX);
-+    for(i=0,delay=0;;) {
-+      r = flock(fd, LOCK_EX|LOCK_NB);
-       if (r == -1) {
--          if (errno == EINTR) continue;
--          if (failaction) *failaction = "locking";
-+          if (errno == EINTR) {
-+                 continue;
-+            }
-+            else if ((errno == EWOULDBLOCK) && (delay < MAXTIME)) {
-+                syslog(LOG_DEBUG, "lock: reopen-blocked sleeping for %d on interval %d (%d, %s)" , delay, i, fd, filename);
-+                sleep(delay);
-+                i++;
-+                delay = i*i;
-+                continue;
-+            }
-+          if (failaction) {
-+                if (delay >= MAXTIME) *failaction = "locking_timeout";
-+                else *failaction = "locking";
-+            }
-           return -1;
-       }
--
-       fstat(fd, sbuf);
-       r = stat(filename, &sbuffile);
-       if (r == -1) {
-@@ -97,9 +125,7 @@
-           flock(fd, LOCK_UN);
-           return -1;
-       }
--
-       if (sbuf->st_ino == sbuffile.st_ino) return 0;
--
-       newfd = open(filename, O_RDWR);
-       if (newfd == -1) {
-           if (failaction) *failaction = "opening";