Context CSN Patch (2)

- BDB context csn codes moved to a separate function in back-bdb/ctxcsn.c
This commit is contained in:
Jong Hyuk Choi 2003-08-25 19:15:04 +00:00
parent d53c90dc29
commit 3be0b77c88
12 changed files with 289 additions and 352 deletions

View file

@ -377,7 +377,7 @@ do_add( Operation *op, SlapReply *rs )
done: done:
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
graduate_commit_csn( op ); slap_graduate_commit_csn( op );
#endif #endif
if( modlist != NULL ) { if( modlist != NULL ) {

View file

@ -6,12 +6,12 @@ SRCS = init.c tools.c config.c \
add.c bind.c compare.c delete.c modify.c modrdn.c search.c \ add.c bind.c compare.c delete.c modify.c modrdn.c search.c \
extended.c passwd.c referral.c operational.c \ extended.c passwd.c referral.c operational.c \
attr.c index.c key.c dbcache.c filterindex.c \ attr.c index.c key.c dbcache.c filterindex.c \
dn2entry.c dn2id.c error.c id2entry.c idl.c nextid.c cache.c trans.c dn2entry.c dn2id.c error.c id2entry.c idl.c nextid.c cache.c trans.c ctxcsn.c
OBJS = init.lo tools.lo config.lo \ OBJS = init.lo tools.lo config.lo \
add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \ add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \
extended.lo passwd.lo referral.lo operational.lo \ extended.lo passwd.lo referral.lo operational.lo \
attr.lo index.lo key.lo dbcache.lo filterindex.lo \ attr.lo index.lo key.lo dbcache.lo filterindex.lo \
dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo nextid.lo cache.lo trans.lo dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo nextid.lo cache.lo trans.lo ctxcsn.lo
LDAP_INCDIR= ../../../include LDAP_INCDIR= ../../../include
LDAP_LIBDIR= ../../../libraries LDAP_LIBDIR= ../../../libraries

View file

@ -37,17 +37,10 @@ bdb_add(Operation *op, SlapReply *rs )
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
Operation* ps_list; Operation* ps_list;
struct berval *max_committed_csn = NULL; int rc;
EntryInfo *suffix_ei = NULL; EntryInfo *suffix_ei;
EntryInfo *ctxcsn_ei = NULL; Entry *ctxcsn_e;
Entry *ctxcsn_e = NULL;
DB_LOCK suffix_lock;
DB_LOCK ctxcsn_lock;
struct berval ctxcsn_rdn = { 0, NULL };
struct berval ctxcsn_ndn = { 0, NULL };
int rc, ret;
int ctxcsn_added = 0; int ctxcsn_added = 0;
ID ctxcsn_id;
#endif #endif
#ifdef NEW_LOGGING #ifdef NEW_LOGGING
@ -92,24 +85,6 @@ bdb_add(Operation *op, SlapReply *rs )
goto return_results; goto return_results;
} }
#ifdef LDAP_SYNC
if ( be_issuffix( op->o_bd, &op->oq_add.rs_e->e_nname ) ) {
rs->sr_err = bdb_next_id( op->o_bd, NULL, &ctxcsn_id );
if( rs->sr_err != 0 ) {
#ifdef NEW_LOGGING
LDAP_LOG ( OPERATION, ERR,
"bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
#else
Debug( LDAP_DEBUG_TRACE,
"bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
#endif
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
}
}
#endif
if( 0 ) { if( 0 ) {
retry: /* transaction retry */ retry: /* transaction retry */
if( p ) { if( p ) {
@ -496,132 +471,13 @@ retry: /* transaction retry */
} }
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
ber_str2bv( "cn=ldapsync", strlen("cn=ldapsync"), 0, &ctxcsn_rdn ); rc = bdb_csn_commit( op, rs, ltid, ei, &suffix_ei, &ctxcsn_e, &ctxcsn_added, locker );
build_new_dn( &ctxcsn_ndn, &op->o_bd->be_nsuffix[0], &ctxcsn_rdn );
rc = bdb_dn2entry( op, ltid, &ctxcsn_ndn, &ctxcsn_ei,
0, locker, &ctxcsn_lock );
if ( ctxcsn_ei ) {
ctxcsn_e = ctxcsn_ei->bei_e;
bdb_cache_entry_db_relock( bdb->bi_dbenv, locker, ctxcsn_ei, 1, 0, &ctxcsn_lock );
}
max_committed_csn = commit_csn( op );
ctxcsn_added = 0;
if ( max_committed_csn == NULL )
goto txn_end;
switch ( rc ) { switch ( rc ) {
case 0: case BDB_CSN_ABORT :
if ( !ctxcsn_e ) {
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn not present";
goto return_results; goto return_results;
} else { case BDB_CSN_RETRY :
attr_delete( &ctxcsn_e->e_attrs, slap_schema.si_ad_contextCSN );
attr_merge_normalize_one( ctxcsn_e, slap_schema.si_ad_contextCSN,
max_committed_csn, NULL );
ret = bdb_id2entry_update( op->o_bd, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = ret;
rs->sr_text = "context csn update failed";
goto return_results;
}
ret = bdb_index_entry_add( op, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn indexing failed";
goto return_results;
}
}
break;
case DB_NOTFOUND:
if ( !be_issuffix( op->o_bd, &op->ora_e->e_nname ) ) {
rc = bdb_dn2entry( op, ltid, &op->o_bd->be_nsuffix[0], &suffix_ei,
0, locker, &suffix_lock );
} else {
suffix_ei = ei;
}
ctxcsn_e = create_context_csn_entry( op->o_bd, max_committed_csn );
ctxcsn_e->e_id = ctxcsn_id;
ctxcsn_added = 1;
ret = bdb_dn2id_add( op, ltid, suffix_ei, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
case DB_KEYEXIST :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn exists before contex prefix does";
goto return_results;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn store failed";
goto return_results;
}
ret = bdb_id2entry_add( op->o_bd, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn store failed";
goto return_results;
}
ret = bdb_index_entry_add( op, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn indexing failed";
goto return_results;
}
break;
case DB_LOCK_DEADLOCK:
case DB_LOCK_NOTGRANTED:
goto rewind;
case LDAP_BUSY:
rs->sr_err = rc;
rs->sr_text = "ldap server busy";
goto return_results;
default:
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
}
goto txn_end;
rewind :
rewind_commit_csn( op );
goto retry; goto retry;
}
txn_end:
#endif #endif
if ( op->o_noop ) { if ( op->o_noop ) {

View file

@ -223,6 +223,12 @@ struct bdb_op_info {
#define BDB_REUSE_LOCKERS #define BDB_REUSE_LOCKERS
#ifdef LDAP_SYNC
#define BDB_CSN_COMMIT 0
#define BDB_CSN_ABORT 1
#define BDB_CSN_RETRY 2
#endif
LDAP_END_DECL LDAP_END_DECL
#include "proto-bdb.h" #include "proto-bdb.h"

View file

@ -0,0 +1,196 @@
/* $OpenLDAP$ */
/*
* back-bdb Context CSN Management Routines
*/
/* Copyright (c) 2003 by International Business Machines, Inc.
*
* International Business Machines, Inc. (hereinafter called IBM) grants
* permission under its copyrights to use, copy, modify, and distribute this
* Software with or without fee, provided that the above copyright notice and
* all paragraphs of this notice appear in all copies, and that the name of IBM
* not be used in connection with the marketing of any product incorporating
* the Software or modifications thereof, without specific, written prior
* permission.
*
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
#include "portable.h"
#include <stdio.h>
#include <ac/string.h>
#include <ac/time.h>
#include "back-bdb.h"
#include "external.h"
#ifdef LDAP_SYNC
int
bdb_csn_commit(
Operation *op,
SlapReply *rs,
DB_TXN *tid,
EntryInfo *ei,
EntryInfo **suffix_ei,
Entry **ctxcsn_e,
int *ctxcsn_added,
u_int32_t locker
)
{
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
struct berval ctxcsn_rdn = { 0, NULL };
struct berval ctxcsn_ndn = { 0, NULL };
EntryInfo *ctxcsn_ei = NULL;
DB_LOCK ctxcsn_lock;
struct berval *max_committed_csn = NULL;
DB_LOCK suffix_lock;
int rc, ret;
ID ctxcsn_id;
ber_str2bv( "cn=ldapsync", strlen("cn=ldapsync"), 0, &ctxcsn_rdn );
build_new_dn( &ctxcsn_ndn, &op->o_bd->be_nsuffix[0], &ctxcsn_rdn );
rc = bdb_dn2entry( op, tid, &ctxcsn_ndn, &ctxcsn_ei,
0, locker, &ctxcsn_lock );
if ( ctxcsn_ei ) {
*ctxcsn_e = ctxcsn_ei->bei_e;
bdb_cache_entry_db_relock( bdb->bi_dbenv, locker, ctxcsn_ei, 1, 0, &ctxcsn_lock );
}
max_committed_csn = slap_get_commit_csn( op );
if ( max_committed_csn == NULL )
return BDB_CSN_COMMIT;
*ctxcsn_added = 0;
switch( rc ) {
case 0:
if ( !*ctxcsn_e ) {
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn not present";
return BDB_CSN_ABORT;
} else {
attr_delete( &(*ctxcsn_e)->e_attrs, slap_schema.si_ad_contextCSN );
attr_merge_normalize_one( *ctxcsn_e, slap_schema.si_ad_contextCSN,
max_committed_csn, NULL );
ret = bdb_id2entry_update( op->o_bd, tid, *ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = ret;
rs->sr_text = "context csn update failed";
return BDB_CSN_ABORT;
}
ret = bdb_index_entry_add( op, tid, *ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn indexing failed";
return BDB_CSN_ABORT;
}
}
break;
case DB_NOTFOUND:
if ( !be_issuffix( op->o_bd, &op->ora_e->e_nname ) ) {
rc = bdb_dn2entry( op, tid, &op->o_bd->be_nsuffix[0], suffix_ei,
0, locker, &suffix_lock );
} else {
*suffix_ei = ei;
}
/* This serializes add. But this case is very rare : only once. */
rs->sr_err = bdb_next_id( op->o_bd, NULL, &ctxcsn_id );
if ( rs->sr_err != 0 ) {
#ifdef NEW_LOGGING
LDAP_LOG ( OPERATION, ERR,
"bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
#else
Debug( LDAP_DEBUG_TRACE,
"bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
#endif
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
return BDB_CSN_ABORT;
}
*ctxcsn_e = slap_create_context_csn_entry( op->o_bd, max_committed_csn );
(*ctxcsn_e)->e_id = ctxcsn_id;
*ctxcsn_added = 1;
ret = bdb_dn2id_add( op, tid, *suffix_ei, *ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
case DB_KEYEXIST :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn exists before contex prefix does";
return BDB_CSN_ABORT;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn store failed";
return BDB_CSN_ABORT;
}
ret = bdb_id2entry_add( op->o_bd, tid, *ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn store failed";
return BDB_CSN_ABORT;
}
ret = bdb_index_entry_add( op, tid, *ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn indexing failed";
return BDB_CSN_ABORT;
}
break;
case DB_LOCK_DEADLOCK:
case DB_LOCK_NOTGRANTED:
goto rewind;
case LDAP_BUSY:
rs->sr_err = rc;
rs->sr_text = "ldap server busy";
return BDB_CSN_ABORT;
default:
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
return BDB_CSN_ABORT;
}
return BDB_CSN_COMMIT;
rewind :
slap_rewind_commit_csn( op );
return BDB_CSN_RETRY;
}
#endif

View file

@ -331,17 +331,10 @@ bdb_modify( Operation *op, SlapReply *rs )
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
Operation* ps_list; Operation* ps_list;
struct psid_entry *pm_list, *pm_prev; struct psid_entry *pm_list, *pm_prev;
struct berval *max_committed_csn = NULL; int rc;
EntryInfo *suffix_ei = NULL; EntryInfo *suffix_ei;
EntryInfo *ctxcsn_ei = NULL; Entry *ctxcsn_e;
Entry *ctxcsn_e = NULL;
DB_LOCK suffix_lock;
DB_LOCK ctxcsn_lock;
struct berval ctxcsn_rdn = { 0, NULL };
struct berval ctxcsn_ndn = { 0, NULL };
int rc, ret;
int ctxcsn_added = 0; int ctxcsn_added = 0;
ID ctxcsn_id;
#endif #endif
#ifdef NEW_LOGGING #ifdef NEW_LOGGING
@ -583,147 +576,13 @@ retry: /* transaction retry */
} }
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
ber_str2bv( "cn=ldapsync", strlen("cn=ldapsync"), 0, &ctxcsn_rdn ); rc = bdb_csn_commit( op, rs, ltid, ei, &suffix_ei, &ctxcsn_e, &ctxcsn_added, locker );
build_new_dn( &ctxcsn_ndn, &op->o_bd->be_nsuffix[0], &ctxcsn_rdn );
rc = bdb_dn2entry( op, ltid, &ctxcsn_ndn, &ctxcsn_ei,
0, locker, &ctxcsn_lock );
if ( ctxcsn_ei ) {
ctxcsn_e = ctxcsn_ei->bei_e;
bdb_cache_entry_db_relock( bdb->bi_dbenv, locker, ctxcsn_ei, 1, 0, &ctxcsn_lock );
}
max_committed_csn = commit_csn( op );
if ( max_committed_csn == NULL )
goto txn_end;
ctxcsn_added = 0;
switch ( rc ) { switch ( rc ) {
case 0: case BDB_CSN_ABORT :
if ( !ctxcsn_e ) {
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn not present";
goto return_results; goto return_results;
} else { case BDB_CSN_RETRY :
attr_delete( &ctxcsn_e->e_attrs, slap_schema.si_ad_contextCSN );
attr_merge_normalize_one( ctxcsn_e, slap_schema.si_ad_contextCSN,
max_committed_csn, NULL );
ret = bdb_id2entry_update( op->o_bd, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = ret;
rs->sr_text = "context csn update failed";
goto return_results;
}
ret = bdb_index_entry_add( op, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn indexing failed";
goto return_results;
}
}
break;
case DB_NOTFOUND:
if ( !be_issuffix( op->o_bd, &op->ora_e->e_nname ) ) {
rc = bdb_dn2entry( op, ltid, &op->o_bd->be_nsuffix[0], &suffix_ei,
0, locker, &suffix_lock );
} else {
suffix_ei = ei;
}
/* This serializes add. But this case is very rare : only once. */
rs->sr_err = bdb_next_id( op->o_bd, NULL, &ctxcsn_id );
if ( rs->sr_err != 0 ) {
#ifdef NEW_LOGGING
LDAP_LOG ( OPERATION, ERR,
"bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
#else
Debug( LDAP_DEBUG_TRACE,
"bdb_add: next_id failed (%d)\n", rs->sr_err, 0, 0 );
#endif
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
}
ctxcsn_e = create_context_csn_entry( op->o_bd, max_committed_csn );
ctxcsn_e->e_id = ctxcsn_id;
ctxcsn_added = 1;
ret = bdb_dn2id_add( op, ltid, suffix_ei, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
case DB_KEYEXIST :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn exists before contex prefix does";
goto return_results;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn store failed";
goto return_results;
}
ret = bdb_id2entry_add( op->o_bd, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn store failed";
goto return_results;
}
ret = bdb_index_entry_add( op, ltid, ctxcsn_e );
switch ( ret ) {
case 0 :
break;
case DB_LOCK_DEADLOCK :
case DB_LOCK_NOTGRANTED :
goto rewind;
default :
rs->sr_err = LDAP_OTHER;
rs->sr_text = "context csn indexing failed";
goto return_results;
}
break;
case DB_LOCK_DEADLOCK:
case DB_LOCK_NOTGRANTED:
goto rewind;
case LDAP_BUSY:
rs->sr_err = rc;
rs->sr_text = "ldap server busy";
goto return_results;
default:
rs->sr_err = LDAP_OTHER;
rs->sr_text = "internal error";
goto return_results;
}
goto txn_end;
rewind :
rewind_commit_csn( op );
goto retry; goto retry;
}
txn_end:
#endif #endif
if( op->o_noop ) { if( op->o_noop ) {

View file

@ -33,6 +33,13 @@ int bdb_attr_index_config LDAP_P(( struct bdb_info *bdb,
void bdb_attr_index_destroy LDAP_P(( Avlnode *tree )); void bdb_attr_index_destroy LDAP_P(( Avlnode *tree ));
/*
* ctxcsn.c
*/
int bdb_csn_commit LDAP_P(( Operation *op, SlapReply *rs, DB_TXN *tid,
EntryInfo *ei, EntryInfo **suffix_ei, Entry **ctxcsn_e,
int *ctxcsn_added, u_int32_t locker ));
/* /*
* dbcache.c * dbcache.c
*/ */

View file

@ -853,11 +853,6 @@ dn2entry_retry:
} else { } else {
csnfge.f_next = sop->oq_search.rs_filter; csnfge.f_next = sop->oq_search.rs_filter;
} }
if ( search_context_csn && search_context_csn->bv_val )
printf("search_context_csn = %s\n", search_context_csn->bv_val );
else
printf("search_context_csn = NULL\n");
} }
#endif #endif

View file

@ -36,7 +36,7 @@
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
struct berval * struct berval *
commit_csn( Operation *op ) slap_get_commit_csn( Operation *op )
{ {
struct berval *max_committed_csn = NULL; struct berval *max_committed_csn = NULL;
struct slap_csn_entry *csne = NULL, *committed_csne = NULL; struct slap_csn_entry *csne = NULL, *committed_csne = NULL;
@ -70,7 +70,7 @@ commit_csn( Operation *op )
} }
void void
rewind_commit_csn( Operation *op ) slap_rewind_commit_csn( Operation *op )
{ {
struct slap_csn_entry *csne = NULL; struct slap_csn_entry *csne = NULL;
@ -89,7 +89,7 @@ rewind_commit_csn( Operation *op )
} }
void void
graduate_commit_csn( Operation *op ) slap_graduate_commit_csn( Operation *op )
{ {
struct slap_csn_entry *csne = NULL; struct slap_csn_entry *csne = NULL;
@ -113,7 +113,7 @@ graduate_commit_csn( Operation *op )
} }
Entry * Entry *
create_context_csn_entry( slap_create_context_csn_entry(
Backend *be, Backend *be,
struct berval *context_csn struct berval *context_csn
) )
@ -269,7 +269,7 @@ create_context_csn_entry(
} }
static int static int
contextcsn_callback( slap_contextcsn_callback(
Operation* op, Operation* op,
SlapReply* rs SlapReply* rs
) )
@ -281,4 +281,38 @@ contextcsn_callback(
} }
return LDAP_SUCCESS; return LDAP_SUCCESS;
} }
int
slap_get_csn(
Operation *op,
const char *csnbuf,
int len,
struct berval *csn,
int manage_ctxcsn
)
{
struct slap_csn_entry *pending;
if ( manage_ctxcsn ) {
pending = (struct slap_csn_entry *) ch_calloc( 1, sizeof( struct slap_csn_entry ));
}
if ( csn == NULL )
return LDAP_OTHER;
csn->bv_len = lutil_csnstr( csnbuf, len, 0, 0 );
csn->bv_val = csnbuf;
if ( manage_ctxcsn ) {
ldap_pvt_thread_mutex_lock( &op->o_bd->be_pcl_mutex );
pending->csn = ber_dupbv( NULL, csn );
pending->connid = op->o_connid;
pending->opid = op->o_opid;
pending->state = SLAP_CSN_PENDING;
LDAP_TAILQ_INSERT_TAIL( &op->o_bd->be_pending_csn_list, pending, csn_link );
ldap_pvt_thread_mutex_unlock( &op->o_bd->be_pcl_mutex );
}
return LDAP_SUCCESS;
}
#endif #endif

View file

@ -544,7 +544,7 @@ do_modify(
cleanup: cleanup:
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
graduate_commit_csn( op ); slap_graduate_commit_csn( op );
#endif #endif
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
@ -773,10 +773,6 @@ int slap_mods_opattrs(
int mop = op->o_tag == LDAP_REQ_ADD int mop = op->o_tag == LDAP_REQ_ADD
? LDAP_MOD_ADD : LDAP_MOD_REPLACE; ? LDAP_MOD_ADD : LDAP_MOD_REPLACE;
#ifdef LDAP_SYNC
struct slap_csn_entry *pending;
#endif
#ifdef LDAP_SYNCREPL #ifdef LDAP_SYNCREPL
syncinfo_t *si = op->o_si; syncinfo_t *si = op->o_si;
#endif #endif
@ -793,24 +789,14 @@ int slap_mods_opattrs(
struct tm *ltm; struct tm *ltm;
time_t now = slap_get_time(); time_t now = slap_get_time();
#ifdef LDAP_SYNC
pending = (struct slap_csn_entry *) ch_calloc( 1, sizeof( struct slap_csn_entry ));
#endif
ldap_pvt_thread_mutex_lock( &gmtime_mutex ); ldap_pvt_thread_mutex_lock( &gmtime_mutex );
ltm = gmtime( &now ); ltm = gmtime( &now );
lutil_gentime( timebuf, sizeof(timebuf), ltm ); lutil_gentime( timebuf, sizeof(timebuf), ltm );
csn.bv_len = lutil_csnstr( csnbuf, sizeof( csnbuf ), 0, 0 );
csn.bv_val = csnbuf;
#ifdef LDAP_SYNC #ifdef LDAP_SYNC
ldap_pvt_thread_mutex_lock( &op->o_bd->be_pcl_mutex ); slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, 1 );
pending->csn = ber_dupbv( NULL, &csn ); #else
pending->connid = op->o_connid; slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, 0 );
pending->opid = op->o_opid;
pending->state = SLAP_CSN_PENDING;
LDAP_TAILQ_INSERT_TAIL( &op->o_bd->be_pending_csn_list, pending, csn_link );
ldap_pvt_thread_mutex_unlock( &op->o_bd->be_pcl_mutex );
#endif #endif
ldap_pvt_thread_mutex_unlock( &gmtime_mutex ); ldap_pvt_thread_mutex_unlock( &gmtime_mutex );

View file

@ -354,6 +354,18 @@ LDAP_SLAPD_F (ContentRule *) cr_find LDAP_P((
LDAP_SLAPD_F (ContentRule *) cr_bvfind LDAP_P(( LDAP_SLAPD_F (ContentRule *) cr_bvfind LDAP_P((
struct berval *crname)); struct berval *crname));
/*
* ctxcsn.c
*/
#ifdef LDAP_SYNC
LDAP_SLAPD_F (struct berval *) slap_get_commit_csn LDAP_P(( Operation * ));
LDAP_SLAPD_F (void) slap_rewind_commit_csn LDAP_P(( Operation * ));
LDAP_SLAPD_F (void) slap_graduate_commit_csn LDAP_P(( Operation * ));
LDAP_SLAPD_F (Entry *) slap_create_context_csn_entry LDAP_P(( Backend *, struct berval *));
LDAP_SLAPD_F (int) slap_get_csn LDAP_P(( Operation *, const char *, int, struct berval *, int ));
#endif
/* /*
* daemon.c * daemon.c
*/ */
@ -1169,15 +1181,6 @@ LDAP_SLAPD_F (void) syncrepl_add_glue LDAP_P(( syncinfo_t *, LDAP *, Operation*
Modifications*, int, struct berval*, struct berval* )); Modifications*, int, struct berval*, struct berval* ));
#endif #endif
#ifdef LDAP_SYNC
LDAP_SLAPD_F (struct berval *) commit_csn LDAP_P(( Operation * ));
LDAP_SLAPD_F (void) rewind_commit_csn LDAP_P(( Operation * ));
LDAP_SLAPD_F (void) graduate_commit_csn LDAP_P(( Operation * ));
LDAP_SLAPD_F (void) update_context_csn LDAP_P(( Backend *, struct berval * ));
LDAP_SLAPD_F (Entry *) create_context_csn_entry LDAP_P(( Backend *, struct berval *));
#endif
LDAP_END_DECL LDAP_END_DECL
#endif /* PROTO_SLAP_H */ #endif /* PROTO_SLAP_H */

View file

@ -288,27 +288,22 @@ void syncrepl_add_glue( syncinfo_t *si, LDAP *ld, Operation *op, Entry *e,
} }
#if 0 #if 0
struct berval *commit_csn( Operation *op ) struct berval *slap_get_commit_csn( Operation *op )
{ {
return NULL; return NULL;
} }
void rewind_commit_csn( Operation *op ) void slap_rewind_commit_csn( Operation *op )
{ {
return; return;
} }
void graduate_commit_csn( Operation *op ) void slap_graduate_commit_csn( Operation *op )
{ {
return; return;
} }
void update_context_csn( Backend *be, struct berval *context_csn ) Entry *slap_create_context_csn_entry( Backend *be, struct berval *context_csn )
{
return;
}
Entry *create_context_csn_entry( Backend *be, struct berval *context_csn )
{ {
return NULL; return NULL;
} }