From: Howard Chu Date: Sun, 4 Sep 2005 15:48:44 +0000 (+0000) Subject: ITS#3978: Added alock calls; warns about inconsistency but continues X-Git-Tag: OPENLDAP_REL_ENG_2_2_MP~492 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f81ad346ffabe0084ddfab3008e7c12a7b6f8c95;p=openldap ITS#3978: Added alock calls; warns about inconsistency but continues 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.) --- diff --git a/servers/slapd/back-ldbm/back-ldbm.h b/servers/slapd/back-ldbm/back-ldbm.h index 6119e0ad9c..ea1c96acc6 100644 --- a/servers/slapd/back-ldbm/back-ldbm.h +++ b/servers/slapd/back-ldbm/back-ldbm.h @@ -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 diff --git a/servers/slapd/back-ldbm/close.c b/servers/slapd/back-ldbm/close.c index 2e2090e286..9c26976697 100644 --- a/servers/slapd/back-ldbm/close.c +++ b/servers/slapd/back-ldbm/close.c @@ -26,12 +26,18 @@ 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; } diff --git a/servers/slapd/back-ldbm/init.c b/servers/slapd/back-ldbm/init.c index b8a6831ce5..1ceb19bc5c 100644 --- a/servers/slapd/back-ldbm/init.c +++ b/servers/slapd/back-ldbm/init.c @@ -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 );