mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-21 15:19:34 -05:00
ITS#8040 experimental Lazy Commit
This commit is contained in:
parent
b1d1c74247
commit
a32a2da33a
9 changed files with 86 additions and 9 deletions
|
|
@ -332,6 +332,7 @@ typedef struct ldapcontrol {
|
||||||
#define LDAP_REFERRALS_REQUIRED 3
|
#define LDAP_REFERRALS_REQUIRED 3
|
||||||
|
|
||||||
/* MS Active Directory controls (for compatibility) */
|
/* MS Active Directory controls (for compatibility) */
|
||||||
|
#define LDAP_CONTROL_X_LAZY_COMMIT "1.2.840.113556.1.4.619"
|
||||||
#define LDAP_CONTROL_X_INCREMENTAL_VALUES "1.2.840.113556.1.4.802"
|
#define LDAP_CONTROL_X_INCREMENTAL_VALUES "1.2.840.113556.1.4.802"
|
||||||
#define LDAP_CONTROL_X_DOMAIN_SCOPE "1.2.840.113556.1.4.1339"
|
#define LDAP_CONTROL_X_DOMAIN_SCOPE "1.2.840.113556.1.4.1339"
|
||||||
#define LDAP_CONTROL_X_PERMISSIVE_MODIFY "1.2.840.113556.1.4.1413"
|
#define LDAP_CONTROL_X_PERMISSIVE_MODIFY "1.2.840.113556.1.4.1413"
|
||||||
|
|
|
||||||
|
|
@ -111,8 +111,12 @@ retry: /* transaction retry */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* begin transaction */
|
/* begin transaction */
|
||||||
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id,
|
{
|
||||||
bdb->bi_db_opflags );
|
int tflags = bdb->bi_db_opflags;
|
||||||
|
if ( get_lazyCommit( op ))
|
||||||
|
tflags |= DB_TXN_NOSYNC;
|
||||||
|
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, tflags );
|
||||||
|
}
|
||||||
rs->sr_text = NULL;
|
rs->sr_text = NULL;
|
||||||
if( rs->sr_err != 0 ) {
|
if( rs->sr_err != 0 ) {
|
||||||
Debug( LDAP_DEBUG_TRACE,
|
Debug( LDAP_DEBUG_TRACE,
|
||||||
|
|
|
||||||
|
|
@ -104,8 +104,12 @@ retry: /* transaction retry */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* begin transaction */
|
/* begin transaction */
|
||||||
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id,
|
{
|
||||||
bdb->bi_db_opflags );
|
int tflags = bdb->bi_db_opflags;
|
||||||
|
if ( get_lazyCommit( op ))
|
||||||
|
tflags |= DB_TXN_NOSYNC;
|
||||||
|
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, tflags );
|
||||||
|
}
|
||||||
Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(bdb_delete) ": txn1 id: %x\n",
|
Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(bdb_delete) ": txn1 id: %x\n",
|
||||||
ltid->id(ltid), 0, 0 );
|
ltid->id(ltid), 0, 0 );
|
||||||
rs->sr_text = NULL;
|
rs->sr_text = NULL;
|
||||||
|
|
|
||||||
|
|
@ -515,8 +515,12 @@ retry: /* transaction retry */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* begin transaction */
|
/* begin transaction */
|
||||||
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id,
|
{
|
||||||
bdb->bi_db_opflags );
|
int tflags = bdb->bi_db_opflags;
|
||||||
|
if ( get_lazyCommit( op ))
|
||||||
|
tflags |= DB_TXN_NOSYNC;
|
||||||
|
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, tflags );
|
||||||
|
}
|
||||||
rs->sr_text = NULL;
|
rs->sr_text = NULL;
|
||||||
if( rs->sr_err != 0 ) {
|
if( rs->sr_err != 0 ) {
|
||||||
Debug( LDAP_DEBUG_TRACE,
|
Debug( LDAP_DEBUG_TRACE,
|
||||||
|
|
|
||||||
|
|
@ -114,8 +114,12 @@ retry: /* transaction retry */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* begin transaction */
|
/* begin transaction */
|
||||||
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id,
|
{
|
||||||
bdb->bi_db_opflags );
|
int tflags = bdb->bi_db_opflags;
|
||||||
|
if ( get_lazyCommit( op ))
|
||||||
|
tflags |= DB_TXN_NOSYNC;
|
||||||
|
rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, tflags );
|
||||||
|
}
|
||||||
rs->sr_text = NULL;
|
rs->sr_text = NULL;
|
||||||
if( rs->sr_err != 0 ) {
|
if( rs->sr_err != 0 ) {
|
||||||
Debug( LDAP_DEBUG_TRACE,
|
Debug( LDAP_DEBUG_TRACE,
|
||||||
|
|
|
||||||
|
|
@ -466,7 +466,10 @@ mdb_opinfo_get( Operation *op, struct mdb_info *mdb, int rdonly, mdb_op_info **m
|
||||||
if (( slapMode & SLAP_TOOL_MODE ) && mdb_tool_txn ) {
|
if (( slapMode & SLAP_TOOL_MODE ) && mdb_tool_txn ) {
|
||||||
moi->moi_txn = mdb_tool_txn;
|
moi->moi_txn = mdb_tool_txn;
|
||||||
} else {
|
} else {
|
||||||
rc = mdb_txn_begin( mdb->mi_dbenv, NULL, 0, &moi->moi_txn );
|
int flag = 0;
|
||||||
|
if ( get_lazyCommit( op ))
|
||||||
|
flag |= MDB_NOSYNC;
|
||||||
|
rc = mdb_txn_begin( mdb->mi_dbenv, NULL, flag, &moi->moi_txn );
|
||||||
if (rc) {
|
if (rc) {
|
||||||
Debug( LDAP_DEBUG_ANY, "mdb_opinfo_get: err %s(%d)\n",
|
Debug( LDAP_DEBUG_ANY, "mdb_opinfo_get: err %s(%d)\n",
|
||||||
mdb_strerror(rc), rc, 0 );
|
mdb_strerror(rc), rc, 0 );
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,9 @@ static SLAP_CTRL_PARSE_FN parseSessionTracking;
|
||||||
#ifdef SLAP_CONTROL_X_WHATFAILED
|
#ifdef SLAP_CONTROL_X_WHATFAILED
|
||||||
static SLAP_CTRL_PARSE_FN parseWhatFailed;
|
static SLAP_CTRL_PARSE_FN parseWhatFailed;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef SLAP_CONTROL_X_LAZY_COMMIT
|
||||||
|
static SLAP_CTRL_PARSE_FN parseLazyCommit;
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef sc_mask /* avoid conflict with Irix 6.5 <sys/signal.h> */
|
#undef sc_mask /* avoid conflict with Irix 6.5 <sys/signal.h> */
|
||||||
|
|
||||||
|
|
@ -226,6 +229,13 @@ static struct slap_control control_defs[] = {
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
parseWhatFailed, LDAP_SLIST_ENTRY_INITIALIZER(next) },
|
parseWhatFailed, LDAP_SLIST_ENTRY_INITIALIZER(next) },
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef SLAP_CONTROL_X_LAZY_COMMIT
|
||||||
|
{ LDAP_CONTROL_X_LAZY_COMMIT,
|
||||||
|
(int)offsetof(struct slap_control_ids, sc_lazyCommit),
|
||||||
|
SLAP_CTRL_GLOBAL|SLAP_CTRL_ACCESS|SLAP_CTRL_HIDE,
|
||||||
|
NULL, NULL,
|
||||||
|
parseLazyCommit, LDAP_SLIST_ENTRY_INITIALIZER(next) },
|
||||||
|
#endif
|
||||||
|
|
||||||
{ NULL, 0, 0, NULL, 0, NULL, LDAP_SLIST_ENTRY_INITIALIZER(next) }
|
{ NULL, 0, 0, NULL, 0, NULL, LDAP_SLIST_ENTRY_INITIALIZER(next) }
|
||||||
};
|
};
|
||||||
|
|
@ -2155,3 +2165,27 @@ done:;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SLAP_CONTROL_X_LAZY_COMMIT
|
||||||
|
static int parseLazyCommit(
|
||||||
|
Operation *op,
|
||||||
|
SlapReply *rs,
|
||||||
|
LDAPControl *ctrl )
|
||||||
|
{
|
||||||
|
if ( op->o_lazyCommit != SLAP_CONTROL_NONE ) {
|
||||||
|
rs->sr_text = "\"Lazy Commit?\" control specified multiple times";
|
||||||
|
return LDAP_PROTOCOL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !BER_BVISNULL( &ctrl->ldctl_value )) {
|
||||||
|
rs->sr_text = "\"Lazy Commit?\" control value not absent";
|
||||||
|
return LDAP_PROTOCOL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
op->o_lazyCommit = ctrl->ldctl_iscritical
|
||||||
|
? SLAP_CONTROL_CRITICAL
|
||||||
|
: SLAP_CONTROL_NONCRITICAL;
|
||||||
|
|
||||||
|
return LDAP_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ LDAP_BEGIN_DECL
|
||||||
#define LDAP_COMP_MATCH
|
#define LDAP_COMP_MATCH
|
||||||
#define LDAP_SYNC_TIMESTAMP
|
#define LDAP_SYNC_TIMESTAMP
|
||||||
#define SLAP_CONTROL_X_WHATFAILED
|
#define SLAP_CONTROL_X_WHATFAILED
|
||||||
|
#define SLAP_CONTROL_X_LAZY_COMMIT
|
||||||
#define SLAP_CONFIG_DELETE
|
#define SLAP_CONFIG_DELETE
|
||||||
#define SLAP_AUXPROP_DONTUSECOPY
|
#define SLAP_AUXPROP_DONTUSECOPY
|
||||||
#ifndef SLAP_SCHEMA_EXPOSE
|
#ifndef SLAP_SCHEMA_EXPOSE
|
||||||
|
|
@ -2504,6 +2505,9 @@ struct slap_control_ids {
|
||||||
#ifdef SLAP_CONTROL_X_WHATFAILED
|
#ifdef SLAP_CONTROL_X_WHATFAILED
|
||||||
int sc_whatFailed;
|
int sc_whatFailed;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LDAP_CONTROL_X_LAZY_COMMIT
|
||||||
|
int sc_lazyCommit;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -2779,6 +2783,11 @@ struct Operation {
|
||||||
#define get_whatFailed(op) _SCM((op)->o_whatFailed)
|
#define get_whatFailed(op) _SCM((op)->o_whatFailed)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SLAP_CONTROL_X_LAZY_COMMIT
|
||||||
|
#define o_lazyCommit o_ctrlflag[slap_cids.sc_lazyCommit]
|
||||||
|
#define get_lazyCommit(op) _SCM((op)->o_lazyCommit)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define o_sync o_ctrlflag[slap_cids.sc_LDAPsync]
|
#define o_sync o_ctrlflag[slap_cids.sc_LDAPsync]
|
||||||
|
|
||||||
AuthorizationInformation o_authz;
|
AuthorizationInformation o_authz;
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ typedef struct syncinfo_s {
|
||||||
int si_refreshDone;
|
int si_refreshDone;
|
||||||
int si_syncdata;
|
int si_syncdata;
|
||||||
int si_logstate;
|
int si_logstate;
|
||||||
|
int si_lazyCommit;
|
||||||
int si_got;
|
int si_got;
|
||||||
int si_strict_refresh; /* stop listening during fallback refresh */
|
int si_strict_refresh; /* stop listening during fallback refresh */
|
||||||
int si_too_old;
|
int si_too_old;
|
||||||
|
|
@ -2932,6 +2933,9 @@ syncrepl_entry(
|
||||||
slap_queue_csn( op, syncCSN );
|
slap_queue_csn( op, syncCSN );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( !si->si_refreshDone && si->si_lazyCommit )
|
||||||
|
op->o_lazyCommit = SLAP_CONTROL_NONCRITICAL;
|
||||||
|
|
||||||
slap_op_time( &op->o_time, &op->o_tincr );
|
slap_op_time( &op->o_time, &op->o_tincr );
|
||||||
switch ( syncstate ) {
|
switch ( syncstate ) {
|
||||||
case LDAP_SYNC_ADD:
|
case LDAP_SYNC_ADD:
|
||||||
|
|
@ -4687,6 +4691,7 @@ config_suffixm( ConfigArgs *c, syncinfo_t *si )
|
||||||
/* FIXME: undocumented */
|
/* FIXME: undocumented */
|
||||||
#define EXATTRSSTR "exattrs"
|
#define EXATTRSSTR "exattrs"
|
||||||
#define MANAGEDSAITSTR "manageDSAit"
|
#define MANAGEDSAITSTR "manageDSAit"
|
||||||
|
#define LAZY_COMMIT "lazycommit"
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
enum {
|
enum {
|
||||||
|
|
@ -5185,6 +5190,10 @@ parse_syncrepl_line(
|
||||||
STRLENOF( STRICT_REFRESH ) ) )
|
STRLENOF( STRICT_REFRESH ) ) )
|
||||||
{
|
{
|
||||||
si->si_strict_refresh = 1;
|
si->si_strict_refresh = 1;
|
||||||
|
} else if ( !strncasecmp( c->argv[ i ], LAZY_COMMIT,
|
||||||
|
STRLENOF( LAZY_COMMIT ) ) )
|
||||||
|
{
|
||||||
|
si->si_lazyCommit = 1;
|
||||||
} else if ( !bindconf_parse( c->argv[i], &si->si_bindconf ) ) {
|
} else if ( !bindconf_parse( c->argv[i], &si->si_bindconf ) ) {
|
||||||
si->si_got |= GOT_BINDCONF;
|
si->si_got |= GOT_BINDCONF;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -5585,6 +5594,11 @@ syncrepl_unparse( syncinfo_t *si, struct berval *bv )
|
||||||
ptr = lutil_strcopy( ptr, bc.bv_val );
|
ptr = lutil_strcopy( ptr, bc.bv_val );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( si->si_lazyCommit ) {
|
||||||
|
ptr = lutil_strcopy( ptr, " " LAZY_COMMIT );
|
||||||
|
}
|
||||||
|
|
||||||
bc.bv_len = ptr - buf;
|
bc.bv_len = ptr - buf;
|
||||||
bc.bv_val = buf;
|
bc.bv_val = buf;
|
||||||
ber_dupbv( bv, &bc );
|
ber_dupbv( bv, &bc );
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue