mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-26 09:39:45 -05:00
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:
parent
595169b64f
commit
f81ad346ff
3 changed files with 31 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue