2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.1 1995-12-07 17:38:47 adam
8 * Work locking mechanisms for concurrent updates/commit.
22 static int lock_fd = -1;
24 void zebraIndexLockMsg (const char *str)
28 assert (lock_fd != -1);
29 lseek (lock_fd, 0L, SEEK_SET);
31 r = write (lock_fd, str, l);
34 logf (LOG_FATAL|LOG_ERRNO, "write lock file");
39 void zebraIndexUnlock (int rw)
42 char pathPrefix[1024];
47 zebraLockPrefix (pathPrefix);
48 sprintf (path, "%s%s", pathPrefix, FNAME_MAIN_LOCK);
52 void zebraIndexLock (int rw)
55 char pathPrefix[1024];
59 zebraLockPrefix (pathPrefix);
60 sprintf (path, "%s%s", pathPrefix, FNAME_MAIN_LOCK);
65 lock_fd = open (path, O_CREAT|O_RDWR|O_EXCL|O_SYNC, 0666);
68 lock_fd = open (path, O_RDONLY);
69 assert (lock_fd != -1);
70 if (flock (lock_fd, LOCK_EX|LOCK_NB) == -1)
72 if (errno == EWOULDBLOCK)
74 logf (LOG_LOG, "Waiting for other index process");
75 flock (lock_fd, LOCK_EX);
80 logf (LOG_FATAL|LOG_ERRNO, "flock %s", path);
86 logf (LOG_WARN, "Unlocked %s", path);
87 r = read (lock_fd, buf, 256);
90 logf (LOG_WARN, "Zero length %s", path);
97 logf (LOG_FATAL|LOG_ERRNO, "read %s", path);
102 logf (LOG_WARN, "Previous transaction didn't"
108 else if (*buf == 'w')
110 logf (LOG_WARN, "Your index may be inconsistent");
113 else if (*buf == 'c')
115 logf (LOG_FATAL, "Previous transaction didn't"
116 " finish commit. Restore now!");
121 logf (LOG_FATAL, "Unknown id 0x%02x in %s", *buf,
130 flock (lock_fd, LOCK_EX);
134 void zebraIndexLockCommit (void)