]> git.sur5r.net Git - openldap/commitdiff
ITS#3978: Added alock calls; warns about inconsistency but continues
authorHoward Chu <hyc@openldap.org>
Sun, 4 Sep 2005 15:48:44 +0000 (15:48 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 4 Sep 2005 15:48:44 +0000 (15:48 +0000)
to start. Fails for concurrent access attempts, since ldbm does not
support any concurrency. (So slaptools are prevented from running when
slapd is already active.)

servers/slapd/back-ldbm/back-ldbm.h
servers/slapd/back-ldbm/close.c
servers/slapd/back-ldbm/init.c

index 6119e0ad9c4999069c03bce205a5faf8c5eea9a4..ea1c96acc601ca038a13192cda749774e1bbae1b 100644 (file)
@@ -18,6 +18,7 @@
 #define _BACK_LDBM_H_
 
 #include "ldbm.h"
+#include "alock.h"
 
 LDAP_BEGIN_DECL
 
@@ -152,6 +153,7 @@ struct ldbminfo {
        int                     li_dbsyncwaitn;
        int                     li_dbsyncwaitinterval;
        int                     li_dbsyncwaitcount;
+       alock_info_t    li_alock_info;
 };
 
 LDAP_END_DECL
index 2e2090e28663f9c26acf83e0fd2613de9e7d07b3..9c26976697797e2953a99e213a14f50be2de00bd 100644 (file)
 int
 ldbm_back_db_close( Backend *be )
 {
+       struct ldbminfo *li = be->be_private;
+
        Debug( LDAP_DEBUG_TRACE, "ldbm backend syncing\n", 0, 0, 0 );
 
        ldbm_cache_flush_all( be );
        Debug( LDAP_DEBUG_TRACE, "ldbm backend done syncing\n", 0, 0, 0 );
 
-       cache_release_all( &((struct ldbminfo *) be->be_private)->li_cache );
+       cache_release_all( &li->li_cache );
+       if ( alock_close( &li->li_alock_info )) {
+               Debug( LDAP_DEBUG_ANY,
+                       "ldbm_back_db_close: alock_close failed\n", 0, 0, 0 );
+       }
 
        return 0;
 }
index b8a6831ce5d4609d521d475ee66cc5fd59e4893f..1ceb19bc5cd1516b9610cf9bb30e55ed6860c553 100644 (file)
@@ -195,6 +195,28 @@ ldbm_back_db_open(
 )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
+       int rc;
+
+       rc = alock_open( &li->li_alock_info, "slapd",
+               li->li_directory, ALOCK_UNIQUE );
+       if ( rc == ALOCK_BUSY ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "ldbm_back_db_open: database already in use\n",
+                       0, 0, 0 );
+               return -1;
+       } else if ( rc == ALOCK_RECOVER ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "ldbm_back_db_open: unclean shutdown detected;"
+                       " database may be inconsistent!\n",
+                       0, 0, 0 );
+               rc = alock_recover( &li->li_alock_info );
+       }
+       if ( rc != ALOCK_CLEAN ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "ldbm_back_db_open: alock package is unstable;"
+                       " database may be inconsistent!\n",
+                       0, 0, 0 );
+       }
        li->li_dbenv = ldbm_initialize_env( li->li_directory,
                li->li_dbcachesize, &li->li_envdirok );