X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Flockidx.c;h=994f4952e9caf7c578e60a044578d0d606374938;hb=1cc0116831e49bf70538639a8fc9b08b9524c683;hp=45f7261e79974085ea1e2ca5444cca07386fcad6;hpb=b8fb0cb30ffc1fb35a34608a27245dd091566bb9;p=idzebra-moved-to-github.git diff --git a/index/lockidx.c b/index/lockidx.c index 45f7261..994f495 100644 --- a/index/lockidx.c +++ b/index/lockidx.c @@ -1,64 +1,29 @@ -/* - * Copyright (C) 1994-1998, Index Data I/S - * All rights reserved. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: lockidx.c,v $ - * Revision 1.14 1998-01-12 15:04:08 adam - * The test option (-s) only uses read-lock (and not write lock). - * - * Revision 1.13 1997/09/29 09:08:36 adam - * Revised locking system to be thread safe for the server. - * - * Revision 1.12 1997/09/25 14:54:43 adam - * WIN32 files lock support. - * - * Revision 1.11 1997/09/17 12:19:15 adam - * Zebra version corresponds to YAZ version 1.4. - * Changed Zebra server so that it doesn't depend on global common_resource. - * - * Revision 1.10 1997/09/09 13:38:07 adam - * Partial port to WIN95/NT. - * - * Revision 1.9 1997/09/04 13:58:04 adam - * Added O_BINARY for open calls. - * - * Revision 1.8 1997/02/12 20:39:46 adam - * Implemented options -f that limits the log to the first - * records. - * Changed some log messages also. - * - * Revision 1.7 1996/10/29 14:08:13 adam - * Uses resource lockDir instead of lockPath. - * - * Revision 1.6 1996/03/26 16:01:13 adam - * New setting lockPath: directory of various lock files. - * - * Revision 1.5 1995/12/13 08:46:09 adam - * Locking uses F_WRLCK and F_RDLCK again! - * - * Revision 1.4 1995/12/12 16:00:57 adam - * System call sync(2) used after update/commit. - * Locking (based on fcntl) uses F_EXLCK and F_SHLCK instead of F_WRLCK - * and F_RDLCK. - * - * Revision 1.3 1995/12/11 11:43:29 adam - * Locking based on fcntl instead of flock. - * Setting commitEnable removed. Command line option -n can be used to - * prevent commit if commit setting is defined in the configuration file. - * - * Revision 1.2 1995/12/08 16:22:54 adam - * Work on update while servers are running. Three lock files introduced. - * The servers reload their registers when necessary, but they don't - * reestablish result sets yet. - * - * Revision 1.1 1995/12/07 17:38:47 adam - * Work locking mechanisms for concurrent updates/commit. - * - */ +/* $Id: lockidx.c,v 1.22 2002-08-02 19:26:55 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 + 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 #include -#ifdef WINDOWS +#ifdef WIN32 #include #else #include @@ -68,12 +33,13 @@ #include #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 (int commitPhase) +int zebraIndexWait (ZebraHandle zh, int commitPhase) { ZebraLockHandle h; @@ -83,7 +49,7 @@ int zebraIndexWait (int commitPhase) { char path[1024]; - zebra_lock_prefix (common_resource, path); + zebra_lock_prefix (zh->service->res, path); strcat (path, FNAME_COMMIT_LOCK); server_lock_cmt = zebra_lock_create (path, 1); if (!server_lock_cmt) @@ -98,7 +64,7 @@ int zebraIndexWait (int commitPhase) { char path[1024]; - zebra_lock_prefix (common_resource, path); + zebra_lock_prefix (zh->service->res, path); strcat (path, FNAME_ORG_LOCK); server_lock_org = zebra_lock_create (path, 1); if (!server_lock_org) @@ -113,7 +79,7 @@ int zebraIndexWait (int commitPhase) h = server_lock_org; if (zebra_lock_nb (h)) { -#ifndef WINDOWS +#ifndef WIN32 if (errno != EWOULDBLOCK) { logf (LOG_FATAL|LOG_ERRNO, "flock"); @@ -135,7 +101,7 @@ int zebraIndexWait (int commitPhase) } -void zebraIndexLockMsg (const char *str) +void zebraIndexLockMsg (ZebraHandle zh, const char *str) { char path[1024]; int l, r, fd; @@ -150,31 +116,41 @@ void zebraIndexLockMsg (const char *str) logf (LOG_FATAL|LOG_ERRNO, "write lock file"); exit (1); } - zebra_lock_prefix (common_resource, path); + zebra_lock_prefix (zh->service->res, path); strcat (path, FNAME_TOUCH_TIME); fd = creat (path, 0666); close (fd); } -void zebraIndexUnlock (void) +void zebraIndexUnlock (ZebraHandle zh) { char path[1024]; - zebra_lock_prefix (common_resource, path); + zebra_lock_prefix (zh->service->res, path); strcat (path, FNAME_MAIN_LOCK); - unlink (path); +#ifdef WIN32 + zebra_lock_destroy (server_lock_main); + if (unlink (path) && errno != ENOENT) + logf (LOG_WARN|LOG_ERRNO, "unlink %s failed", path); +#else + if (unlink (path) && errno != ENOENT) + logf (LOG_WARN|LOG_ERRNO, "unlink %s failed", path); + zebra_lock_destroy (server_lock_main); +#endif + server_lock_main = 0; } -void zebraIndexLock (BFiles bfs, int commitNow, const char *rval) +int zebraIndexLock (BFiles bfs, ZebraHandle zh, int commitNow, + const char *rval) { char path[1024]; char buf[256]; int r; if (server_lock_main) - return ; + return 0; - zebra_lock_prefix (common_resource, path); + zebra_lock_prefix (zh->service->res, path); strcat (path, FNAME_MAIN_LOCK); while (1) { @@ -184,14 +160,12 @@ void zebraIndexLock (BFiles bfs, int commitNow, const char *rval) server_lock_main = zebra_lock_create (path, 1); if (!server_lock_main) { - if (errno == ENOENT) - continue; - logf (LOG_FATAL|LOG_ERRNO, "open %s", path); - exit (1); + logf (LOG_FATAL, "couldn't obtain indexer lock"); + exit (1); } if (zebra_lock_nb (server_lock_main) == -1) { -#ifdef WINDOWS +#ifdef WIN32 logf (LOG_LOG, "waiting for other index process"); zebra_lock (server_lock_main); zebra_unlock (server_lock_main); @@ -282,5 +256,6 @@ void zebraIndexLock (BFiles bfs, int commitNow, const char *rval) break; } zebra_lock (server_lock_main); + return 0; }