mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-28 02:29:34 -05:00
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.
This commit is contained in:
parent
5389e40ba5
commit
0f17fac37d
5 changed files with 52 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue