]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/syncprov.c
trim listed modules
[openldap] / servers / slapd / overlays / syncprov.c
index 410183bb252be7a555ec71c9907ea7563c630e0c..278820284197440477f27635b966d65cd42a6bf7 100644 (file)
@@ -2,7 +2,7 @@
 /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2004-2006 The OpenLDAP Foundation.
+ * Copyright 2004-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -906,9 +906,9 @@ syncprov_qtask( void *ctx, void *arg )
 
        /* wait until we get explicitly scheduled again */
        ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
-       ldap_pvt_runqueue_stoptask( &slapd_rq, so->s_qtask );
+       ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
        if ( rc == 0 ) {
-               ldap_pvt_runqueue_resched( &slapd_rq, so->s_qtask, 1 );
+               ldap_pvt_runqueue_resched( &slapd_rq, rtask, 1 );
        } else {
                /* bail out on any error */
                ldap_pvt_runqueue_remove( &slapd_rq, rtask );
@@ -1260,9 +1260,9 @@ syncprov_op_cleanup( Operation *op, SlapReply *rs )
 }
 
 static void
-syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on )
+syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on,
+       struct berval *csn )
 {
-       syncprov_info_t         *si = on->on_bi.bi_private;
        Modifications mod;
        Operation opm;
        SlapReply rsm = { 0 };
@@ -1270,12 +1270,12 @@ syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on )
        slap_callback cb = {0};
 
        /* If ctxcsn is empty, delete it */
-       if ( BER_BVISEMPTY( &si->si_ctxcsn )) {
+       if ( BER_BVISEMPTY( csn )) {
                mod.sml_values = NULL;
        } else {
                mod.sml_values = bv;
                bv[1].bv_val = NULL;
-               bv[0] = si->si_ctxcsn;
+               bv[0] = *csn;
        }
        mod.sml_nvalues = NULL;
        mod.sml_desc = slap_schema.si_ad_contextCSN;
@@ -1510,6 +1510,7 @@ syncprov_op_response( Operation *op, SlapReply *rs )
        {
                struct berval maxcsn = BER_BVNULL;
                char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
+               int do_check = 0;
 
                /* Update our context CSN */
                cbuf[0] = '\0';
@@ -1532,7 +1533,6 @@ syncprov_op_response( Operation *op, SlapReply *rs )
 
                si->si_numops++;
                if ( si->si_chkops || si->si_chktime ) {
-                       int do_check=0;
                        if ( si->si_chkops && si->si_numops >= si->si_chkops ) {
                                do_check = 1;
                                si->si_numops = 0;
@@ -1542,15 +1542,16 @@ syncprov_op_response( Operation *op, SlapReply *rs )
                                do_check = 1;
                                si->si_chklast = op->o_time;
                        }
-                       if ( do_check ) {
-                               syncprov_checkpoint( op, rs, on );
-                       }
                }
                ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );
 
                opc->sctxcsn.bv_len = maxcsn.bv_len;
                opc->sctxcsn.bv_val = cbuf;
 
+               if ( do_check ) {
+                       syncprov_checkpoint( op, rs, on, &opc->sctxcsn );
+               }
+
                /* Handle any persistent searches */
                if ( si->si_ops ) {
                        switch(op->o_tag) {
@@ -2280,27 +2281,31 @@ sp_cf_gen(ConfigArgs *c)
        switch ( c->type ) {
        case SP_CHKPT:
                if ( lutil_atoi( &si->si_chkops, c->argv[1] ) != 0 ) {
-                       sprintf( c->msg, "%s unable to parse checkpoint ops # \"%s\"",
+                       snprintf( c->msg, sizeof( c->msg ), "%s unable to parse checkpoint ops # \"%s\"",
                                c->argv[0], c->argv[1] );
-                       Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );
+                       Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->msg, 0 );
                        return ARG_BAD_CONF;
                }
                if ( si->si_chkops <= 0 ) {
-                       sprintf( c->msg, "%s invalid checkpoint ops # \"%d\"",
+                       snprintf( c->msg, sizeof( c->msg ), "%s invalid checkpoint ops # \"%d\"",
                                c->argv[0], si->si_chkops );
-                       Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );
+                       Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->msg, 0 );
                        return ARG_BAD_CONF;
                }
                if ( lutil_atoi( &si->si_chktime, c->argv[2] ) != 0 ) {
-                       sprintf( c->msg, "%s unable to parse checkpoint time \"%s\"",
+                       snprintf( c->msg, sizeof( c->msg ), "%s unable to parse checkpoint time \"%s\"",
                                c->argv[0], c->argv[1] );
-                       Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );
+                       Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->msg, 0 );
                        return ARG_BAD_CONF;
                }
                if ( si->si_chktime <= 0 ) {
-                       sprintf( c->msg, "%s invalid checkpoint time \"%d\"",
+                       snprintf( c->msg, sizeof( c->msg ), "%s invalid checkpoint time \"%d\"",
                                c->argv[0], si->si_chkops );
-                       Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );
+                       Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->msg, 0 );
                        return ARG_BAD_CONF;
                }
                si->si_chktime *= 60;
@@ -2310,9 +2315,10 @@ sp_cf_gen(ConfigArgs *c)
                int size = c->value_int;
 
                if ( size < 0 ) {
-                       sprintf( c->msg, "%s size %d is negative",
+                       snprintf( c->msg, sizeof( c->msg ), "%s size %d is negative",
                                c->argv[0], size );
-                       Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );
+                       Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->msg, 0 );
                        return ARG_BAD_CONF;
                }
                sl = si->si_logs;
@@ -2472,7 +2478,7 @@ syncprov_db_close(
                op->o_bd = be;
                op->o_dn = be->be_rootdn;
                op->o_ndn = be->be_rootndn;
-               syncprov_checkpoint( op, &rs, on );
+               syncprov_checkpoint( op, &rs, on, &si->si_ctxcsn );
                ldap_pvt_thread_pool_context_reset( thrctx );
        }
 
@@ -2487,6 +2493,13 @@ syncprov_db_init(
        slap_overinst   *on = (slap_overinst *)be->bd_info;
        syncprov_info_t *si;
 
+       if ( SLAP_ISGLOBALOVERLAY( be ) ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "syncprov must be instantiated within a database.\n",
+                       0, 0, 0 );
+               return 1;
+       }
+
        si = ch_calloc(1, sizeof(syncprov_info_t));
        on->on_bi.bi_private = si;
        ldap_pvt_thread_mutex_init( &si->si_csn_mutex );