+++ /dev/null
-/* $Id: lockidx.c,v 1.25 2005-06-14 20:28:54 adam Exp $
- Copyright (C) 1995-2005
- Index Data ApS
-
-This file is part of the Zebra server.
-
-Zebra is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.zebra. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
-*/
-
-
-#include <stdio.h>
-#include <assert.h>
-#ifdef WIN32
-#include <io.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-
-#include "index.h"
-#include "zserver.h"
-
-static ZebraLockHandle server_lock_main = NULL;
-static ZebraLockHandle server_lock_cmt = NULL;
-static ZebraLockHandle server_lock_org = NULL;
-
-int zebraIndexWait (ZebraHandle zh, int commitPhase)
-{
- ZebraLockHandle h;
-
- if (server_lock_cmt)
- zebra_unlock (server_lock_cmt);
- else
- {
- char path[1024];
-
- zebra_lock_prefix (zh->service->res, path);
- strcat (path, FNAME_COMMIT_LOCK);
- server_lock_cmt = zebra_lock_create (path, 1);
- if (!server_lock_cmt)
- {
- yaz_log (YLOG_WARN|YLOG_ERRNO, "cannot create lock %s", path);
- return -1;
- }
- }
- if (server_lock_org)
- zebra_unlock (server_lock_org);
- else
- {
- char path[1024];
-
- zebra_lock_prefix (zh->service->res, path);
- strcat (path, FNAME_ORG_LOCK);
- server_lock_org = zebra_lock_create (path, 1);
- if (!server_lock_org)
- {
- yaz_log (YLOG_WARN|YLOG_ERRNO, "cannot create lock %s", path);
- return -1;
- }
- }
- if (commitPhase)
- h = server_lock_cmt;
- else
- h = server_lock_org;
- if (zebra_lock_nb (h))
- {
-#ifndef WIN32
- if (errno != EWOULDBLOCK)
- {
- yaz_log (YLOG_FATAL|YLOG_ERRNO, "flock");
- exit (1);
- }
-#endif
- if (commitPhase)
- yaz_log (YLOG_LOG, "Waiting for lock cmt");
- else
- yaz_log (YLOG_LOG, "Waiting for lock org");
- if (zebra_lock (h) == -1)
- {
- yaz_log (YLOG_FATAL, "flock");
- exit (1);
- }
- }
- zebra_unlock (h);
- return 0;
-}
-
-
-void zebraIndexLockMsg (ZebraHandle zh, const char *str)
-{
- char path[1024];
- int l, r, fd;
-
- assert (server_lock_main);
- fd = zebra_lock_fd (server_lock_main);
- lseek (fd, 0L, SEEK_SET);
- l = strlen(str);
- r = write (fd, str, l);
- if (r != l)
- {
- yaz_log (YLOG_FATAL|YLOG_ERRNO, "write lock file");
- exit (1);
- }
- zebra_lock_prefix (zh->service->res, path);
- strcat (path, FNAME_TOUCH_TIME);
- fd = creat (path, 0666);
- close (fd);
-}
-
-void zebraIndexUnlock (ZebraHandle zh)
-{
- char path[1024];
-
- zebra_lock_prefix (zh->service->res, path);
- strcat (path, FNAME_MAIN_LOCK);
-#ifdef WIN32
- zebra_lock_destroy (server_lock_main);
- if (unlink (path) && errno != ENOENT)
- yaz_log (YLOG_WARN|YLOG_ERRNO, "unlink %s failed", path);
-#else
- if (unlink (path) && errno != ENOENT)
- yaz_log (YLOG_WARN|YLOG_ERRNO, "unlink %s failed", path);
- zebra_lock_destroy (server_lock_main);
-#endif
- server_lock_main = 0;
-}
-
-int zebraIndexLock (BFiles bfs, ZebraHandle zh, int commitNow,
- const char *rval)
-{
- char path[1024];
- char buf[256];
- int r;
-
- if (server_lock_main)
- return 0;
-
- zebra_lock_prefix (zh->service->res, path);
- strcat (path, FNAME_MAIN_LOCK);
- while (1)
- {
- server_lock_main = zebra_lock_create (path, 2);
- if (!server_lock_main)
- {
- server_lock_main = zebra_lock_create (path, 1);
- if (!server_lock_main)
- {
- yaz_log (YLOG_FATAL, "couldn't obtain indexer lock");
- exit (1);
- }
- if (zebra_lock_nb (server_lock_main) == -1)
- {
-#ifdef WIN32
- yaz_log (YLOG_LOG, "waiting for other index process");
- zebra_lock (server_lock_main);
- zebra_unlock (server_lock_main);
- zebra_lock_destroy (server_lock_main);
- continue;
-#else
- if (errno == EWOULDBLOCK)
- {
- yaz_log (YLOG_LOG, "waiting for other index process");
- zebra_lock (server_lock_main);
- zebra_unlock (server_lock_main);
- zebra_lock_destroy (server_lock_main);
- continue;
- }
- else
- {
- yaz_log (YLOG_FATAL|YLOG_ERRNO, "flock %s", path);
- exit (1);
- }
-#endif
- }
- else
- {
- int fd = zebra_lock_fd (server_lock_main);
-
- yaz_log (YLOG_WARN, "unlocked %s", path);
- r = read (fd, buf, 256);
- if (r == 0)
- {
- yaz_log (YLOG_WARN, "zero length %s", path);
- zebra_lock_destroy (server_lock_main);
- unlink (path);
- continue;
- }
- else if (r == -1)
- {
- yaz_log (YLOG_FATAL|YLOG_ERRNO, "read %s", path);
- exit (1);
- }
- if (*buf == 'r')
- {
- yaz_log (YLOG_WARN, "previous transaction didn't"
- " reach commit");
- zebra_lock_destroy (server_lock_main);
- bf_commitClean (bfs, rval);
- unlink (path);
- continue;
- }
- else if (*buf == 'd')
- {
- yaz_log (YLOG_WARN, "commit file wan't deleted after commit");
- zebra_lock_destroy (server_lock_main);
- bf_commitClean (bfs, rval);
- unlink (path);
- continue;
- }
- else if (*buf == 'w')
- {
- yaz_log (YLOG_WARN,
- "The lock file indicates that your index is");
- yaz_log (YLOG_WARN, "inconsistent. Perhaps the indexer");
- yaz_log (YLOG_WARN, "terminated abnormally in the previous");
- yaz_log (YLOG_WARN, "run. You can try to proceed by");
- yaz_log (YLOG_WARN, "deleting the file %s", path);
- exit (1);
- }
- else if (*buf == 'c')
- {
- if (commitNow)
- {
- unlink (path);
- zebra_lock_destroy (server_lock_main);
- continue;
- }
- yaz_log (YLOG_FATAL, "previous transaction didn't"
- " finish commit. Commit now!");
- exit (1);
- }
- else
- {
- yaz_log (YLOG_FATAL, "unknown id 0x%02x in %s", *buf,
- path);
- exit (1);
- }
- }
- }
- else
- break;
- }
- zebra_lock (server_lock_main);
- return 0;
-}
-
+++ /dev/null
-/* $Id: locksrv.c,v 1.20 2005-06-14 20:28:54 adam Exp $
- Copyright (C) 1995-2005
- Index Data ApS
-
-This file is part of the Zebra server.
-
-Zebra is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.zebra. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
-*/
-
-
-#include <stdio.h>
-#include <assert.h>
-#ifdef WIN32
-#include <io.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-
-#include "zserver.h"
-
-int zebra_server_lock_init (ZebraService zi)
-{
- char path_prefix[1024];
-
- zi->server_lock_cmt = NULL;
- zi->server_lock_org = NULL;
-
- zebra_lock_prefix (zi->res, path_prefix);
- zi->server_path_prefix = (char *) xmalloc (strlen(path_prefix)+1);
- strcpy (zi->server_path_prefix, path_prefix);
-
- yaz_log (YLOG_DEBUG, "Locking system initialized");
- return 0;
-}
-
-int zebra_server_lock_destroy (ZebraService zi)
-{
- xfree (zi->server_path_prefix);
- zebra_lock_destroy (zi->server_lock_cmt);
- zebra_lock_destroy (zi->server_lock_org);
- yaz_log (YLOG_DEBUG, "Locking system destroyed");
- return 0;
-}
-
-int zebra_server_lock (ZebraService zi, int commitPhase)
-{
- if (!zi->server_lock_cmt)
- {
- char path[1024];
-
- strcpy (path, zi->server_path_prefix);
- strcat (path, FNAME_COMMIT_LOCK);
- if (!(zi->server_lock_cmt = zebra_lock_create (path, 0)))
- {
- yaz_log (YLOG_FATAL|YLOG_ERRNO, "create %s", path);
- return -1;
- }
- assert (zi->server_lock_org == NULL);
-
- strcpy (path, zi->server_path_prefix);
- strcat (path, FNAME_ORG_LOCK);
- if (!(zi->server_lock_org = zebra_lock_create (path, 0)))
- {
- yaz_log (YLOG_FATAL|YLOG_ERRNO, "create %s", path);
- return -1;
- }
- }
- if (commitPhase)
- {
- yaz_log (YLOG_DEBUG, "Server locks org");
- zebra_lock (zi->server_lock_org);
- }
- else
- {
- yaz_log (YLOG_DEBUG, "Server locks cmt");
- zebra_lock (zi->server_lock_cmt);
- }
- return 0;
-}
-
-void zebra_server_unlock (ZebraService zi, int commitPhase)
-{
- if (zi->server_lock_org == NULL)
- return;
- yaz_log (YLOG_DEBUG, "Server unlocks org");
- zebra_unlock (zi->server_lock_org);
- yaz_log (YLOG_DEBUG, "Server unlocks cmt");
- zebra_unlock (zi->server_lock_cmt);
-}
-
-int zebra_server_lock_get_state (ZebraService zi, time_t *timep)
-{
- char path[1024];
- char buf[256];
- int fd;
- struct stat xstat;
-
- strcpy (path, zi->server_path_prefix);
- strcat (path, FNAME_TOUCH_TIME);
- if (stat (path, &xstat) == -1)
- *timep = 1;
- else
- *timep = xstat.st_mtime;
-
- strcpy (path, zi->server_path_prefix);
- strcat (path, FNAME_MAIN_LOCK);
- fd = open (path, O_BINARY|O_RDONLY);
- if (fd == -1)
- {
- *buf = 0;
- return 0;
- }
- if (read (fd, buf, 2) == 0)
- {
- *buf = 0;
- return 0;
- }
- close (fd);
- return *buf;
-}