From 487d1aa27560770116c8df6f3a36835c8ba9a731 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Fri, 22 Jan 1999 21:55:43 +0000 Subject: [PATCH] Import nextid cleanup and no-return upon failed add changes from releng 1.2 --- servers/slapd/back-ldbm/back-ldbm.h | 1 + servers/slapd/back-ldbm/config.c | 6 + servers/slapd/back-ldbm/init.c | 2 +- servers/slapd/back-ldbm/nextid.c | 177 +++++++++++++--------------- 4 files changed, 90 insertions(+), 96 deletions(-) diff --git a/servers/slapd/back-ldbm/back-ldbm.h b/servers/slapd/back-ldbm/back-ldbm.h index 2d16199b75..216aab72b2 100644 --- a/servers/slapd/back-ldbm/back-ldbm.h +++ b/servers/slapd/back-ldbm/back-ldbm.h @@ -109,6 +109,7 @@ struct attrinfo { struct ldbminfo { ID li_nextid; + char *li_nextid_file; pthread_mutex_t li_root_mutex; pthread_mutex_t li_add_mutex; pthread_mutex_t li_nextid_mutex; diff --git a/servers/slapd/back-ldbm/config.c b/servers/slapd/back-ldbm/config.c index 99a7c7794e..541410ee4d 100644 --- a/servers/slapd/back-ldbm/config.c +++ b/servers/slapd/back-ldbm/config.c @@ -37,6 +37,12 @@ ldbm_back_config( } li->li_directory = ch_strdup( argv[1] ); + li->li_nextid_file = + ch_malloc( strlen(li->li_directory) + sizeof("/NEXTID") ); + + strcpy(li->li_nextid_file, li->li_directory); + strcat(li->li_nextid_file, "/NEXTID"); + /* mode with which to create new database files */ } else if ( strcasecmp( argv[0], "mode" ) == 0 ) { if ( argc < 2 ) { diff --git a/servers/slapd/back-ldbm/init.c b/servers/slapd/back-ldbm/init.c index 7d7418825d..703edb33e4 100644 --- a/servers/slapd/back-ldbm/init.c +++ b/servers/slapd/back-ldbm/init.c @@ -23,7 +23,7 @@ ldbm_back_init( li = (struct ldbminfo *) ch_calloc( 1, sizeof(struct ldbminfo) ); /* arrange to read nextid later (on first request for it) */ - li->li_nextid = -1; + li->li_nextid = NOID; /* default cache size */ li->li_cache.c_maxsize = DEFAULT_CACHE_SIZE; diff --git a/servers/slapd/back-ldbm/nextid.c b/servers/slapd/back-ldbm/nextid.c index 63c7ed4d89..ac899e05f7 100644 --- a/servers/slapd/back-ldbm/nextid.c +++ b/servers/slapd/back-ldbm/nextid.c @@ -13,65 +13,94 @@ #include "slap.h" #include "back-ldbm.h" +static ID +next_id_read( Backend *be ) +{ + struct ldbminfo *li = (struct ldbminfo *) be->be_private; + ID id; + char buf[20]; + char* file = li->li_nextid_file; + FILE* fp; + + if ( (fp = fopen( file, "r" )) == NULL ) { + Debug( LDAP_DEBUG_ANY, + "next_id_read: could not open \"%s\"\n", + file, 0, 0 ); + return NOID; + } + + if ( fgets( buf, sizeof(buf), fp ) == NULL ) { + Debug( LDAP_DEBUG_ANY, + "next_id_read: could not fgets nextid from \"%s\"\n", + file, 0, 0 ); + fclose( fp ); + return NOID; + } + + id = atol( buf ); + fclose( fp ); + + if(id < 1) { + Debug( LDAP_DEBUG_ANY, + "next_id_read %lu: atol(%s) return non-positive integer\n", + id, buf, 0 ); + return NOID; + } + + return id; +} + +static int +next_id_write( Backend *be, ID id ) +{ + struct ldbminfo *li = (struct ldbminfo *) be->be_private; + char buf[20]; + char* file = li->li_nextid_file; + FILE* fp; + int rc; + + if ( (fp = fopen( file, "w" )) == NULL ) { + Debug( LDAP_DEBUG_ANY, "next_id_write(%lu): could not open \"%s\"\n", + id, file, 0 ); + return -1; + } + + rc = 0; + + if ( fprintf( fp, "%ld\n", id ) == EOF ) { + Debug( LDAP_DEBUG_ANY, "next_id_write(%lu): cannot fprintf\n", + id, 0, 0 ); + rc = -1; + } + + if( fclose( fp ) != 0 ) { + Debug( LDAP_DEBUG_ANY, "next_id_write %lu: cannot fclose\n", + id, 0, 0 ); + rc = -1; + } + + return rc; +} + ID next_id( Backend *be ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - char buf[MAXPATHLEN]; - char buf2[20]; - FILE *fp; ID id; - sprintf( buf, "%s/NEXTID", li->li_directory ); - pthread_mutex_lock( &li->li_nextid_mutex ); /* first time in here since startup - try to read the nexid */ - if ( li->li_nextid == -1 ) { - if ( (fp = fopen( buf, "r" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, - "next_id %lu: could not open \"%s\"\n", - li->li_nextid, buf, 0 ); - li->li_nextid = 1; + if ( li->li_nextid == NOID ) { + li->li_nextid = next_id_read( be ); - } else { - if ( fgets( buf2, sizeof(buf2), fp ) != NULL ) { - li->li_nextid = atol( buf2 ); - - if(li->li_nextid < 1) { - /* protect against bad data */ - Debug( LDAP_DEBUG_ANY, - "next_id %lu: atol(%s) return non-positive integer\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - - } else { - Debug( LDAP_DEBUG_ANY, - "next_id %lu: could not fgets nextid from \"%s\"\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - - fclose( fp ); + if ( li->li_nextid == NOID ) { + li->li_nextid = 1; } } id = li->li_nextid++; - - if ( (fp = fopen( buf, "w" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, "next_id %lu: could not open \"%s\"\n", - li->li_nextid, buf, 0 ); - } else { - if ( fprintf( fp, "%ld\n", li->li_nextid ) == EOF ) { - Debug( LDAP_DEBUG_ANY, "next_id %lu: cannot fprintf\n", - li->li_nextid, 0, 0 ); - } - if( fclose( fp ) != 0 ) { - Debug( LDAP_DEBUG_ANY, "next_id %lu: cannot fclose\n", - li->li_nextid, 0, 0 ); - } - } + (void) next_id_write( be, li->li_nextid ); pthread_mutex_unlock( &li->li_nextid_mutex ); return( id ); @@ -80,9 +109,8 @@ next_id( Backend *be ) void next_id_return( Backend *be, ID id ) { +#ifdef NEXT_ID_RETURN struct ldbminfo *li = (struct ldbminfo *) be->be_private; - char buf[MAXPATHLEN]; - FILE *fp; pthread_mutex_lock( &li->li_nextid_mutex ); @@ -91,68 +119,27 @@ next_id_return( Backend *be, ID id ) return; } - sprintf( buf, "%s/NEXTID", li->li_directory ); - li->li_nextid--; - if ( (fp = fopen( buf, "w" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, - "next_id_return of %lu: could not open \"%s\" next id %lu\n", - id, buf, li->li_nextid ); - } else { - if ( fprintf( fp, "%ld\n", li->li_nextid ) == EOF ) { - Debug( LDAP_DEBUG_ANY, - "next_id_return of %lu: cannot fprintf \"%s\" next id %lu\n", - id, buf, li->li_nextid ); - } - if( fclose( fp ) != 0 ) { - Debug( LDAP_DEBUG_ANY, - "next_id_return of %lu: cannot fclose \"%s\" next id %lu\n", - id, buf, li->li_nextid ); - } - } + (void) next_id_write( be, li->li_nextid ); + pthread_mutex_unlock( &li->li_nextid_mutex ); +#endif } ID next_id_get( Backend *be ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - char buf[MAXPATHLEN]; - char buf2[20]; - FILE *fp; ID id; - sprintf( buf, "%s/NEXTID", li->li_directory ); - pthread_mutex_lock( &li->li_nextid_mutex ); /* first time in here since startup - try to read the nexid */ - if ( li->li_nextid == -1 ) { - if ( (fp = fopen( buf, "r" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, - "next_id_get %lu: could not open \"%s\"\n", - li->li_nextid, buf, 0 ); - li->li_nextid = 1; + if ( li->li_nextid == NOID ) { + li->li_nextid = next_id_read( be ); - } else { - if ( fgets( buf2, sizeof(buf2), fp ) != NULL ) { - li->li_nextid = atol( buf2 ); - - if(li->li_nextid < 1) { - /* protect against bad data */ - Debug( LDAP_DEBUG_ANY, - "next_id_get %lu: atol(%s) return non-positive integer\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - - } else { - Debug( LDAP_DEBUG_ANY, - "next_id_get %lu: cannot fgets nextid from \"%s\"\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - fclose( fp ); + if ( li->li_nextid == NOID ) { + li->li_nextid = 1; } } -- 2.47.2