mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
ITS#7616 defer searches while consumer refreshing
This commit is contained in:
parent
5a08b66141
commit
cf4aa8f9d9
@ -148,6 +148,8 @@ static int syncrepl_add_glue_ancestors(
|
|||||||
/* delta-mmr overlay handler */
|
/* delta-mmr overlay handler */
|
||||||
static int syncrepl_op_modify( Operation *op, SlapReply *rs );
|
static int syncrepl_op_modify( Operation *op, SlapReply *rs );
|
||||||
|
|
||||||
|
static int syncrepl_op_search( Operation *op, SlapReply *rs );
|
||||||
|
|
||||||
/* callback functions */
|
/* callback functions */
|
||||||
static int dn_callback( Operation *, SlapReply * );
|
static int dn_callback( Operation *, SlapReply * );
|
||||||
static int nonpresent_callback( Operation *, SlapReply * );
|
static int nonpresent_callback( Operation *, SlapReply * );
|
||||||
@ -216,16 +218,14 @@ init_syncrepl(syncinfo_t *si)
|
|||||||
if ( !syncrepl_ov.on_bi.bi_type ) {
|
if ( !syncrepl_ov.on_bi.bi_type ) {
|
||||||
syncrepl_ov.on_bi.bi_type = "syncrepl";
|
syncrepl_ov.on_bi.bi_type = "syncrepl";
|
||||||
syncrepl_ov.on_bi.bi_op_modify = syncrepl_op_modify;
|
syncrepl_ov.on_bi.bi_op_modify = syncrepl_op_modify;
|
||||||
|
syncrepl_ov.on_bi.bi_op_search = syncrepl_op_search;
|
||||||
overlay_register( &syncrepl_ov );
|
overlay_register( &syncrepl_ov );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* delta-MMR needs the overlay, nothing else does.
|
if (!overlay_is_inst( si->si_be, syncrepl_ov.on_bi.bi_type )) {
|
||||||
* This must happen before accesslog overlay is configured.
|
|
||||||
*/
|
|
||||||
if ( si->si_syncdata &&
|
|
||||||
!overlay_is_inst( si->si_be, syncrepl_ov.on_bi.bi_type )) {
|
|
||||||
overlay_config( si->si_be, syncrepl_ov.on_bi.bi_type, -1, NULL, NULL );
|
overlay_config( si->si_be, syncrepl_ov.on_bi.bi_type, -1, NULL, NULL );
|
||||||
if ( !ad_reqMod ) {
|
/* delta-MMR needs this. Must happen before accesslog overlay is configured. */
|
||||||
|
if ( si->si_syncdata && !ad_reqMod ) {
|
||||||
const char *text;
|
const char *text;
|
||||||
logschema *ls = &accesslog_sc;
|
logschema *ls = &accesslog_sc;
|
||||||
|
|
||||||
@ -1179,6 +1179,7 @@ do_syncrep2(
|
|||||||
} else {
|
} else {
|
||||||
rc = -2;
|
rc = -2;
|
||||||
}
|
}
|
||||||
|
si->si_refreshDone = 1;
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
case LDAP_RES_INTERMEDIATE:
|
case LDAP_RES_INTERMEDIATE:
|
||||||
@ -2163,6 +2164,31 @@ syncrepl_op_modify( Operation *op, SlapReply *rs )
|
|||||||
return SLAP_CB_CONTINUE;
|
return SLAP_CB_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
syncrepl_op_search( Operation *op, SlapReply *rs )
|
||||||
|
{
|
||||||
|
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
|
||||||
|
syncinfo_t *si;
|
||||||
|
|
||||||
|
/* Allow syncrepl internal searches */
|
||||||
|
if ( op->o_conn->c_conn_idx == -1 )
|
||||||
|
return SLAP_CB_CONTINUE;
|
||||||
|
|
||||||
|
/* Check if any of our consumers are refreshing */
|
||||||
|
for ( si = op->o_bd->be_syncinfo; si; si = si->si_next ) {
|
||||||
|
/* If we have some state, allow other consumers to progress */
|
||||||
|
if ( si->si_cookieState->cs_num > 0 &&
|
||||||
|
op->o_sync > SLAP_CONTROL_IGNORED )
|
||||||
|
return SLAP_CB_CONTINUE;
|
||||||
|
/* If we have any consumer refreshing, reject searches */
|
||||||
|
if ( !si->si_refreshDone ) {
|
||||||
|
send_ldap_error( op, rs, LDAP_BUSY, "syncrepl refresh in progress" );
|
||||||
|
return rs->sr_err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SLAP_CB_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
syncrepl_message_to_op(
|
syncrepl_message_to_op(
|
||||||
syncinfo_t *si,
|
syncinfo_t *si,
|
||||||
|
Loading…
Reference in New Issue
Block a user