Skip to content
Snippets Groups Projects
Commit 0f17fac3 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Implement NEXTID chunking. Obtain IDs in chunks of size

SLAPD_NEXTID_CHUNK.  Code protects NEXTID file to ensure
its equal to or greater than nextid.  Updated on close
to actual nextid.  next_id_save() could be called periodically
if desired.  Default chunk size is 32.  Define to 1 to disable
chunking.
parent 5389e40b
No related branches found
No related tags found
No related merge requests found
......@@ -104,8 +104,16 @@ struct attrinfo {
#define MAXDBCACHE 10
/* this could be made an option */
#ifndef SLAPD_NEXTID_CHUNK
#define SLAPD_NEXTID_CHUNK 32
#endif
struct ldbminfo {
ID li_nextid;
#if SLAPD_NEXTID_CHUNK > 1
ID li_nextid_wrote;
#endif
char *li_nextid_file;
pthread_mutex_t li_root_mutex;
pthread_mutex_t li_add_mutex;
......
......@@ -12,6 +12,11 @@
void
ldbm_back_close( Backend *be )
{
Debug( LDAP_DEBUG_TRACE, "ldbm backend saving nextid\n", 0, 0, 0 );
if ( next_id_save( be ) < 0 ) {
Debug( LDAP_DEBUG_ANY, "ldbm backend nextid save failed!\n", 0, 0, 0 );
}
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 );
......
......@@ -29,6 +29,10 @@ ldbm_back_init(
/* arrange to read nextid later (on first request for it) */
li->li_nextid = NOID;
#if SLAPD_NEXTID_CHUNK > 1
li->li_nextid_wrote = NOID;
#endif
/* default cache size */
li->li_cache.c_maxsize = DEFAULT_CACHE_SIZE;
......
......@@ -82,6 +82,20 @@ next_id_write( Backend *be, ID id )
return rc;
}
int
next_id_save( Backend *be )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
ID id = next_id_get( be );
int rc = next_id_write( be, id );
if (rc == 0) {
li->li_nextid_wrote = id;
}
return rc;
}
ID
next_id( Backend *be )
{
......@@ -97,10 +111,22 @@ next_id( Backend *be )
if ( li->li_nextid == NOID ) {
li->li_nextid = 1;
}
#if SLAPD_NEXTID_CHUNK > 1
li->li_nextid_wrote = li->li_nextid;
#endif
}
id = li->li_nextid++;
#if SLAPD_NEXTID_CHUNK > 1
if ( li->li_nextid > li->li_nextid_wrote ) {
li->li_nextid_wrote += SLAPD_NEXTID_CHUNK;
(void) next_id_write( be, li->li_nextid_wrote );
}
#else
(void) next_id_write( be, li->li_nextid );
#endif
pthread_mutex_unlock( &li->li_nextid_mutex );
return( id );
......@@ -109,7 +135,7 @@ next_id( Backend *be )
void
next_id_return( Backend *be, ID id )
{
#ifdef NEXT_ID_RETURN
#ifdef SLAPD_NEXTID_RETURN
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
pthread_mutex_lock( &li->li_nextid_mutex );
......@@ -120,7 +146,10 @@ next_id_return( Backend *be, ID id )
}
li->li_nextid--;
#if !( SLAPD_NEXTID_CHUCK > 1 )
(void) next_id_write( be, li->li_nextid );
#endif
pthread_mutex_unlock( &li->li_nextid_mutex );
#endif
......@@ -141,6 +170,10 @@ next_id_get( Backend *be )
if ( li->li_nextid == NOID ) {
li->li_nextid = 1;
}
#if SLAPD_NEXTID_CHUNK > 1
li->li_nextid_wrote = li->li_nextid;
#endif
}
id = li->li_nextid;
......
......@@ -128,6 +128,7 @@ int index_add_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID
ID next_id LDAP_P(( Backend *be ));
void next_id_return LDAP_P(( Backend *be, ID id ));
ID next_id_get LDAP_P(( Backend *be ));
int next_id_save LDAP_P(( Backend *be ));
LDAP_END_DECL
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment