]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/syncrepl.c
Fix prev commit, config_obsolete
[openldap] / servers / slapd / syncrepl.c
index 4d9f28b3b73e750c6b93b98a5c6cadfb4b00e828..2913cf5ab8c87ec9918a395b51a8b35ee81e9c63 100644 (file)
@@ -59,46 +59,46 @@ typedef struct cookie_state {
 
 typedef struct syncinfo_s {
        struct syncinfo_s       *si_next;
-       struct slap_backend_db *si_be;
-       struct slap_backend_db *si_wbe;
-       struct re_s                     *si_re;
-       int                                     si_rid;
-       char                            si_ridtxt[8];
+       BackendDB               *si_be;
+       BackendDB               *si_wbe;
+       struct re_s             *si_re;
+       int                     si_rid;
+       char                    si_ridtxt[8];
        slap_bindconf           si_bindconf;
        struct berval           si_base;
        struct berval           si_logbase;
        struct berval           si_filterstr;
        struct berval           si_logfilterstr;
-       int                                     si_scope;
-       int                                     si_attrsonly;
-       char                            *si_anfile;
+       int                     si_scope;
+       int                     si_attrsonly;
+       char                    *si_anfile;
        AttributeName           *si_anlist;
        AttributeName           *si_exanlist;
-       char                            **si_attrs;
-       char                            **si_exattrs;
-       int                                     si_allattrs;
-       int                                     si_allopattrs;
-       int                                     si_schemachecking;
-       int                                     si_type;        /* the active type */
-       int                                     si_ctype;       /* the configured type */
-       time_t                          si_interval;
-       time_t                          *si_retryinterval;
-       int                                     *si_retrynum_init;
-       int                                     *si_retrynum;
+       char                    **si_attrs;
+       char                    **si_exattrs;
+       int                     si_allattrs;
+       int                     si_allopattrs;
+       int                     si_schemachecking;
+       int                     si_type;        /* the active type */
+       int                     si_ctype;       /* the configured type */
+       time_t                  si_interval;
+       time_t                  *si_retryinterval;
+       int                     *si_retrynum_init;
+       int                     *si_retrynum;
        struct sync_cookie      si_syncCookie;
        cookie_state            *si_cookieState;
-       int                                     si_cookieAge;
-       int                                     si_manageDSAit;
-       int                                     si_slimit;
-       int                                     si_tlimit;
-       int                                     si_refreshDelete;
-       int                                     si_refreshPresent;
-       int                                     si_syncdata;
-       int                                     si_logstate;
-       int                                     si_conn_setup;
-       Avlnode                         *si_presentlist;
-       LDAP                            *si_ld;
-       LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist;
+       int                     si_cookieAge;
+       int                     si_manageDSAit;
+       int                     si_slimit;
+       int                     si_tlimit;
+       int                     si_refreshDelete;
+       int                     si_refreshPresent;
+       int                     si_syncdata;
+       int                     si_logstate;
+       int                     si_conn_setup;
+       Avlnode                 *si_presentlist;
+       LDAP                    *si_ld;
+       LDAP_LIST_HEAD(np, nonpresent_entry)    si_nonpresentlist;
        ldap_pvt_thread_mutex_t si_mutex;
 } syncinfo_t;
 
@@ -120,9 +120,9 @@ static struct berval * slap_uuidstr_from_normalized(
                                        struct berval *, struct berval *, void * );
 
 /* callback functions */
-static int dn_callback( struct slap_op *, struct slap_rep * );
-static int nonpresent_callback( struct slap_op *, struct slap_rep * );
-static int null_callback( struct slap_op *, struct slap_rep * );
+static int dn_callback( Operation *, SlapReply * );
+static int nonpresent_callback( Operation *, SlapReply * );
+static int null_callback( Operation *, SlapReply * );
 
 static AttributeDescription *sync_descs[4];
 
@@ -499,7 +499,7 @@ do_syncrep1(
                                        si->si_cookieState->cs_vals = csn;
                                        for (i=0; !BER_BVISNULL( &csn[i] ); i++);
                                        si->si_cookieState->cs_num = i;
-                                       si->si_cookieState->cs_sids = slap_parse_csn_sids( csn, i );
+                                       si->si_cookieState->cs_sids = slap_parse_csn_sids( csn, i, NULL );
                                }
                        }
                        if ( si->si_cookieState->cs_num ) {
@@ -567,7 +567,7 @@ do_syncrep1(
                                si->si_cookieState->cs_num = num;
                                si->si_cookieState->cs_vals = a.a_vals;
                                si->si_cookieState->cs_sids = slap_parse_csn_sids( a.a_vals,
-                                       num );
+                                       num, NULL );
                                si->si_cookieState->cs_age++;
                        } else {
                                ber_bvarray_free( a.a_vals );
@@ -852,11 +852,11 @@ do_syncrep2(
                                        }
                                        ber_scanf( ber, /*"{"*/ "}" );
                                }
-                               if ( !syncCookie_req.ctxcsn ) {
+                               if ( !syncCookie.ctxcsn ) {
+                                       match = 1;
+                               } else if ( !syncCookie_req.ctxcsn ) {
                                        match = -1;
                                        m = 0;
-                               } else if ( !syncCookie.ctxcsn ) {
-                                       match = 1;
                                } else {
                                        match = compare_csns( &syncCookie_req, &syncCookie, &m );
                                }
@@ -999,11 +999,11 @@ do_syncrep2(
                                                continue;
                                        }
 
-                                       if ( !syncCookie_req.ctxcsn ) {
+                                       if ( !syncCookie.ctxcsn ) {
+                                               match = 1;
+                                       } else if ( !syncCookie_req.ctxcsn ) {
                                                match = -1;
                                                m = 0;
-                                       } else if ( !syncCookie.ctxcsn ) {
-                                               match = 1;
                                        } else {
                                                match = compare_csns( &syncCookie_req, &syncCookie, &m );
                                        }
@@ -1251,10 +1251,11 @@ reload:
                cs = be->be_syncinfo->si_cookieState;
                for ( sip = &be->be_syncinfo; *sip != si; sip = &(*sip)->si_next );
                *sip = si->si_next;
-               syncinfo_free( si );
+               syncinfo_free( si, 0 );
                if ( !be->be_syncinfo ) {
                        SLAP_DBFLAGS( be ) &= ~(SLAP_DBFLAG_SHADOW|SLAP_DBFLAG_SYNC_SHADOW);
                        if ( cs ) {
+                               ch_free( cs->cs_sids );
                                ber_bvarray_free( cs->cs_vals );
                                ldap_pvt_thread_mutex_destroy( &cs->cs_mutex );
                                ch_free( cs );
@@ -1498,6 +1499,7 @@ syncrepl_message_to_op(
                        op->orm_modlist = modlist;
                        op->o_bd = si->si_wbe;
                        rc = op->o_bd->be_modify( op, &rs );
+                       modlist = op->orm_modlist;
                        Debug( rc ? LDAP_DEBUG_ANY : LDAP_DEBUG_SYNC,
                                "syncrepl_message_to_op: %s be_modify %s (%d)\n", 
                                si->si_ridtxt, op->o_req_dn.bv_val, rc );
@@ -1633,8 +1635,7 @@ syncrepl_message_to_entry(
        }
 
        if ( entry == NULL ) {
-               rc = -1;
-               goto done;
+               return -1;
        }
 
        dnPrettyNormal( NULL, &bdn, &dn, &ndn, op->o_tmpmemctx );
@@ -1734,7 +1735,8 @@ done:
                        e = NULL;
                }
        }
-       *entry = e;
+       if ( entry )
+               *entry = e;
 
        return rc;
 }
@@ -2607,7 +2609,7 @@ syncrepl_updateCookie(
                        value_add( &si->si_cookieState->cs_vals, syncCookie->ctxcsn );
                        free( si->si_cookieState->cs_sids );
                        si->si_cookieState->cs_sids = slap_parse_csn_sids(
-                               si->si_cookieState->cs_vals, si->si_cookieState->cs_num );
+                               si->si_cookieState->cs_vals, si->si_cookieState->cs_num, NULL );
                }
 
                si->si_cookieState->cs_age++;
@@ -3069,106 +3071,119 @@ avl_ber_bvfree( void *v_bv )
 }
 
 void
-syncinfo_free( syncinfo_t *sie )
+syncinfo_free( syncinfo_t *sie, int free_all )
 {
-       if ( sie->si_ld ) {
-               if ( sie->si_conn_setup ) {
-                       ber_socket_t s;
-                       ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s );
-                       connection_client_stop( s );
-                       sie->si_conn_setup = 0;
-               }
-               ldap_unbind_ext( sie->si_ld, NULL, NULL );
-       }
+       syncinfo_t *si_next;
 
-       /* re-fetch it, in case it was already removed */
-       sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie );
-       if ( sie->si_re ) {
-               if ( ldap_pvt_runqueue_isrunning( &slapd_rq, sie->si_re ) )
-                       ldap_pvt_runqueue_stoptask( &slapd_rq, sie->si_re );
-               ldap_pvt_runqueue_remove( &slapd_rq, sie->si_re );
+       if ( free_all && sie->si_cookieState ) {
+               ch_free( sie->si_cookieState->cs_sids );
+               ber_bvarray_free( sie->si_cookieState->cs_vals );
+               ldap_pvt_thread_mutex_destroy( &sie->si_cookieState->cs_mutex );
+               ch_free( sie->si_cookieState );
        }
+       do {
+               si_next = sie->si_next;
 
-       ldap_pvt_thread_mutex_destroy( &sie->si_mutex );
-
-       bindconf_free( &sie->si_bindconf );
-
-       if ( sie->si_filterstr.bv_val ) {
-               ch_free( sie->si_filterstr.bv_val );
-       }
-       if ( sie->si_logfilterstr.bv_val ) {
-               ch_free( sie->si_logfilterstr.bv_val );
-       }
-       if ( sie->si_base.bv_val ) {
-               ch_free( sie->si_base.bv_val );
-       }
-       if ( sie->si_logbase.bv_val ) {
-               ch_free( sie->si_logbase.bv_val );
-       }
-       if ( sie->si_attrs ) {
-               int i = 0;
-               while ( sie->si_attrs[i] != NULL ) {
-                       ch_free( sie->si_attrs[i] );
-                       i++;
+               if ( sie->si_ld ) {
+                       if ( sie->si_conn_setup ) {
+                               ber_socket_t s;
+                               ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s );
+                               connection_client_stop( s );
+                               sie->si_conn_setup = 0;
+                       }
+                       ldap_unbind_ext( sie->si_ld, NULL, NULL );
                }
-               ch_free( sie->si_attrs );
-       }
-       if ( sie->si_exattrs ) {
-               int i = 0;
-               while ( sie->si_exattrs[i] != NULL ) {
-                       ch_free( sie->si_exattrs[i] );
-                       i++;
+       
+               /* re-fetch it, in case it was already removed */
+               sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie );
+               if ( sie->si_re ) {
+                       if ( ldap_pvt_runqueue_isrunning( &slapd_rq, sie->si_re ) )
+                               ldap_pvt_runqueue_stoptask( &slapd_rq, sie->si_re );
+                       ldap_pvt_runqueue_remove( &slapd_rq, sie->si_re );
                }
-               ch_free( sie->si_exattrs );
-       }
-       if ( sie->si_anlist ) {
-               int i = 0;
-               while ( sie->si_anlist[i].an_name.bv_val != NULL ) {
-                       ch_free( sie->si_anlist[i].an_name.bv_val );
-                       i++;
+       
+               ldap_pvt_thread_mutex_destroy( &sie->si_mutex );
+       
+               bindconf_free( &sie->si_bindconf );
+       
+               if ( sie->si_filterstr.bv_val ) {
+                       ch_free( sie->si_filterstr.bv_val );
                }
-               ch_free( sie->si_anlist );
-       }
-       if ( sie->si_exanlist ) {
-               int i = 0;
-               while ( sie->si_exanlist[i].an_name.bv_val != NULL ) {
-                       ch_free( sie->si_exanlist[i].an_name.bv_val );
-                       i++;
+               if ( sie->si_logfilterstr.bv_val ) {
+                       ch_free( sie->si_logfilterstr.bv_val );
                }
-               ch_free( sie->si_exanlist );
-       }
-       if ( sie->si_retryinterval ) {
-               ch_free( sie->si_retryinterval );
-       }
-       if ( sie->si_retrynum ) {
-               ch_free( sie->si_retrynum );
-       }
-       if ( sie->si_retrynum_init ) {
-               ch_free( sie->si_retrynum_init );
-       }
-       slap_sync_cookie_free( &sie->si_syncCookie, 0 );
-       if ( sie->si_presentlist ) {
-           avl_free( sie->si_presentlist, avl_ber_bvfree );
-       }
-       while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist ) ) {
-               struct nonpresent_entry* npe;
-               npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist );
-               LDAP_LIST_REMOVE( npe, npe_link );
-               if ( npe->npe_name ) {
-                       if ( npe->npe_name->bv_val ) {
-                               ch_free( npe->npe_name->bv_val );
+               if ( sie->si_base.bv_val ) {
+                       ch_free( sie->si_base.bv_val );
+               }
+               if ( sie->si_logbase.bv_val ) {
+                       ch_free( sie->si_logbase.bv_val );
+               }
+               if ( sie->si_attrs ) {
+                       int i = 0;
+                       while ( sie->si_attrs[i] != NULL ) {
+                               ch_free( sie->si_attrs[i] );
+                               i++;
                        }
-                       ch_free( npe->npe_name );
+                       ch_free( sie->si_attrs );
                }
-               if ( npe->npe_nname ) {
-                       if ( npe->npe_nname->bv_val ) {
-                               ch_free( npe->npe_nname->bv_val );
+               if ( sie->si_exattrs ) {
+                       int i = 0;
+                       while ( sie->si_exattrs[i] != NULL ) {
+                               ch_free( sie->si_exattrs[i] );
+                               i++;
                        }
-                       ch_free( npe->npe_nname );
+                       ch_free( sie->si_exattrs );
                }
-               ch_free( npe );
-       }
-       ch_free( sie );
+               if ( sie->si_anlist ) {
+                       int i = 0;
+                       while ( sie->si_anlist[i].an_name.bv_val != NULL ) {
+                               ch_free( sie->si_anlist[i].an_name.bv_val );
+                               i++;
+                       }
+                       ch_free( sie->si_anlist );
+               }
+               if ( sie->si_exanlist ) {
+                       int i = 0;
+                       while ( sie->si_exanlist[i].an_name.bv_val != NULL ) {
+                               ch_free( sie->si_exanlist[i].an_name.bv_val );
+                               i++;
+                       }
+                       ch_free( sie->si_exanlist );
+               }
+               if ( sie->si_retryinterval ) {
+                       ch_free( sie->si_retryinterval );
+               }
+               if ( sie->si_retrynum ) {
+                       ch_free( sie->si_retrynum );
+               }
+               if ( sie->si_retrynum_init ) {
+                       ch_free( sie->si_retrynum_init );
+               }
+               slap_sync_cookie_free( &sie->si_syncCookie, 0 );
+               if ( sie->si_presentlist ) {
+                   avl_free( sie->si_presentlist, avl_ber_bvfree );
+               }
+               while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist ) ) {
+                       struct nonpresent_entry* npe;
+                       npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist );
+                       LDAP_LIST_REMOVE( npe, npe_link );
+                       if ( npe->npe_name ) {
+                               if ( npe->npe_name->bv_val ) {
+                                       ch_free( npe->npe_name->bv_val );
+                               }
+                               ch_free( npe->npe_name );
+                       }
+                       if ( npe->npe_nname ) {
+                               if ( npe->npe_nname->bv_val ) {
+                                       ch_free( npe->npe_nname->bv_val );
+                               }
+                               ch_free( npe->npe_nname );
+                       }
+                       ch_free( npe );
+               }
+               ch_free( sie );
+               sie = si_next;
+       } while ( free_all && si_next );
 }
 
 
@@ -3705,7 +3720,7 @@ add_syncrepl(
                        Debug( LDAP_DEBUG_ANY,
                                "version %d incompatible with syncrepl\n",
                                si->si_bindconf.sb_version, 0, 0 );
-                       syncinfo_free( si );    
+                       syncinfo_free( si, 0 ); 
                        return 1;
                }
 
@@ -3748,7 +3763,7 @@ add_syncrepl(
 #endif
        if ( rc < 0 ) {
                Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 );
-               syncinfo_free( si );    
+               syncinfo_free( si, 0 ); 
                return 1;
        } else {
                Debug( LDAP_DEBUG_CONFIG,
@@ -3790,7 +3805,7 @@ syncrepl_unparse( syncinfo_t *si, struct berval *bv )
        si->si_bindconf.sb_version = LDAP_VERSION3;
 
        ptr = buf;
-       ptr += snprintf( ptr, WHATSLEFT, IDSTR "=%03ld " PROVIDERSTR "=%s",
+       ptr += snprintf( ptr, WHATSLEFT, IDSTR "=%03d " PROVIDERSTR "=%s",
                si->si_rid, si->si_bindconf.sb_uri.bv_val );
        if ( ptr - buf >= sizeof( buf ) ) return;
        if ( !BER_BVISNULL( &bc ) ) {
@@ -3967,7 +3982,7 @@ syncrepl_config( ConfigArgs *c )
                                                ldap_pvt_runqueue_isrunning( &slapd_rq, si->si_re ) ) {
                                                si->si_ctype = 0;
                                        } else {
-                                               syncinfo_free( si );
+                                               syncinfo_free( si, 0 );
                                        }
                                        if ( i == c->valx )
                                                break;