ITS#3549 cleanup abandon/cancel processing

This commit is contained in:
Howard Chu 2005-02-18 01:01:35 +00:00
parent 1b244bbacd
commit 5d8ece605e
3 changed files with 45 additions and 49 deletions

View file

@ -75,27 +75,29 @@ do_abandon( Operation *op, SlapReply *rs )
LDAP_STAILQ_FOREACH( o, &op->o_conn->c_ops, o_next ) { LDAP_STAILQ_FOREACH( o, &op->o_conn->c_ops, o_next ) {
if ( o->o_msgid == id ) { if ( o->o_msgid == id ) {
o->o_abandon = 1; o->o_abandon = 1;
goto done; break;
} }
} }
LDAP_STAILQ_FOREACH( o, &op->o_conn->c_pending_ops, o_next ) { if ( o ) {
if ( o->o_msgid == id ) { op->orn_msgid = id;
LDAP_STAILQ_REMOVE( &op->o_conn->c_pending_ops,
o, slap_op, o_next ); op->o_bd = frontendDB;
LDAP_STAILQ_NEXT(o, o_next) = NULL; rs->sr_err = frontendDB->be_abandon( op, rs );
op->o_conn->c_n_ops_pending--;
slap_op_free( o ); } else {
goto done; LDAP_STAILQ_FOREACH( o, &op->o_conn->c_pending_ops, o_next ) {
if ( o->o_msgid == id ) {
LDAP_STAILQ_REMOVE( &op->o_conn->c_pending_ops,
o, slap_op, o_next );
LDAP_STAILQ_NEXT(o, o_next) = NULL;
op->o_conn->c_n_ops_pending--;
slap_op_free( o );
break;
}
} }
} }
done:
op->orn_msgid = id;
op->o_bd = frontendDB;
rs->sr_err = frontendDB->be_abandon( op, rs );
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
Debug( LDAP_DEBUG_TRACE, "do_abandon: op=%ld %sfound\n", Debug( LDAP_DEBUG_TRACE, "do_abandon: op=%ld %sfound\n",

View file

@ -32,7 +32,6 @@ int cancel_extop( Operation *op, SlapReply *rs )
{ {
Operation *o; Operation *o;
int rc; int rc;
int found = 0;
int opid; int opid;
BerElement *ber; BerElement *ber;
int i; int i;
@ -69,61 +68,53 @@ int cancel_extop( Operation *op, SlapReply *rs )
LDAP_STAILQ_NEXT(o, o_next) = NULL; LDAP_STAILQ_NEXT(o, o_next) = NULL;
op->o_conn->c_n_ops_pending--; op->o_conn->c_n_ops_pending--;
slap_op_free( o ); slap_op_free( o );
found = 1; ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
break; return LDAP_SUCCESS;
} }
} }
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
if ( found ) return LDAP_SUCCESS;
found = 0;
ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
LDAP_STAILQ_FOREACH( o, &op->o_conn->c_ops, o_next ) { LDAP_STAILQ_FOREACH( o, &op->o_conn->c_ops, o_next ) {
if ( o->o_msgid == opid ) { if ( o->o_msgid == opid ) {
found = 1; o->o_abandon = 1;
break; break;
} }
} }
if ( !found ) { ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
if ( o ) {
if ( o->o_cancel != SLAP_CANCEL_NONE ) {
rs->sr_text = "message ID already being cancelled";
return LDAP_PROTOCOL_ERROR;
}
o->o_cancel = SLAP_CANCEL_REQ;
for ( i = 0; i < nbackends; i++ ) { for ( i = 0; i < nbackends; i++ ) {
op->o_bd = &backends[i]; op->o_bd = &backends[i];
if( !op->o_bd->be_cancel ) continue; if( !op->o_bd->be_cancel ) continue;
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
op->oq_cancel.rs_msgid = opid; op->oq_cancel.rs_msgid = opid;
if ( op->o_bd->be_cancel( op, rs ) == LDAP_SUCCESS ) { if ( op->o_bd->be_cancel( op, rs ) == LDAP_SUCCESS ) {
return LDAP_SUCCESS; return LDAP_SUCCESS;
} }
ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
} }
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
rs->sr_text = "message ID not found";
return LDAP_NO_SUCH_OPERATION;
}
if ( op->o_cancel != SLAP_CANCEL_NONE ) { while ( o->o_cancel == SLAP_CANCEL_REQ ) {
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); ldap_pvt_thread_yield();
rs->sr_text = "message ID already being cancelled"; }
return LDAP_PROTOCOL_ERROR;
}
op->o_cancel = SLAP_CANCEL_REQ; if ( o->o_cancel == SLAP_CANCEL_ACK ) {
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); rc = LDAP_SUCCESS;
} else {
rc = o->o_cancel;
}
while ( op->o_cancel == SLAP_CANCEL_REQ ) { o->o_cancel = SLAP_CANCEL_DONE;
ldap_pvt_thread_yield();
}
if ( op->o_cancel == SLAP_CANCEL_ACK ) {
rc = LDAP_SUCCESS;
} else { } else {
rc = op->o_cancel; rs->sr_text = "message ID not found";
rc = LDAP_NO_SUCH_OPERATION;
} }
op->o_cancel = SLAP_CANCEL_DONE;
return rc; return rc;
} }

View file

@ -1049,7 +1049,10 @@ operations_error:
} }
if ( op->o_cancel == SLAP_CANCEL_REQ ) { if ( op->o_cancel == SLAP_CANCEL_REQ ) {
op->o_cancel = LDAP_TOO_LATE; if ( rc == SLAPD_ABANDON )
op->o_cancel = SLAP_CANCEL_ACK;
else
op->o_cancel = LDAP_TOO_LATE;
} }
while ( op->o_cancel != SLAP_CANCEL_NONE && while ( op->o_cancel != SLAP_CANCEL_NONE &&
op->o_cancel != SLAP_CANCEL_DONE ) op->o_cancel != SLAP_CANCEL_DONE )