]> git.sur5r.net Git - openldap/commitdiff
ITS#3648 use slapd runqueue for periodic sync
authorHoward Chu <hyc@openldap.org>
Tue, 12 Apr 2005 12:35:00 +0000 (12:35 +0000)
committerHoward Chu <hyc@openldap.org>
Tue, 12 Apr 2005 12:35:00 +0000 (12:35 +0000)
servers/slapd/back-ldbm/back-ldbm.h
servers/slapd/back-ldbm/close.c
servers/slapd/back-ldbm/dbcache.c
servers/slapd/back-ldbm/init.c
servers/slapd/back-ldbm/proto-back-ldbm.h

index cb0282fdb729d1cf052af061f6eb245501c0c3ef..6119e0ad9c4999069c03bce205a5faf8c5eea9a4 100644 (file)
@@ -151,8 +151,7 @@ struct ldbminfo {
        int                     li_dbsyncfreq;
        int                     li_dbsyncwaitn;
        int                     li_dbsyncwaitinterval;
-       ldap_pvt_thread_t       li_dbsynctid;
-       int                     li_dbshutdown;
+       int                     li_dbsyncwaitcount;
 };
 
 LDAP_END_DECL
index 7029786dfe430bfe04cf682158a95bbc083c3601..167f78d0fd98a08010736be262f756bee3014e5f 100644 (file)
@@ -27,17 +27,12 @@ int
 ldbm_back_db_close( Backend *be )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
-       if ( li->li_dbsyncfreq > 0 )
-       {
-               li->li_dbshutdown++;
-               ldap_pvt_thread_join( li->li_dbsynctid, (void *) NULL );
-       }
+
        Debug( LDAP_DEBUG_TRACE, "ldbm backend syncing\n", 0, 0, 0 );
 
        ldbm_cache_flush_all( be );
        Debug( LDAP_DEBUG_TRACE, "ldbm backend done syncing\n", 0, 0, 0 );
 
-
        cache_release_all( &((struct ldbminfo *) be->be_private)->li_cache );
 
        return 0;
index 74e655c14ed6e2c3de548e554648b15f49d3baf5..cbc28d0a18aa17593edee63012fe368aec6c096e 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "slap.h"
 #include "back-ldbm.h"
+#include <ldap_rq.h>
 
 DBCache *
 ldbm_cache_open(
@@ -264,10 +265,16 @@ ldbm_cache_sync( Backend *be )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        int             i;
+       int             do_log = 1;
 
        ldap_pvt_thread_mutex_lock( &li->li_dbcache_mutex );
        for ( i = 0; i < MAXDBCACHE; i++ ) {
                if ( li->li_dbcache[i].dbc_name != NULL && li->li_dbcache[i].dbc_dirty ) {
+                       if ( do_log ) {
+                               do_log = 0;
+                               Debug( LDAP_DEBUG_TRACE, "syncing %s\n",
+                                       li->li_directory, 0, 0 );
+                       }
                        Debug(  LDAP_DEBUG_TRACE, "ldbm syncing db (%s)\n",
                                li->li_dbcache[i].dbc_name, 0, 0 );
                        ldbm_sync( li->li_dbcache[i].dbc_db );
@@ -320,32 +327,30 @@ ldbm_cache_delete(
 
 void *
 ldbm_cache_sync_daemon(
-       void *be_ptr
+       void *ctx,
+       void *arg
 )
 {
-       Backend *be = (Backend *)be_ptr;
+       struct re_s *rtask = arg;
+       Backend *be = rtask->arg;
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
 
-       Debug( LDAP_DEBUG_ANY, "synchronizer starting for %s\n", li->li_directory, 0, 0 );
-  
-       while (!li->li_dbshutdown) {
-               int i = li->li_dbsyncwaitn;
-
-               sleep( li->li_dbsyncfreq );
-
-               while (i && ldap_pvt_thread_pool_backload(&connection_pool) != 0) {
-                       Debug( LDAP_DEBUG_TRACE, "delay syncing %s\n", li->li_directory, 0, 0 );
-                       sleep(li->li_dbsyncwaitinterval);
-                       i--;
-               }
-
-               if (!li->li_dbshutdown) {
-                       Debug( LDAP_DEBUG_TRACE, "syncing %s\n", li->li_directory, 0, 0 );
-                       ldbm_cache_sync( be );
-               }
+       /* If server is idle, or we've already waited the limit */
+       if ( li->li_dbsyncwaitcount == li->li_dbsyncwaitn || 
+               ldap_pvt_thread_pool_backload(&connection_pool) < 2 ) {
+               rtask->interval.tv_sec = li->li_dbsyncfreq;
+               li->li_dbsyncwaitcount = 0;
+               ldbm_cache_sync( be );
+       } else {
+               rtask->interval.tv_sec = li->li_dbsyncwaitinterval;
+               li->li_dbsyncwaitcount++;
+               Debug( LDAP_DEBUG_TRACE, "delay #%d syncing %s\n", 
+                       li->li_dbsyncwaitcount, li->li_directory, 0 );
        }
 
-       Debug( LDAP_DEBUG_ANY, "synchronizer stopping\n", 0, 0, 0 );
-  
+       ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+       ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
+       ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 );
+       ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
        return NULL;
 }
index 85802bff9d3d9424ad07fd0d4b7c64d0a723ddc9..feb88ddc70fca9126f5eb9317cc112ac63ba549e 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "slap.h"
 #include "back-ldbm.h"
+#include <ldap_rq.h>
 
 int
 ldbm_back_initialize(
@@ -174,8 +175,8 @@ ldbm_back_db_init(
        /* delay interval */
        li->li_dbsyncwaitinterval = 5;
 
-       /* flag to notify ldbm_cache_sync_daemon to shut down */
-       li->li_dbshutdown = 0;
+       /* current wait counter */
+       li->li_dbsyncwaitcount = 0;
 
        /* initialize various mutex locks & condition variables */
        ldap_pvt_thread_rdwr_init( &li->li_giant_rwlock );
@@ -197,19 +198,15 @@ ldbm_back_db_open(
        li->li_dbenv = ldbm_initialize_env( li->li_directory,
                li->li_dbcachesize, &li->li_envdirok );
 
-       /* sync thread */
-       if ( li->li_dbsyncfreq > 0 )
+       /* If we're in server mode and a sync frequency was set,
+        * submit a task to perform periodic db syncs.
+        */
+       if (( slapMode & SLAP_SERVER_MODE ) && li->li_dbsyncfreq > 0 )
        {
-               int rc;
-               rc = ldap_pvt_thread_create( &li->li_dbsynctid,
-                       0, ldbm_cache_sync_daemon, (void*)be );
-
-               if ( rc != 0 )
-               {
-                       Debug(  LDAP_DEBUG_ANY,
-                               "sync ldap_pvt_thread_create failed (%d)\n", rc, 0, 0 );
-                       return 1;
-               }
+               ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+               ldap_pvt_runqueue_insert( &slapd_rq, li->li_dbsyncfreq,
+                       ldbm_cache_sync_daemon, be );
+               ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
        }
 
        return 0;
index f0794f34264a46667e16968c711a583f0481e48a..83d48db0d46bebd4135a5ed54a87d70c0a522599 100644 (file)
@@ -82,7 +82,7 @@ Datum ldbm_cache_fetch LDAP_P(( DBCache *db, Datum key ));
 #endif /* 1 */
 int ldbm_cache_store LDAP_P(( DBCache *db, Datum key, Datum data, int flags ));
 int ldbm_cache_delete LDAP_P(( DBCache *db, Datum key ));
-void *ldbm_cache_sync_daemon LDAP_P(( void *));
+void *ldbm_cache_sync_daemon LDAP_P(( void *ctx, void *arg ));
 
 /*
  * dn2id.c