[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#5328) backends sending/setting results



h.b.furuseth@usit.uio.no wrote:
> Full_Name: Hallvard B Furuseth
> Version: HEAD
> OS: Linux
> URL: 
> Submission from: (NULL) (129.240.6.233)
> Submitted by: hallvard
> 
> 
> back-relay's be_extended could send a result, but be_extended should
> only set/return it and leave it to the frontend to send it.
> Just fixed by Pierangelo.
> 
> Looking at the code, some overlays also send results when used as
> be_extended: pcache:pcache_op_privdb(), retcode, rwm, slapi_overlay.
> 
> 
> More about back-relay:
> 
> - it fails to send anything if the Delete operation is not supported.
> 
> - be_abandon, be_chk_referrals and be_operational can return either an
>   LDAP result code, or 0 or 1 (which become success and operationError
>   if they get used as result codes).  I don't know if that matters.
> 
> Back-relay operations can be factored out to something like this:
> 
> int
> relay_back_op(
> 	Operation	*op,
> 	SlapReply	*rs,
> 	BackendDB	*bd,
> 	BI_op_func	*func,
> 	Fail_Type	fail_mode )
> {
> 	int rc = fail_mode;
> 
> 	if ( func ) {
> 		BackendDB	*be = op->o_bd;
> 		slap_callback	cb;
> 
> 		relay_back_add_cb( &cb, op );
> 
> 		op->o_bd = bd;
> 		rc = func( op, rs );
> 		op->o_bd = be;
> 
> 		if ( op->o_callback == &cb ) {
> 			op->o_callback = op->o_callback->sc_next;
> 		}
> 
> 	} else if ( fail_mode > Fail_1 ) {
> 		rc = rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
> 		rs->sr_text = "operation not supported within naming context";
> 		if ( fail_mode == Fail_send ) {
> 			send_ldap_result( op, rs );
> 			rc = 1;
> 		}
> 	}
> 
> 	return rc;
> }
> 
> ...
>   return relay_back_op( op, rs, bd, bd->be_bind,          Fail_send );
>   (void) relay_back_op( op, rs, bd, bd->be_unbind, Fail_0 ); return 0;
>   return relay_back_op( op, rs, bd, bd->be_search,        Fail_send );
>   return relay_back_op( op, rs, bd, bd->be_compare,       Fail_send );
>   return relay_back_op( op, rs, bd, bd->be_modify,        Fail_send );
>   return relay_back_op( op, rs, bd, bd->be_modrdn,        Fail_send );
>   return relay_back_op( op, rs, bd, bd->be_add,           Fail_send );
>   return relay_back_op( op, rs, bd, bd->be_delete,        Fail_send );
>   return relay_back_op( op, rs, bd, bd->be_abandon,       Fail_1 );
>   return relay_back_op( op, rs, bd, bd->be_cancel,        Fail_send );

^^^ cancel should __NOT__ send response, since it's an extended
operation.  On the contrary, it should set op->o_cancel if it couldn't
relay the operation, otherwise the cancel thread would yield forever.

>   return relay_back_op( op, rs, bd, bd->be_extended,      Fail_unwilling );
>   return relay_back_op( op, rs, bd, bd->be_chk_referrals, Fail_0 );
>   return relay_back_op( op, rs, bd, bd->be_operational,   Fail_1 );

I like the idea, but that's slightly too simple.  The reason I didn't
try to synthesize calls like that was the need to also handle more
complex combinations.  For this reason, I'm actually considering the use
of a mask to fine-grain drive the behavior of the helper.

p.



Ing. Pierangelo Masarati
OpenLDAP Core Team

SysNet s.r.l.
via Dossi, 8 - 27100 Pavia - ITALIA
http://www.sys-net.it
---------------------------------------
Office:  +39 02 23998309
Mobile:  +39 333 4963172
Email:   pierangelo.masarati@sys-net.it
---------------------------------------