Commit 5d8ece60 authored by Howard Chu's avatar Howard Chu
Browse files

ITS#3549 cleanup abandon/cancel processing

parent 1b244bba
......@@ -75,27 +75,29 @@ do_abandon( Operation *op, SlapReply *rs )
LDAP_STAILQ_FOREACH( o, &op->o_conn->c_ops, o_next ) {
if ( o->o_msgid == id ) {
o->o_abandon = 1;
goto done;
break;
}
}
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 );
goto done;
if ( o ) {
op->orn_msgid = id;
op->o_bd = frontendDB;
rs->sr_err = frontendDB->be_abandon( op, rs );
} else {
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 );
Debug( LDAP_DEBUG_TRACE, "do_abandon: op=%ld %sfound\n",
......
......@@ -32,7 +32,6 @@ int cancel_extop( Operation *op, SlapReply *rs )
{
Operation *o;
int rc;
int found = 0;
int opid;
BerElement *ber;
int i;
......@@ -69,61 +68,53 @@ int cancel_extop( Operation *op, SlapReply *rs )
LDAP_STAILQ_NEXT(o, o_next) = NULL;
op->o_conn->c_n_ops_pending--;
slap_op_free( o );
found = 1;
break;
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
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 ) {
if ( o->o_msgid == opid ) {
found = 1;
o->o_abandon = 1;
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++ ) {
op->o_bd = &backends[i];
if( !op->o_bd->be_cancel ) continue;
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
op->oq_cancel.rs_msgid = opid;
if ( op->o_bd->be_cancel( op, rs ) == 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 ) {
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
rs->sr_text = "message ID already being cancelled";
return LDAP_PROTOCOL_ERROR;
}
op->o_cancel = SLAP_CANCEL_REQ;
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
while ( o->o_cancel == SLAP_CANCEL_REQ ) {
ldap_pvt_thread_yield();
}
while ( op->o_cancel == SLAP_CANCEL_REQ ) {
ldap_pvt_thread_yield();
}
if ( o->o_cancel == SLAP_CANCEL_ACK ) {
rc = LDAP_SUCCESS;
} else {
rc = o->o_cancel;
}
if ( op->o_cancel == SLAP_CANCEL_ACK ) {
rc = LDAP_SUCCESS;
o->o_cancel = SLAP_CANCEL_DONE;
} 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;
}
......@@ -1049,7 +1049,10 @@ operations_error:
}
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 &&
op->o_cancel != SLAP_CANCEL_DONE )
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment