version 1.115, 2005/10/06 16:45:53
|
version 1.125, 2005/11/15 17:27:40
|
Line 1
|
Line 1
|
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.114 2005/10/04 00:29:25 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.124 2005/11/07 23:40:20 ando Exp $ */ |
/* syncprov.c - syncrepl provider */ |
/* syncprov.c - syncrepl provider */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
Line 122 typedef struct syncprov_info_t {
|
Line 122 typedef struct syncprov_info_t {
|
int si_chktime; |
int si_chktime; |
int si_numops; /* number of ops since last checkpoint */ |
int si_numops; /* number of ops since last checkpoint */ |
int si_nopres; /* Skip present phase */ |
int si_nopres; /* Skip present phase */ |
|
int si_usehint; /* use reload hint */ |
time_t si_chklast; /* time of last checkpoint */ |
time_t si_chklast; /* time of last checkpoint */ |
Avlnode *si_mods; /* entries being modified */ |
Avlnode *si_mods; /* entries being modified */ |
sessionlog *si_logs; |
sessionlog *si_logs; |
Line 382 findbase_cb( Operation *op, SlapReply *r
|
Line 383 findbase_cb( Operation *op, SlapReply *r
|
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
} |
} |
|
|
|
static Filter generic_filter = { LDAP_FILTER_PRESENT, { 0 }, NULL }; |
|
static struct berval generic_filterstr = BER_BVC("(objectclass=*)"); |
|
|
static int |
static int |
syncprov_findbase( Operation *op, fbase_cookie *fc ) |
syncprov_findbase( Operation *op, fbase_cookie *fc ) |
{ |
{ |
Line 421 syncprov_findbase( Operation *op, fbase_
|
Line 425 syncprov_findbase( Operation *op, fbase_
|
fop.ors_tlimit = SLAP_NO_LIMIT; |
fop.ors_tlimit = SLAP_NO_LIMIT; |
fop.ors_attrs = slap_anlist_no_attrs; |
fop.ors_attrs = slap_anlist_no_attrs; |
fop.ors_attrsonly = 1; |
fop.ors_attrsonly = 1; |
|
fop.ors_filter = &generic_filter; |
|
fop.ors_filterstr = generic_filterstr; |
|
|
fop.o_bd->bd_info = on->on_info->oi_orig; |
fop.o_bd->bd_info = on->on_info->oi_orig; |
rc = fop.o_bd->be_search( &fop, &frs ); |
rc = fop.o_bd->be_search( &fop, &frs ); |
Line 477 syncprov_findbase( Operation *op, fbase_
|
Line 483 syncprov_findbase( Operation *op, fbase_
|
* CSN, and generate Present records for them. We always collect this result |
* CSN, and generate Present records for them. We always collect this result |
* in SyncID sets, even if there's only one match. |
* in SyncID sets, even if there's only one match. |
*/ |
*/ |
#define FIND_MAXCSN 1 |
typedef enum find_csn_t { |
#define FIND_CSN 2 |
FIND_MAXCSN = 1, |
#define FIND_PRESENT 3 |
FIND_CSN = 2, |
|
FIND_PRESENT = 3 |
|
} find_csn_t; |
|
|
static int |
static int |
findmax_cb( Operation *op, SlapReply *rs ) |
findmax_cb( Operation *op, SlapReply *rs ) |
Line 558 findpres_cb( Operation *op, SlapReply *r
|
Line 566 findpres_cb( Operation *op, SlapReply *r
|
} |
} |
|
|
static int |
static int |
syncprov_findcsn( Operation *op, int mode ) |
syncprov_findcsn( Operation *op, find_csn_t mode ) |
{ |
{ |
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; |
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; |
syncprov_info_t *si = on->on_bi.bi_private; |
syncprov_info_t *si = on->on_bi.bi_private; |
Line 728 syncprov_free_syncop( syncops *so )
|
Line 736 syncprov_free_syncop( syncops *so )
|
|
|
/* Send a persistent search response */ |
/* Send a persistent search response */ |
static int |
static int |
syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode) |
syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, |
|
Entry **e, int mode ) |
{ |
{ |
slap_overinst *on = opc->son; |
slap_overinst *on = opc->son; |
|
|
Line 861 syncprov_qtask( void *ctx, void *arg )
|
Line 870 syncprov_qtask( void *ctx, void *arg )
|
struct re_s *rtask = arg; |
struct re_s *rtask = arg; |
syncops *so = rtask->arg; |
syncops *so = rtask->arg; |
slap_overinst *on = so->s_op->o_private; |
slap_overinst *on = so->s_op->o_private; |
char opbuf[OPERATION_BUFFER_SIZE]; |
OperationBuffer opbuf; |
Operation *op; |
Operation *op; |
BackendDB be; |
BackendDB be; |
|
|
op = (Operation *)opbuf; |
op = (Operation *) &opbuf; |
*op = *so->s_op; |
*op = *so->s_op; |
op->o_hdr = (Opheader *)(op+1); |
op->o_hdr = (Opheader *)(op+1); |
op->o_controls = (void **)(op->o_hdr+1); |
op->o_controls = (void **)(op->o_hdr+1); |
Line 911 syncprov_qresp( opcookie *opc, syncops *
|
Line 920 syncprov_qresp( opcookie *opc, syncops *
|
sr->s_dn.bv_len = opc->sdn.bv_len; |
sr->s_dn.bv_len = opc->sdn.bv_len; |
sr->s_mode = mode; |
sr->s_mode = mode; |
sr->s_isreference = opc->sreference; |
sr->s_isreference = opc->sreference; |
sr->s_ndn.bv_val = lutil_strcopy( sr->s_dn.bv_val, opc->sdn.bv_val ); |
sr->s_ndn.bv_val = lutil_strcopy( sr->s_dn.bv_val, |
|
opc->sdn.bv_val ) + 1; |
sr->s_ndn.bv_len = opc->sndn.bv_len; |
sr->s_ndn.bv_len = opc->sndn.bv_len; |
*(sr->s_ndn.bv_val++) = '\0'; |
sr->s_uuid.bv_val = lutil_strcopy( sr->s_ndn.bv_val, |
sr->s_uuid.bv_val = lutil_strcopy( sr->s_ndn.bv_val, opc->sndn.bv_val ); |
opc->sndn.bv_val ) + 1; |
sr->s_uuid.bv_len = opc->suuid.bv_len; |
sr->s_uuid.bv_len = opc->suuid.bv_len; |
*(sr->s_uuid.bv_val++) = '\0'; |
AC_MEMCPY( sr->s_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len ); |
sr->s_csn.bv_val = lutil_strcopy( sr->s_uuid.bv_val, opc->suuid.bv_val ); |
sr->s_csn.bv_val = sr->s_uuid.bv_val + sr->s_uuid.bv_len + 1; |
sr->s_csn.bv_len = opc->sctxcsn.bv_len; |
sr->s_csn.bv_len = opc->sctxcsn.bv_len; |
strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val ); |
strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val ); |
|
|
Line 1212 syncprov_checkpoint( Operation *op, Slap
|
Line 1222 syncprov_checkpoint( Operation *op, Slap
|
syncprov_info_t *si = on->on_bi.bi_private; |
syncprov_info_t *si = on->on_bi.bi_private; |
Modifications mod; |
Modifications mod; |
Operation opm; |
Operation opm; |
|
SlapReply rsm; |
struct berval bv[2]; |
struct berval bv[2]; |
slap_callback cb = {0}; |
slap_callback cb = {0}; |
int manage = get_manageDSAit(op); |
|
|
|
mod.sml_values = bv; |
mod.sml_values = bv; |
bv[1].bv_val = NULL; |
bv[1].bv_val = NULL; |
Line 1234 syncprov_checkpoint( Operation *op, Slap
|
Line 1244 syncprov_checkpoint( Operation *op, Slap
|
opm.o_req_ndn = op->o_bd->be_nsuffix[0]; |
opm.o_req_ndn = op->o_bd->be_nsuffix[0]; |
opm.o_bd->bd_info = on->on_info->oi_orig; |
opm.o_bd->bd_info = on->on_info->oi_orig; |
opm.o_managedsait = SLAP_CONTROL_NONCRITICAL; |
opm.o_managedsait = SLAP_CONTROL_NONCRITICAL; |
opm.o_bd->be_modify( &opm, rs ); |
opm.o_bd->be_modify( &opm, &rsm ); |
opm.o_managedsait = manage; |
if ( mod.sml_next != NULL ) { |
|
slap_mods_free( mod.sml_next, 1 ); |
|
} |
} |
} |
|
|
static void |
static void |
Line 1942 syncprov_op_search( Operation *op, SlapR
|
Line 1954 syncprov_op_search( Operation *op, SlapR
|
/* Is the CSN still present in the database? */ |
/* Is the CSN still present in the database? */ |
if ( syncprov_findcsn( op, FIND_CSN ) != LDAP_SUCCESS ) { |
if ( syncprov_findcsn( op, FIND_CSN ) != LDAP_SUCCESS ) { |
/* No, so a reload is required */ |
/* No, so a reload is required */ |
#if 0 /* the consumer doesn't seem to send this hint */ |
/* the 2.2 consumer doesn't send this hint */ |
if ( op->o_sync_rhint == 0 ) { |
if ( si->si_usehint && srs->sr_rhint == 0 ) { |
send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" ); |
send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" ); |
return rs->sr_err; |
return rs->sr_err; |
} |
} |
#endif |
|
} else { |
} else { |
gotstate = 1; |
gotstate = 1; |
/* If changed and doing Present lookup, send Present UUIDs */ |
/* If changed and doing Present lookup, send Present UUIDs */ |
Line 2068 syncprov_operational(
|
Line 2079 syncprov_operational(
|
enum { |
enum { |
SP_CHKPT = 1, |
SP_CHKPT = 1, |
SP_SESSL, |
SP_SESSL, |
SP_NOPRES |
SP_NOPRES, |
|
SP_USEHINT |
}; |
}; |
|
|
static ConfigDriver sp_cf_gen; |
static ConfigDriver sp_cf_gen; |
Line 2086 static ConfigTable spcfg[] = {
|
Line 2098 static ConfigTable spcfg[] = {
|
sp_cf_gen, "( OLcfgOvAt:1.3 NAME 'olcSpNoPresent' " |
sp_cf_gen, "( OLcfgOvAt:1.3 NAME 'olcSpNoPresent' " |
"DESC 'Omit Present phase processing' " |
"DESC 'Omit Present phase processing' " |
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, |
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, |
|
{ "syncprov-reloadhint", NULL, 2, 2, 0, ARG_ON_OFF|ARG_MAGIC|SP_USEHINT, |
|
sp_cf_gen, "( OLcfgOvAt:1.4 NAME 'olcSpReloadHint' " |
|
"DESC 'Observe Reload Hint in Request control' " |
|
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, |
{ NULL, NULL, 0, 0, 0, ARG_IGNORED } |
{ NULL, NULL, 0, 0, 0, ARG_IGNORED } |
}; |
}; |
|
|
Line 2133 sp_cf_gen(ConfigArgs *c)
|
Line 2149 sp_cf_gen(ConfigArgs *c)
|
rc = 1; |
rc = 1; |
} |
} |
break; |
break; |
|
case SP_USEHINT: |
|
if ( si->si_usehint ) { |
|
c->value_int = 1; |
|
} else { |
|
rc = 1; |
|
} |
|
break; |
} |
} |
return rc; |
return rc; |
} else if ( c->op == LDAP_MOD_DELETE ) { |
} else if ( c->op == LDAP_MOD_DELETE ) { |
Line 2153 sp_cf_gen(ConfigArgs *c)
|
Line 2176 sp_cf_gen(ConfigArgs *c)
|
else |
else |
rc = LDAP_NO_SUCH_ATTRIBUTE; |
rc = LDAP_NO_SUCH_ATTRIBUTE; |
break; |
break; |
|
case SP_USEHINT: |
|
if ( si->si_usehint ) |
|
si->si_usehint = 0; |
|
else |
|
rc = LDAP_NO_SUCH_ATTRIBUTE; |
|
break; |
} |
} |
return rc; |
return rc; |
} |
} |
Line 2187 sp_cf_gen(ConfigArgs *c)
|
Line 2216 sp_cf_gen(ConfigArgs *c)
|
case SP_NOPRES: |
case SP_NOPRES: |
si->si_nopres = c->value_int; |
si->si_nopres = c->value_int; |
break; |
break; |
|
case SP_USEHINT: |
|
si->si_usehint = c->value_int; |
|
break; |
} |
} |
return rc; |
return rc; |
} |
} |
Line 2216 syncprov_db_open(
|
Line 2248 syncprov_db_open(
|
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
|
|
Connection conn; |
Connection conn; |
char opbuf[OPERATION_BUFFER_SIZE]; |
OperationBuffer opbuf; |
char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
Operation *op = (Operation *)opbuf; |
Operation *op = (Operation *) &opbuf; |
Entry *e; |
Entry *e; |
Attribute *a; |
Attribute *a; |
int rc; |
int rc; |
Line 2274 syncprov_db_open(
|
Line 2306 syncprov_db_open(
|
} |
} |
|
|
if ( BER_BVISEMPTY( &si->si_ctxcsn ) ) { |
if ( BER_BVISEMPTY( &si->si_ctxcsn ) ) { |
slap_get_csn( op, si->si_ctxcsnbuf, sizeof(si->si_ctxcsnbuf), |
si->si_ctxcsn.bv_len = sizeof( si->si_ctxcsnbuf ); |
&si->si_ctxcsn, 0 ); |
slap_get_csn( op, &si->si_ctxcsn, 0 ); |
} |
} |
|
|
/* If our ctxcsn is different from what was read from the root |
/* If our ctxcsn is different from what was read from the root |
Line 2306 syncprov_db_close(
|
Line 2338 syncprov_db_close(
|
} |
} |
if ( si->si_numops ) { |
if ( si->si_numops ) { |
Connection conn; |
Connection conn; |
char opbuf[OPERATION_BUFFER_SIZE]; |
OperationBuffer opbuf; |
Operation *op = (Operation *)opbuf; |
Operation *op = (Operation *) &opbuf; |
SlapReply rs = {REP_RESULT}; |
SlapReply rs = {REP_RESULT}; |
void *thrctx; |
void *thrctx; |
|
|
Line 2434 static int syncprov_parseCtrl (
|
Line 2466 static int syncprov_parseCtrl (
|
rs->sr_text = "Sync control : cookie decoding error"; |
rs->sr_text = "Sync control : cookie decoding error"; |
return LDAP_PROTOCOL_ERROR; |
return LDAP_PROTOCOL_ERROR; |
} |
} |
|
tag = ber_peek_tag( ber, &len ); |
} |
} |
if ( tag == LDAP_TAG_RELOAD_HINT ) { |
if ( tag == LDAP_TAG_RELOAD_HINT ) { |
if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) { |
if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) { |
Line 2508 syncprov_init()
|
Line 2541 syncprov_init()
|
|
|
syncprov.on_bi.bi_cf_ocs = spocs; |
syncprov.on_bi.bi_cf_ocs = spocs; |
|
|
|
generic_filter.f_desc = slap_schema.si_ad_objectClass; |
|
|
rc = config_register_schema( spcfg, spocs ); |
rc = config_register_schema( spcfg, spocs ); |
if ( rc ) return rc; |
if ( rc ) return rc; |
|
|