From: Kurt Zeilenga Date: Wed, 23 Jun 2004 06:56:23 +0000 (+0000) Subject: Rework pre/post read controls to handle retry conditions... X-Git-Tag: OPENDLAP_REL_ENG_2_2_MP~181 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=8bca3b42f9842c01b2224d74c563ecf9e3193f73;p=openldap Rework pre/post read controls to handle retry conditions... (and plug leaks) --- diff --git a/servers/slapd/back-bdb/add.c b/servers/slapd/back-bdb/add.c index a40c68ac8a..67a24b73d0 100644 --- a/servers/slapd/back-bdb/add.c +++ b/servers/slapd/back-bdb/add.c @@ -49,6 +49,7 @@ bdb_add(Operation *op, SlapReply *rs ) Entry *ctxcsn_e; int ctxcsn_added = 0; + LDAPControl **postread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; int num_ctrls = 0; @@ -60,6 +61,8 @@ bdb_add(Operation *op, SlapReply *rs ) op->oq_add.rs_e->e_name.bv_val, 0, 0); #endif + ctrls[num_ctrls] = 0; + /* check entry's schema */ rs->sr_err = entry_schema_check( op->o_bd, op->oq_add.rs_e, NULL, &rs->sr_text, textbuf, textlen ); @@ -447,8 +450,12 @@ retry: /* transaction retry */ /* post-read */ if( op->o_postread ) { + if( postread_ctrl == NULL ) { + postread_ctrl = &ctrls[num_ctrls++]; + ctrls[num_ctrls] = NULL; + } if ( slap_read_controls( op, rs, op->oq_add.rs_e, - &slap_post_read_bv, &ctrls[num_ctrls] ) ) + &slap_post_read_bv, postread_ctrl ) ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, @@ -459,9 +466,6 @@ retry: /* transaction retry */ #endif goto return_results; } - ctrls[++num_ctrls] = NULL; - op->o_postread = 0; /* prevent redo on retry */ - /* FIXME: should read entry on the last retry */ } if ( op->o_noop ) { @@ -557,5 +561,9 @@ done: op->o_private = NULL; } + if( postread_ctrl != NULL ) { + slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + slap_sl_free( *postread_ctrl, &op->o_tmpmemctx ); + } return rs->sr_err; } diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index e7fda3acf3..b203488a5f 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -48,14 +48,18 @@ bdb_delete( Operation *op, SlapReply *rs ) Entry *ctxcsn_e; int ctxcsn_added = 0; + LDAPControl **preread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; int num_ctrls = 0; int parent_is_glue = 0; int parent_is_leaf = 0; + ctrls[num_ctrls] = 0; + #ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ARGS, "==> bdb_delete: %s\n", op->o_req_dn.bv_val, 0, 0 ); + LDAP_LOG ( OPERATION, ARGS, "==> bdb_delete: %s\n", + op->o_req_dn.bv_val, 0, 0 ); #else Debug( LDAP_DEBUG_ARGS, "==> bdb_delete: %s\n", op->o_req_dn.bv_val, 0, 0 ); @@ -346,8 +350,12 @@ retry: /* transaction retry */ /* pre-read */ if( op->o_preread ) { + if( preread_ctrl == NULL ) { + preread_ctrl = &ctrls[num_ctrls++]; + ctrls[num_ctrls] = NULL; + } if( slap_read_controls( op, rs, e, - &slap_pre_read_bv, &ctrls[num_ctrls] ) ) + &slap_pre_read_bv, preread_ctrl ) ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, @@ -358,9 +366,6 @@ retry: /* transaction retry */ #endif goto return_results; } - ctrls[++num_ctrls] = NULL; - op->o_preread = 0; /* prevent redo on retry */ - /* FIXME: should read entry on the last retry */ } /* nested transaction */ @@ -637,5 +642,9 @@ done: op->o_private = NULL; } + if( preread_ctrl != NULL ) { + slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + slap_sl_free( *preread_ctrl, &op->o_tmpmemctx ); + } return rs->sr_err; } diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c index eed52e6034..b2a14b0228 100644 --- a/servers/slapd/back-bdb/modify.c +++ b/servers/slapd/back-bdb/modify.c @@ -353,6 +353,8 @@ bdb_modify( Operation *op, SlapReply *rs ) int num_retries = 0; + LDAPControl **preread_ctrl = NULL; + LDAPControl **postread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; int num_ctrls = 0; @@ -364,11 +366,15 @@ bdb_modify( Operation *op, SlapReply *rs ) int ctxcsn_added = 0; #ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ENTRY, "bdb_modify: %s\n", op->o_req_dn.bv_val, 0, 0 ); + LDAP_LOG ( OPERATION, ENTRY, "bdb_modify: %s\n", + op->o_req_dn.bv_val, 0, 0 ); #else - Debug( LDAP_DEBUG_ARGS, "bdb_modify: %s\n", op->o_req_dn.bv_val, 0, 0 ); + Debug( LDAP_DEBUG_ARGS, "bdb_modify: %s\n", + op->o_req_dn.bv_val, 0, 0 ); #endif + ctrls[num_ctrls] = NULL; + if( 0 ) { retry: /* transaction retry */ if( e != NULL ) { @@ -462,7 +468,9 @@ retry: /* transaction retry */ e = ei->bei_e; /* acquire and lock entry */ /* FIXME: dn2entry() should return non-glue entry */ - if (( rs->sr_err == DB_NOTFOUND ) || ( !manageDSAit && e && is_entry_glue( e ))) { + if (( rs->sr_err == DB_NOTFOUND ) || + ( !manageDSAit && e && is_entry_glue( e ))) + { if ( e != NULL ) { rs->sr_matched = ch_strdup( e->e_dn ); rs->sr_ref = is_entry_referral( e ) @@ -505,7 +513,9 @@ retry: /* transaction retry */ rs->sr_ref = get_entry_referrals( op, e ); #ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, DETAIL1, "bdb_modify: entry is referral\n", 0, 0, 0 ); + LDAP_LOG ( OPERATION, DETAIL1, + "bdb_modify: entry is referral\n", + 0, 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "bdb_modify: entry is referral\n", @@ -538,8 +548,12 @@ retry: /* transaction retry */ } if( op->o_preread ) { + if( preread_ctrl == NULL ) { + preread_ctrl = &ctrls[num_ctrls++]; + ctrls[num_ctrls] = NULL; + } if ( slap_read_controls( op, rs, e, - &slap_pre_read_bv, &ctrls[num_ctrls] ) ) + &slap_pre_read_bv, preread_ctrl ) ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, @@ -550,9 +564,6 @@ retry: /* transaction retry */ #endif goto return_results; } - ctrls[++num_ctrls] = NULL; - op->o_preread = 0; /* prevent redo on retry */ - /* FIXME: should read entry on the last retry */ } /* nested transaction */ @@ -562,7 +573,8 @@ retry: /* transaction retry */ if( rs->sr_err != 0 ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, ERR, - "bdb_modify: txn_begin(2) failed: %s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 ); + "bdb_modify: txn_begin(2) failed: %s (%d)\n", + db_strerror(rs->sr_err), rs->sr_err, 0 ); #else Debug( LDAP_DEBUG_TRACE, "bdb_modify: txn_begin(2) failed: %s (%d)\n", @@ -635,8 +647,12 @@ retry: /* transaction retry */ } if( op->o_postread ) { + if( postread_ctrl == NULL ) { + postread_ctrl = &ctrls[num_ctrls++]; + ctrls[num_ctrls] = NULL; + } if( slap_read_controls( op, rs, e, - &slap_post_read_bv, &ctrls[num_ctrls] ) ) + &slap_post_read_bv, postread_ctrl ) ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, @@ -647,9 +663,6 @@ retry: /* transaction retry */ #endif goto return_results; } - ctrls[++num_ctrls] = NULL; - op->o_postread = 0; /* prevent redo on retry */ - /* FIXME: should read entry on the last retry */ } if( op->o_noop ) { @@ -755,5 +768,14 @@ done: if( e != NULL ) { bdb_unlocked_cache_return_entry_w (&bdb->bi_cache, e); } + + if( preread_ctrl != NULL ) { + slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + slap_sl_free( *preread_ctrl, &op->o_tmpmemctx ); + } + if( postread_ctrl != NULL ) { + slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + slap_sl_free( *postread_ctrl, &op->o_tmpmemctx ); + } return rs->sr_err; } diff --git a/servers/slapd/back-bdb/modrdn.c b/servers/slapd/back-bdb/modrdn.c index 5de38fa7e7..2904d1865f 100644 --- a/servers/slapd/back-bdb/modrdn.c +++ b/servers/slapd/back-bdb/modrdn.c @@ -60,6 +60,8 @@ bdb_modrdn( Operation *op, SlapReply *rs ) int num_retries = 0; + LDAPControl **preread_ctrl = NULL; + LDAPControl **postread_ctrl = NULL; LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS]; int num_ctrls = 0; @@ -73,6 +75,8 @@ bdb_modrdn( Operation *op, SlapReply *rs ) int parent_is_glue = 0; int parent_is_leaf = 0; + ctrls[num_ctrls] = NULL; + #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, ENTRY, "==>bdb_modrdn(%s,%s,%s)\n", op->o_req_dn.bv_val,op->oq_modrdn.rs_newrdn.bv_val, @@ -789,8 +793,12 @@ retry: /* transaction retry */ } if( op->o_preread ) { + if( preread_ctrl == NULL ) { + preread_ctrl = &ctrls[num_ctrls++]; + ctrls[num_ctrls] = NULL; + } if( slap_read_controls( op, rs, e, - &slap_pre_read_bv, &ctrls[num_ctrls] ) ) + &slap_pre_read_bv, preread_ctrl ) ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, @@ -801,9 +809,6 @@ retry: /* transaction retry */ #endif goto return_results; } - ctrls[++num_ctrls] = NULL; - op->o_preread = 0; /* prevent redo on retry */ - /* FIXME: should read entry on the last retry */ } /* nested transaction */ @@ -992,8 +997,12 @@ retry: /* transaction retry */ } if( op->o_postread ) { + if( postread_ctrl == NULL ) { + postread_ctrl = &ctrls[num_ctrls++]; + ctrls[num_ctrls] = NULL; + } if( slap_read_controls( op, rs, e, - &slap_post_read_bv, &ctrls[num_ctrls] ) ) + &slap_post_read_bv, postread_ctrl ) ) { #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, @@ -1004,9 +1013,6 @@ retry: /* transaction retry */ #endif goto return_results; } - ctrls[++num_ctrls] = NULL; - op->o_postread = 0; /* prevent redo on retry */ - /* FIXME: should read entry on the last retry */ } if( op->o_noop ) { @@ -1155,5 +1161,13 @@ done: op->o_private = NULL; } + if( preread_ctrl != NULL ) { + slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + slap_sl_free( *preread_ctrl, &op->o_tmpmemctx ); + } + if( postread_ctrl != NULL ) { + slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + slap_sl_free( *postread_ctrl, &op->o_tmpmemctx ); + } return rs->sr_err; } diff --git a/servers/slapd/result.c b/servers/slapd/result.c index c8a6d17785..ce00f0d661 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -1668,7 +1668,14 @@ int slap_read_controls( c.ldctl_oid = oid->bv_val; c.ldctl_iscritical = 0; - *ctrl = slap_sl_calloc( 1, sizeof(LDAPControl), NULL ); + if ( ctrl == NULL ) { + /* first try */ + *ctrl = (LDAPControl *) slap_sl_calloc( 1, sizeof(LDAPControl), NULL ); + } else { + /* retry: free previous try */ + slap_sl_free( (*ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx ); + } + **ctrl = c; return LDAP_SUCCESS; }