From: Howard Chu Date: Fri, 7 Dec 2007 11:27:57 +0000 (+0000) Subject: ITS#5161 make sure accesslog_response is called for abandoned writes X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~20^2~337 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=54a3ef323bba5e02738c07ebf065420e5891876d;p=openldap ITS#5161 make sure accesslog_response is called for abandoned writes This probably needs to be cleaned up more. There should be a log schema flag that indicates that an op was abandoned. --- diff --git a/servers/slapd/overlays/accesslog.c b/servers/slapd/overlays/accesslog.c index ff04ea5dd0..90205ca45c 100644 --- a/servers/slapd/overlays/accesslog.c +++ b/servers/slapd/overlays/accesslog.c @@ -67,6 +67,7 @@ typedef struct log_info { Entry *li_old; log_attr *li_oldattrs; int li_success; + int li_unlock; ldap_pvt_thread_rmutex_t li_op_rmutex; ldap_pvt_thread_mutex_t li_log_mutex; } log_info; @@ -1341,6 +1342,7 @@ static int accesslog_response(Operation *op, SlapReply *rs) { ldap_pvt_thread_mutex_lock( &li->li_log_mutex ); old = li->li_old; li->li_old = NULL; + li->li_unlock = 0; ldap_pvt_thread_rmutex_unlock( &li->li_op_rmutex, op->o_tid ); } @@ -1686,6 +1688,25 @@ accesslog_op_bind( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } +static int +accesslog_mod_cleanup( Operation *op, SlapReply *rs ) +{ + slap_callback *sc = op->o_callback; + slap_overinst *on = sc->sc_private; + log_info *li = on->on_bi.bi_private; + op->o_callback = sc->sc_next; + + op->o_tmpfree( sc, op->o_tmpmemctx ); + + if ( li->li_unlock ) { + BackendInfo *bi = op->o_bd->bd_info; + op->o_bd->bd_info = (BackendInfo *)on; + accesslog_response( op, rs ); + op->o_bd->bd_info = bi; + } + return 0; +} + static int accesslog_op_mod( Operation *op, SlapReply *rs ) { @@ -1693,7 +1714,15 @@ accesslog_op_mod( Operation *op, SlapReply *rs ) log_info *li = on->on_bi.bi_private; if ( li->li_ops & LOG_OP_WRITES ) { + slap_callback *cb = op->o_tmpalloc( sizeof( slap_callback ), op->o_tmpmemctx ); + cb->sc_cleanup = accesslog_mod_cleanup; + cb->sc_response = NULL; + cb->sc_private = on; + cb->sc_next = op->o_callback; + op->o_callback = cb; + ldap_pvt_thread_rmutex_lock( &li->li_op_rmutex, op->o_tid ); + li->li_unlock = 1; if ( li->li_oldf && ( op->o_tag == LDAP_REQ_DELETE || op->o_tag == LDAP_REQ_MODIFY || ( op->o_tag == LDAP_REQ_MODRDN && li->li_oldattrs ))) {