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

Re: (ITS#5488) syncrepl received contextCSN not passed on to syncprov consumers



rein@OpenLDAP.org wrote:
> Full_Name: Rein Tollevik
> Version: CVS head
> OS:
> URL: ftp://ftp.openldap.org/incoming/
> Submission from: (NULL) (81.93.160.250)
> Submitted by: rein
>
>
> When syncrepl and syncprov are both used on a glue database, the
> contextCSN received from the syncrepl producers are not passed on to the
> syncprov consumers when changes in subordinate databases are received.
> The reason is that syncrepl queues the CSNs in the glue backend, while
> syncprov fetches them from the backend where the changes are made.  As a
> consequence, the consumers will be passed a cookie without any csn
> value.
>
> My first attempt at fixing this was to change syncprov to fetch the
> queued csn values from the glue backend where it was used.  But that
> failed as other modules queues the csn values in their own backend when
> they changes things.

What other modules? Generally there cannot be any other sources of changes.

> Instead I changed ctxcsn.c so that it always
> queues them in the glue backend where syncprov is used.  But I don't
> feel that my understanding of this stuff is good enough to be sure that
> this is the optimal solution..

I definitely don't like references to the syncprov overlay appearing in main 
slapd code like that. We need a different solution.

At one point in the past, I had changed syncrepl.c to queue the CSNs in both 
places, but that seemed rather sloppy. Still, it may work best here.

> Btw, in syncprov_checkpoint() there is a similar SLAP_GLUE_SUBORDINATE
> test, should that have included an overlay_is_inst() clause as well?

Perhaps. You would have to use op->o_bd->bd_self instead of op->o_bd on that call.

> Rein Tollevik
> Basefarm AS
>
> Index: OpenLDAP/servers/slapd/ctxcsn.c
> diff -u OpenLDAP/servers/slapd/ctxcsn.c:1.1.1.11
> OpenLDAP/servers/slapd/ctxcsn.c:1.2
> --- OpenLDAP/servers/slapd/ctxcsn.c:1.1.1.11	Sat Mar 22 16:47:49 2008
> +++ OpenLDAP/servers/slapd/ctxcsn.c	Wed Apr 30 19:44:25 2008
> @@ -37,67 +37,78 @@
>   )
>   {
>   	struct slap_csn_entry *csne, *committed_csne = NULL;
> +	Backend *be = op->o_bd;
>
>   	if ( maxcsn ) {
>   		BER_BVZERO( maxcsn );
>   	}
>
> -	ldap_pvt_thread_mutex_lock( op->o_bd->be_pcl_mutexp );
> +	if ( SLAP_GLUE_SUBORDINATE( be )&&  !overlay_is_inst( be, "syncprov" ))
> +		be = select_backend(&be->be_nsuffix[0], 1 );
> +	ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
>
> -	LDAP_TAILQ_FOREACH( csne, op->o_bd->be_pending_csn_list, ce_csn_link ) {
> +	LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
>   		if ( csne->ce_opid == op->o_opid&&  csne->ce_connid == op->o_connid ) {
>   			csne->ce_state = SLAP_CSN_COMMIT;
>   			break;
>   		}
>   	}
>
> -	LDAP_TAILQ_FOREACH( csne, op->o_bd->be_pending_csn_list, ce_csn_link ) {
> +	LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
>   		if ( csne->ce_state == SLAP_CSN_COMMIT ) committed_csne = csne;
>   		if ( csne->ce_state == SLAP_CSN_PENDING ) break;
>   	}
>
>   	if ( committed_csne&&  maxcsn ) *maxcsn = committed_csne->ce_csn;
> -	ldap_pvt_thread_mutex_unlock( op->o_bd->be_pcl_mutexp );
> +	ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
>   }
>
>   void
>   slap_rewind_commit_csn( Operation *op )
>   {
>   	struct slap_csn_entry *csne;
> +	Backend *be = op->o_bd;
>
> -	ldap_pvt_thread_mutex_lock( op->o_bd->be_pcl_mutexp );
> +	if ( SLAP_GLUE_SUBORDINATE( be )&&  !overlay_is_inst( be, "syncprov" ))
> +		be = select_backend(&be->be_nsuffix[0], 1 );
> +	ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
>
> -	LDAP_TAILQ_FOREACH( csne, op->o_bd->be_pending_csn_list, ce_csn_link ) {
> +	LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
>   		if ( csne->ce_opid == op->o_opid&&  csne->ce_connid == op->o_connid ) {
>   			csne->ce_state = SLAP_CSN_PENDING;
>   			break;
>   		}
>   	}
>
> -	ldap_pvt_thread_mutex_unlock( op->o_bd->be_pcl_mutexp );
> +	ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
>   }
>
>   void
>   slap_graduate_commit_csn( Operation *op )
>   {
>   	struct slap_csn_entry *csne;
> +	Backend *be;
>
>   	if ( op == NULL ) return;
>   	if ( op->o_bd == NULL ) return;
>
> +	be = op->o_bd;
> +	if ( SLAP_GLUE_SUBORDINATE( be )&&  !overlay_is_inst( be, "syncprov" ))
> +		be = select_backend(&be->be_nsuffix[0], 1 );
> +
>   #if 0
>   	/* it is NULL when we get here from the frontendDB;
>   	 * alternate fix: initialize frontendDB like all other backends */
> -	assert( op->o_bd->be_pcl_mutexp != NULL );
> +	assert( be->be_pcl_mutexp != NULL );
>   #endif
>   	
> -	if ( op->o_bd->be_pcl_mutexp == NULL ) return;
> +	if ( be->be_pcl_mutexp == NULL ) return;
>
> -	ldap_pvt_thread_mutex_lock( op->o_bd->be_pcl_mutexp );
> +	ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
>
> -	LDAP_TAILQ_FOREACH( csne, op->o_bd->be_pending_csn_list, ce_csn_link ) {
> +	LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
>   		if ( csne->ce_opid == op->o_opid&&  csne->ce_connid == op->o_connid ) {
> -			LDAP_TAILQ_REMOVE( op->o_bd->be_pending_csn_list,
> +			LDAP_TAILQ_REMOVE( be->be_pending_csn_list,
>   				csne, ce_csn_link );
>   			Debug( LDAP_DEBUG_SYNC, "slap_graduate_commit_csn: removing %p %s\n",
>   				csne->ce_csn.bv_val, csne->ce_csn.bv_val, 0 );
> @@ -110,7 +121,7 @@
>   		}
>   	}
>
> -	ldap_pvt_thread_mutex_unlock( op->o_bd->be_pcl_mutexp );
> +	ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
>
>   	return;
>   }
> @@ -161,22 +172,25 @@
>   	struct berval *csn )
>   {
>   	struct slap_csn_entry *pending;
> +	Backend *be = op->o_bd;
>
>   	pending = (struct slap_csn_entry *) ch_calloc( 1,
>   			sizeof( struct slap_csn_entry ));
>
>   	Debug( LDAP_DEBUG_SYNC, "slap_queue_csn: queing %p %s\n", csn->bv_val,
> csn->bv_val, 0 );
>
> -	ldap_pvt_thread_mutex_lock( op->o_bd->be_pcl_mutexp );
> +	if ( SLAP_GLUE_SUBORDINATE( be )&&  !overlay_is_inst( be, "syncprov" ))
> +		be = select_backend(&be->be_nsuffix[0], 1 );
> +	ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
>
>   	ber_dupbv(&pending->ce_csn, csn );
>   	ber_bvreplace_x(&op->o_csn,&pending->ce_csn, op->o_tmpmemctx );
>   	pending->ce_connid = op->o_connid;
>   	pending->ce_opid = op->o_opid;
>   	pending->ce_state = SLAP_CSN_PENDING;
> -	LDAP_TAILQ_INSERT_TAIL( op->o_bd->be_pending_csn_list,
> +	LDAP_TAILQ_INSERT_TAIL( be->be_pending_csn_list,
>   		pending, ce_csn_link );
> -	ldap_pvt_thread_mutex_unlock( op->o_bd->be_pcl_mutexp );
> +	ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
>   }
>
>   int
>
>
>


-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/