X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb2%2Fadd.c;h=6edf1f636dd52a3f674cd10f4e416dbe3dbc7313;hb=4b65e74fa8ee7db3c42f4640700dd9464a26b0b3;hp=f7d3274e1ecb59d312ac19a5ba000dafc25d6171;hpb=42f6e78dd4e2d481c1bc75b8bc6d38fe9c62bc07;p=openldap diff --git a/servers/slapd/back-bdb2/add.c b/servers/slapd/back-bdb2/add.c index f7d3274e1e..6edf1f636d 100644 --- a/servers/slapd/back-bdb2/add.c +++ b/servers/slapd/back-bdb2/add.c @@ -22,24 +22,18 @@ bdb2i_back_add_internal( struct ldbminfo *li = (struct ldbminfo *) be->be_private; char *pdn; Entry *p = NULL; - int rootlock = 0; - int rc = -1; + int rc; + struct timeval time1; Debug(LDAP_DEBUG_ARGS, "==> bdb2i_back_add: %s\n", e->e_dn, 0, 0); - /* nobody else can add until we lock our parent */ - ldap_pvt_thread_mutex_lock(&li->li_add_mutex); - if ( ( bdb2i_dn2id( be, e->e_ndn ) ) != NOID ) { - ldap_pvt_thread_mutex_unlock(&li->li_add_mutex); entry_free( e ); send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" ); return( -1 ); } if ( global_schemacheck && oc_schema_check( e ) != 0 ) { - ldap_pvt_thread_mutex_unlock(&li->li_add_mutex); - Debug( LDAP_DEBUG_TRACE, "entry failed schema check\n", 0, 0, 0 ); @@ -60,7 +54,6 @@ bdb2i_back_add_internal( /* get parent with writer lock */ if ( (p = bdb2i_dn2entry_w( be, pdn, &matched )) == NULL ) { - ldap_pvt_thread_mutex_unlock(&li->li_add_mutex); Debug( LDAP_DEBUG_TRACE, "parent does not exist\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_NO_SUCH_OBJECT, @@ -75,9 +68,6 @@ bdb2i_back_add_internal( return -1; } - /* don't need the add lock anymore */ - ldap_pvt_thread_mutex_unlock(&li->li_add_mutex); - free(pdn); if ( matched != NULL ) { @@ -102,7 +92,6 @@ bdb2i_back_add_internal( } else { /* no parent, must be adding entry to root */ if ( ! be_isroot( be, op->o_ndn ) ) { - ldap_pvt_thread_mutex_unlock(&li->li_add_mutex); Debug( LDAP_DEBUG_TRACE, "no parent & not root\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS, @@ -111,101 +100,100 @@ bdb2i_back_add_internal( entry_free( e ); return -1; } - - /* - * no parent, acquire the root write lock - * and release the add lock. - */ - ldap_pvt_thread_mutex_lock(&li->li_root_mutex); - rootlock = 1; - ldap_pvt_thread_mutex_unlock(&li->li_add_mutex); - } - - /* acquire required reader/writer lock */ - if (entry_rdwr_lock(e, 1)) { - if( p != NULL) { - /* free parent and writer lock */ - bdb2i_cache_return_entry_w( &li->li_cache, p ); - } - - if ( rootlock ) { - /* release root lock */ - ldap_pvt_thread_mutex_unlock(&li->li_root_mutex); - } - - Debug( LDAP_DEBUG_ANY, "add: could not lock entry\n", - 0, 0, 0 ); - - entry_free(e); - - send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); - return( -1 ); } e->e_id = bdb2i_next_id( be ); /* - * Try to add the entry to the cache, assign it a new dnid - * This should only fail if the entry already exists. + * Try to add the entry to the cache, assign it a new dnid. */ + bdb2i_start_timing( be->bd_info, &time1 ); + + rc = bdb2i_cache_add_entry_rw( &li->li_cache, e, CACHE_WRITE_LOCK ); - if ( bdb2i_cache_add_entry_lock( &li->li_cache, e, ENTRY_STATE_CREATING ) - != 0 ) { + bdb2i_stop_timing( be->bd_info, time1, "ADD-CACHE", conn, op ); + + if ( rc != 0 ) { if( p != NULL) { /* free parent and writer lock */ bdb2i_cache_return_entry_w( &li->li_cache, p ); } - if ( rootlock ) { - /* release root lock */ - ldap_pvt_thread_mutex_unlock(&li->li_root_mutex); - } Debug( LDAP_DEBUG_ANY, "cache_add_entry_lock failed\n", 0, 0, 0 ); + + /* return the id */ bdb2i_next_id_return( be, e->e_id ); - entry_rdwr_unlock(e, 1); + /* free the entry */ entry_free( e ); - send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" ); + if(rc > 0) { + send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" ); + } else { + send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); + } + return( -1 ); } + rc = -1; + /* * add it to the id2children index for the parent */ + bdb2i_start_timing( be->bd_info, &time1 ); + if ( bdb2i_id2children_add( be, p, e ) != 0 ) { Debug( LDAP_DEBUG_TRACE, "bdb2i_id2children_add failed\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); + bdb2i_stop_timing( be->bd_info, time1, "ADD-ID2CHILDREN", conn, op ); + goto return_results; } + bdb2i_stop_timing( be->bd_info, time1, "ADD-ID2CHILDREN", conn, op ); + /* * Add the entry to the attribute indexes, then add it to * the id2children index, dn2id index, and the id2entry index. */ + bdb2i_start_timing( be->bd_info, &time1 ); + /* attribute indexes */ if ( bdb2i_index_add_entry( be, e ) != 0 ) { Debug( LDAP_DEBUG_TRACE, "bdb2i_index_add_entry failed\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); + bdb2i_stop_timing( be->bd_info, time1, "ADD-INDEX", conn, op ); + goto return_results; } + bdb2i_stop_timing( be->bd_info, time1, "ADD-INDEX", conn, op ); + + bdb2i_start_timing( be->bd_info, &time1 ); + /* dn2id index */ if ( bdb2i_dn2id_add( be, e->e_ndn, e->e_id ) != 0 ) { Debug( LDAP_DEBUG_TRACE, "bdb2i_dn2id_add failed\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); + bdb2i_stop_timing( be->bd_info, time1, "ADD-DN2ID", conn, op ); + goto return_results; } + bdb2i_stop_timing( be->bd_info, time1, "ADD-DN2ID", conn, op ); + + bdb2i_start_timing( be->bd_info, &time1 ); + /* id2entry index */ if ( bdb2i_id2entry_add( be, e ) != 0 ) { Debug( LDAP_DEBUG_TRACE, "bdb2i_id2entry_add failed\n", 0, @@ -213,9 +201,13 @@ bdb2i_back_add_internal( (void) bdb2i_dn2id_delete( be, e->e_ndn ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); + bdb2i_stop_timing( be->bd_info, time1, "ADD-ID2ENTRY", conn, op ); + goto return_results; } + bdb2i_stop_timing( be->bd_info, time1, "ADD-ID2ENTRY", conn, op ); + send_ldap_result( conn, op, LDAP_SUCCESS, "", "" ); rc = 0; @@ -223,16 +215,8 @@ return_results:; if (p != NULL) { /* free parent and writer lock */ bdb2i_cache_return_entry_w( &li->li_cache, p ); - - } - - if ( rootlock ) { - /* release root lock */ - ldap_pvt_thread_mutex_unlock(&li->li_root_mutex); } - bdb2i_cache_set_state( &li->li_cache, e, 0 ); - /* free entry and writer lock */ bdb2i_cache_return_entry_w( &li->li_cache, e ); @@ -248,40 +232,37 @@ bdb2_back_add( Entry *e ) { - DB_LOCK lock; + DB_LOCK lock; struct ldbminfo *li = (struct ldbminfo *) be->be_private; + struct timeval time1, time2; + int ret; - struct timeval time1, time2; - char *elapsed_time; - int ret; - - gettimeofday( &time1, NULL ); + bdb2i_start_timing( be->bd_info, &time1 ); - if ( bdb2i_enter_backend_w( get_dbenv( be ), &lock ) != 0 ) { + if ( bdb2i_enter_backend_w( &lock ) != 0 ) { send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" ); return( -1 ); } + bdb2i_start_timing( be->bd_info, &time2 ); + /* check, if a new default attribute index will be created, in which case we have to open the index file BEFORE TP */ - if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) ) - bdb2i_check_default_attr_index_add( li, e ); + switch ( slapMode ) { + case SLAP_SERVER_MODE: + case SLAP_TIMEDSERVER_MODE: + case SLAP_TOOL_MODE: + case SLAP_TOOLID_MODE: + bdb2i_check_default_attr_index_add( li, e ); + break; + } ret = bdb2i_back_add_internal( be, conn, op, e ); - - (void) bdb2i_leave_backend( get_dbenv( be ), lock ); - - if ( bdb2i_do_timing ) { - - gettimeofday( &time2, NULL); - elapsed_time = bdb2i_elapsed( time1, time2 ); - Debug( LDAP_DEBUG_ANY, "conn=%d op=%d ADD elapsed=%s\n", - conn->c_connid, op->o_opid, elapsed_time ); - free( elapsed_time ); - - } + bdb2i_stop_timing( be->bd_info, time2, "ADD-INTERN", conn, op ); + (void) bdb2i_leave_backend_w( lock ); + bdb2i_stop_timing( be->bd_info, time1, "ADD", conn, op ); return( ret ); }