]> git.sur5r.net Git - openldap/commitdiff
ITS#4384 rework entryCSN handling, retrieve from incoming request
authorHoward Chu <hyc@openldap.org>
Sun, 5 Feb 2006 01:09:48 +0000 (01:09 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 5 Feb 2006 01:09:48 +0000 (01:09 +0000)
if it was provided. Always check and graduate, regardless of shadow status.

14 files changed:
servers/slapd/add.c
servers/slapd/back-bdb/add.c
servers/slapd/back-bdb/delete.c
servers/slapd/back-bdb/modify.c
servers/slapd/back-bdb/modrdn.c
servers/slapd/back-ldbm/delete.c
servers/slapd/back-ldbm/modify.c
servers/slapd/back-ldbm/modrdn.c
servers/slapd/back-ldif/ldif.c
servers/slapd/back-sql/add.c
servers/slapd/back-sql/modify.c
servers/slapd/back-sql/modrdn.c
servers/slapd/modify.c
servers/slapd/modrdn.c

index 0f3f09a7ed58b0a5f8b9105b3d055e4c32070656..bca76664dd02e2a836a512da7eefd895bf5242b7 100644 (file)
@@ -654,12 +654,22 @@ int slap_add_opattrs(
        if ( SLAP_LASTMOD( op->o_bd ) ) {
                char *ptr;
                timestamp.bv_val = timebuf;
+               int gotcsn = 0;
+
+               a = attr_find( op->ora_e->e_attrs, slap_schema.si_ad_entryCSN );
+               if ( a ) {
+                       gotcsn = 1;
+                       csn = a->a_vals[0];
+               }
                if ( BER_BVISEMPTY( &op->o_csn )) {
-                       if ( SLAP_SHADOW( op->o_bd ))
-                               manage_ctxcsn = 0;
-                       csn.bv_val = csnbuf;
-                       csn.bv_len = sizeof(csnbuf);
-                       slap_get_csn( op, &csn, manage_ctxcsn );
+                       if ( !gotcsn ) {
+                               csn.bv_val = csnbuf;
+                               csn.bv_len = sizeof(csnbuf);
+                               slap_get_csn( op, &csn, manage_ctxcsn );
+                       } else {
+                               if ( manage_ctxcsn )
+                                       slap_queue_csn( op, &csn );
+                       }
                } else {
                        csn = op->o_csn;
                }
@@ -712,9 +722,7 @@ int slap_add_opattrs(
                                slap_schema.si_ad_createTimestamp, &timestamp, NULL );
                }
 
-               a = attr_find( op->ora_e->e_attrs,
-                       slap_schema.si_ad_entryCSN );
-               if ( !a ) {
+               if ( !gotcsn ) {
                        attr_merge_one( op->ora_e,
                                slap_schema.si_ad_entryCSN, &csn, NULL );
                }
index ef2c6dfc296a6f2c20ae0cffbc71386a37fe7516..cd37908a20a8f29e479e798f8d1af21a60d3884a 100644 (file)
@@ -410,8 +410,7 @@ retry:      /* transaction retry */
 
 return_results:
        send_ldap_result( op, rs );
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
 
        if( ltid != NULL ) {
                TXN_ABORT( ltid );
index 3c5e7e9ba5e0e340e3d340faa48f72e1f2ae213a..02038dc55cac55d06dfe073428a1d839fc2d4939 100644 (file)
@@ -58,7 +58,7 @@ bdb_delete( Operation *op, SlapReply *rs )
                op->o_req_dn.bv_val, 0, 0 );
 
        /* allocate CSN */
-       if ( !SLAP_SHADOW( op->o_bd )) {
+       if ( BER_BVISEMPTY( &op->o_csn )) {
                struct berval csn;
                char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
 
@@ -527,8 +527,7 @@ return_results:
        op->o_private = NULL;
 
        send_ldap_result( op, rs );
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
 
        if( preread_ctrl != NULL ) {
                slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );
index 317a1797d10ed85ab4897658b76f7fa932e28a6c..21faa993e6e383f03ff32e3e49db0841eeea4937 100644 (file)
@@ -298,8 +298,7 @@ bdb_modify( Operation *op, SlapReply *rs )
 
        ctrls[num_ctrls] = NULL;
 
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_mods_opattrs( op, &op->orm_modlist, 1 );
+       slap_mods_opattrs( op, &op->orm_modlist, 1 );
 
        if( 0 ) {
 retry: /* transaction retry */
@@ -590,8 +589,6 @@ return_results:
                attrs_free( dummy.e_attrs );
        }
        send_ldap_result( op, rs );
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
 
        if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp ) {
                TXN_CHECKPOINT( bdb->bi_dbenv,
@@ -599,6 +596,8 @@ return_results:
        }
 
 done:
+       slap_graduate_commit_csn( op );
+
        if( ltid != NULL ) {
                TXN_ABORT( ltid );
        }
index 21d06d728b5eb63ef509ae6af9133744161f9309..cc0ffcb476d72bc6d15b061989007c11cc8317e5 100644 (file)
@@ -67,8 +67,7 @@ bdb_modrdn( Operation *op, SlapReply *rs )
                op->o_req_dn.bv_val,op->oq_modrdn.rs_newrdn.bv_val,
                op->oq_modrdn.rs_newSup ? op->oq_modrdn.rs_newSup->bv_val : "NULL" );
 
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_mods_opattrs( op, &op->orr_modlist, 1 );
+       slap_mods_opattrs( op, &op->orr_modlist, 1 );
 
        if( 0 ) {
 retry: /* transaction retry */
@@ -744,6 +743,8 @@ return_results:
        }
 
 done:
+       slap_graduate_commit_csn( op );
+
        if( new_dn.bv_val != NULL ) free( new_dn.bv_val );
        if( new_ndn.bv_val != NULL ) free( new_ndn.bv_val );
 
index 00372aa02919f292556602652a6013b01bf2b073..ec623e62537b0a4bfc43234b8c2900e968580500 100644 (file)
@@ -46,7 +46,7 @@ ldbm_back_delete(
        ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
 
        /* allocate CSN */
-       if ( !SLAP_SHADOW( op->o_bd )) {
+       if ( BER_BVISEMPTY( &op->o_csn )) {
                struct berval csn;
                char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
 
@@ -217,8 +217,7 @@ return_results:;
        ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
 
        send_ldap_result( op, rs );
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
 
        return rc;
 }
index 191365ba1990504409dd9688e041a29c6e2214b8..9625682841c9decf629faa986a2ca0896b1ed036 100644 (file)
@@ -241,8 +241,7 @@ ldbm_back_modify(
 
        Debug(LDAP_DEBUG_ARGS, "ldbm_back_modify:\n", 0, 0, 0);
 
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_mods_opattrs( op, &op->orm_modlist, 1 );
+       slap_mods_opattrs( op, &op->orm_modlist, 1 );
 
        /* grab giant lock for writing */
        ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
@@ -300,8 +299,7 @@ return_results:;
        ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
 
        send_ldap_result( op, rs );
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
 
        rs->sr_text = NULL;
        return rs->sr_err;
index 668939f9b81e39094cd253f2bd4a8cb95931e049..4ed808c339371e931eced20cb6e082ffdf670fe9 100644 (file)
@@ -64,8 +64,7 @@ ldbm_back_modrdn(
                ( op->oq_modrdn.rs_newSup && op->oq_modrdn.rs_newSup->bv_len )
                        ? op->oq_modrdn.rs_newSup->bv_val : "NULL", 0 );
 
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_mods_opattrs( op, &op->orr_modlist, 1 );
+       slap_mods_opattrs( op, &op->orr_modlist, 1 );
 
        /* grab giant lock for writing */
        ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
@@ -422,6 +421,7 @@ ldbm_back_modrdn(
        cache_entry_commit( e );
 
 return_results:
+       slap_graduate_commit_csn( op );
        if( new_dn.bv_val != NULL ) free( new_dn.bv_val );
        if( new_ndn.bv_val != NULL ) free( new_ndn.bv_val );
        if( old_ndn.bv_val != NULL ) free( old_ndn.bv_val );
index d046b26695859f91d35d0686881a3817a9f1d712..8293c52fa149481a68747cad01dc486699bfa984 100644 (file)
@@ -819,8 +819,7 @@ static int ldif_back_add(Operation *op, SlapReply *rs) {
 
 send_res:
        send_ldap_result(op, rs);
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
        return 0;
 }
 
@@ -831,8 +830,7 @@ static int ldif_back_modify(Operation *op, SlapReply *rs) {
        Entry * entry = NULL;
        int spew_res;
 
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_mods_opattrs( op, &op->orm_modlist, 1 );
+       slap_mods_opattrs( op, &op->orm_modlist, 1 );
 
        ldap_pvt_thread_mutex_lock(&ni->li_mutex);
        dn2path(&op->o_req_ndn, &op->o_bd->be_nsuffix[0], &ni->li_base_path,
@@ -866,8 +864,7 @@ static int ldif_back_modify(Operation *op, SlapReply *rs) {
        rs->sr_text = NULL;
        ldap_pvt_thread_mutex_unlock(&ni->li_mutex);
        send_ldap_result(op, rs);
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
        return 0;
 }
 
@@ -876,7 +873,7 @@ static int ldif_back_delete(Operation *op, SlapReply *rs) {
        struct berval path = BER_BVNULL;
        int res = 0;
 
-       if ( !SLAP_SHADOW( op->o_bd )) {
+       if ( BER_BVISEMPTY( &op->o_csn )) {
                struct berval csn;
                char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
 
@@ -909,8 +906,7 @@ static int ldif_back_delete(Operation *op, SlapReply *rs) {
        SLAP_FREE(path.bv_val);
        ldap_pvt_thread_mutex_unlock(&ni->li_mutex);
        send_ldap_result(op, rs);
-       if ( !SLAP_SHADOW( op->o_bd ))
-               slap_graduate_commit_csn( op );
+       slap_graduate_commit_csn( op );
        return 0;
 }
 
@@ -975,6 +971,8 @@ ldif_back_modrdn(Operation *op, SlapReply *rs)
        Entry * entry = NULL;
        int res;
 
+       slap_mods_opattrs( op, &op->orr_modlist, 1 );
+
        ldap_pvt_thread_mutex_lock( &ni->li_mutex );
        ldap_pvt_thread_mutex_lock( &entry2str_mutex );
        entry = (Entry *) get_entry( op, &ni->li_base_path );
@@ -1018,6 +1016,7 @@ ldif_back_modrdn(Operation *op, SlapReply *rs)
        ldap_pvt_thread_mutex_unlock( &ni->li_mutex );
        ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
        send_ldap_result( op, rs );
+       slap_graduate_commit_csn( op );
        return 0;
 }
 
index c09b148d1ed53bdc8426a78c737cb01c90608095..a850858bf550667cd931b9d6d6a9de96ef7b8c74 100644 (file)
@@ -1506,6 +1506,7 @@ done:;
 #endif /* SLAP_ACL_HONOR_DISCLOSE */
 
        send_ldap_result( op, rs );
+       slap_graduate_commit_csn( op );
 
        if ( !BER_BVISNULL( &realdn )
                        && realdn.bv_val != op->ora_e->e_name.bv_val )
index a40f58d48f735e9749933acd2ced9464b3e77df0..c6c84b0c02a54568f1c1b2a2ed104e109949f90a 100644 (file)
@@ -191,6 +191,7 @@ done:;
 #endif /* SLAP_ACL_HONOR_DISCLOSE */
 
        send_ldap_result( op, rs );
+       slap_graduate_commit_csn( op );
 
        if ( !BER_BVISNULL( &bsi.bsi_base_id.eid_ndn ) ) {
                (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
index cbfeb60dccb00f05cbc15fb36942f29af06d1abc..756f99798cf472a2b7dd3c2bde891746d0a19613 100644 (file)
@@ -394,6 +394,8 @@ backsql_modrdn( Operation *op, SlapReply *rs )
 
        assert( op->orr_modlist != NULL );
 
+       slap_mods_opattrs( op, &op->orr_modlist, 1 );
+
        oc = backsql_id2oc( bi, e_id.eid_oc_id );
        rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, op->orr_modlist );
        slap_graduate_commit_csn( op );
@@ -492,6 +494,7 @@ done:;
        }
 
        send_ldap_result( op, rs );
+       slap_graduate_commit_csn( op );
 
        if ( !BER_BVISNULL( &realnew_dn ) && realnew_dn.bv_val != new_dn.bv_val ) {
                ch_free( realnew_dn.bv_val );
index 44f67247c7a0b885062fda956088982e36b78356..b044c059fc02a14f9cee0df2ccb1defcb72038ec 100644 (file)
@@ -809,7 +809,8 @@ void slap_timestamp( time_t *tm, struct berval *bv )
 #endif
 }
 
-/* modify only calls this for non-replicas. modrdn always calls.
+/* Called for all modify and modrdn ops. If the current op was replicated
+ * from elsewhere, all of the attrs should already be present.
  */
 void slap_mods_opattrs(
        Operation *op,
@@ -821,14 +822,34 @@ void slap_mods_opattrs(
        char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
        char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
        Modifications *mod, **modtail, *modlast;
+       int gotcsn = 0, gotmname = 0, gotmtime = 0;
 
        if ( SLAP_LASTMOD( op->o_bd ) ) {
                char *ptr;
                timestamp.bv_val = timebuf;
+               for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next ) {
+                       if ( (*modtail)->sml_op != LDAP_MOD_ADD &&
+                               (*modtail)->sml_op != LDAP_MOD_REPLACE ) continue;
+                       if ( (*modtail)->sml_desc == slap_schema.si_ad_entryCSN ) {
+                               csn = (*modtail)->sml_values[0];
+                               gotcsn = 1;
+                       } else
+                       if ( (*modtail)->sml_desc == slap_schema.si_ad_modifiersName ) {
+                               gotmname = 1;
+                       } else
+                       if ( (*modtail)->sml_desc == slap_schema.si_ad_modifyTimestamp ) {
+                               gotmtime = 1;
+                       }
+               }
                if ( BER_BVISEMPTY( &op->o_csn )) {
-                       csn.bv_val = csnbuf;
-                       csn.bv_len = sizeof( csnbuf );
-                       slap_get_csn( op, &csn, manage_ctxcsn );
+                       if ( !gotcsn ) {
+                               csn.bv_val = csnbuf;
+                               csn.bv_len = sizeof( csnbuf );
+                               slap_get_csn( op, &csn, manage_ctxcsn );
+                       } else {
+                               if ( manage_ctxcsn )
+                                       slap_queue_csn( op, &csn );
+                       }
                } else {
                        csn = op->o_csn;
                }
@@ -855,33 +876,24 @@ void slap_mods_opattrs(
                        nname = op->o_ndn;
                }
 
-               for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next )
-                       ;
-
-               mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
-               mod->sml_op = LDAP_MOD_REPLACE;
-               mod->sml_flags = SLAP_MOD_INTERNAL;
-               mod->sml_next = NULL;
-               BER_BVZERO( &mod->sml_type );
-               mod->sml_desc = slap_schema.si_ad_entryCSN;
-               mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
-               ber_dupbv( &mod->sml_values[0], &csn );
-               BER_BVZERO( &mod->sml_values[1] );
-               assert( !BER_BVISNULL( &mod->sml_values[0] ) );
-               mod->sml_nvalues = NULL;
-               *modtail = mod;
-               modlast = mod;
-               modtail = &mod->sml_next;
-       
-               if ( get_manageDIT( op ) ) {
-                       for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) {
-                               if ( mod->sml_desc == slap_schema.si_ad_modifiersName ) {
-                                       break;
-                               }
-                       }
+               if ( !gotcsn ) {
+                       mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
+                       mod->sml_op = LDAP_MOD_REPLACE;
+                       mod->sml_flags = SLAP_MOD_INTERNAL;
+                       mod->sml_next = NULL;
+                       BER_BVZERO( &mod->sml_type );
+                       mod->sml_desc = slap_schema.si_ad_entryCSN;
+                       mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
+                       ber_dupbv( &mod->sml_values[0], &csn );
+                       BER_BVZERO( &mod->sml_values[1] );
+                       assert( !BER_BVISNULL( &mod->sml_values[0] ) );
+                       mod->sml_nvalues = NULL;
+                       *modtail = mod;
+                       modlast = mod;
+                       modtail = &mod->sml_next;
                }
 
-               if ( mod->sml_desc != slap_schema.si_ad_modifiersName ) {
+               if ( !gotmname ) {
                        mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
                        mod->sml_op = LDAP_MOD_REPLACE;
                        mod->sml_flags = SLAP_MOD_INTERNAL;
@@ -901,15 +913,7 @@ void slap_mods_opattrs(
                        modtail = &mod->sml_next;
                }
 
-               if ( get_manageDIT( op ) ) {
-                       for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) {
-                               if ( mod->sml_desc == slap_schema.si_ad_modifyTimestamp ) {
-                                       break;
-                               }
-                       }
-               }
-
-               if ( mod->sml_desc != slap_schema.si_ad_modifyTimestamp ) {
+               if ( !gotmtime ) {
                        mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
                        mod->sml_op = LDAP_MOD_REPLACE;
                        mod->sml_flags = SLAP_MOD_INTERNAL;
index 328f49ec60feac9ea65b2c7790ecd362980ca96f..4a5cf8f9f628a7dc931e2215c74670dd52bb0745 100644 (file)
@@ -500,13 +500,6 @@ slap_modrdn2mods(
        
 done:
 
-#if 0
-       /* should be done by backend */
-       if ( rs->sr_err == LDAP_SUCCESS && !repl_user ) {
-               slap_mods_opattrs( op, &op->orr_modlist, 1 );
-       }
-#endif
-
        /* LDAP v2 supporting correct attribute handling. */
        if ( rs->sr_err != LDAP_SUCCESS && op->orr_modlist != NULL ) {
                Modifications *tmp;