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.)
This commit is contained in:
Howard Chu 2005-09-04 15:48:44 +00:00
parent 595169b64f
commit f81ad346ff
3 changed files with 31 additions and 1 deletions

View 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

View file

@ -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;
}

View 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 );