#define LDAP_REFERRALS_REQUIRED 3
/* 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_DOMAIN_SCOPE "1.2.840.113556.1.4.1339"
#define LDAP_CONTROL_X_PERMISSIVE_MODIFY "1.2.840.113556.1.4.1413"
}
/* 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;
if( rs->sr_err != 0 ) {
Debug( LDAP_DEBUG_TRACE,
}
/* 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",
ltid->id(ltid), 0, 0 );
rs->sr_text = NULL;
}
/* 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;
if( rs->sr_err != 0 ) {
Debug( LDAP_DEBUG_TRACE,
}
/* 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;
if( rs->sr_err != 0 ) {
Debug( LDAP_DEBUG_TRACE,
if (( slapMode & SLAP_TOOL_MODE ) && mdb_tool_txn ) {
moi->moi_txn = mdb_tool_txn;
} 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) {
Debug( LDAP_DEBUG_ANY, "mdb_opinfo_get: err %s(%d)\n",
mdb_strerror(rc), rc, 0 );
#ifdef SLAP_CONTROL_X_WHATFAILED
static SLAP_CTRL_PARSE_FN parseWhatFailed;
#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> */
NULL, NULL,
parseWhatFailed, LDAP_SLIST_ENTRY_INITIALIZER(next) },
#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) }
};
return rc;
}
#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
#define LDAP_COMP_MATCH
#define LDAP_SYNC_TIMESTAMP
#define SLAP_CONTROL_X_WHATFAILED
+#define SLAP_CONTROL_X_LAZY_COMMIT
#define SLAP_CONFIG_DELETE
#define SLAP_AUXPROP_DONTUSECOPY
#ifndef SLAP_SCHEMA_EXPOSE
#ifdef SLAP_CONTROL_X_WHATFAILED
int sc_whatFailed;
#endif
+#ifdef LDAP_CONTROL_X_LAZY_COMMIT
+ int sc_lazyCommit;
+#endif
};
/*
#define get_whatFailed(op) _SCM((op)->o_whatFailed)
#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]
AuthorizationInformation o_authz;
int si_refreshDone;
int si_syncdata;
int si_logstate;
+ int si_lazyCommit;
int si_got;
int si_strict_refresh; /* stop listening during fallback refresh */
int si_too_old;
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 );
switch ( syncstate ) {
case LDAP_SYNC_ADD:
/* FIXME: undocumented */
#define EXATTRSSTR "exattrs"
#define MANAGEDSAITSTR "manageDSAit"
+#define LAZY_COMMIT "lazycommit"
/* mandatory */
enum {
STRLENOF( STRICT_REFRESH ) ) )
{
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 ) ) {
si->si_got |= GOT_BINDCONF;
} else {
ptr = lutil_strcopy( ptr, bc.bv_val );
}
}
+
+ if ( si->si_lazyCommit ) {
+ ptr = lutil_strcopy( ptr, " " LAZY_COMMIT );
+ }
+
bc.bv_len = ptr - buf;
bc.bv_val = buf;
ber_dupbv( bv, &bc );