Changeset: be20d1f84f0b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/be20d1f84f0b
Modified Files:
        gdk/gdk_logger.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jul2021
Log Message:

After 30 seconds of idleness, rotate the WAL.


diffs (146 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1007,9 +1007,8 @@ logger_open_output(logger *lg)
                return GDK_FAIL;
        }
 
-       if (LOG_DISABLED(lg)) {
-               lg->end = 0;
-       } else {
+       lg->end = 0;
+       if (!LOG_DISABLED(lg)) {
                char id[32];
                char *filename;
 
@@ -2428,8 +2427,7 @@ internal_log_bat(logger *lg, BAT *b, log
 
        if (LOG_DISABLED(lg) || !nr) {
                /* logging is switched off */
-               if (LOG_DISABLED(lg))
-                       lg->end += nr;
+               lg->end += nr;
                if (nr)
                        return la_bat_update_count(lg, id, offset+cnt);
                return GDK_SUCCEED;
@@ -2523,9 +2521,8 @@ log_bat_persists(logger *lg, BAT *b, log
                        logger_unlock(lg);
                        return GDK_FAIL;
                }
-       } else {
-               lg->end++;
        }
+       lg->end++;
        if (lg->debug & 1)
                fprintf(stderr, "#persists id (%d) bat (%d)\n", id, 
b->batCacheid);
        gdk_return r = internal_log_bat(lg, b, id, 0, BATcount(b), 0);
@@ -2549,9 +2546,8 @@ log_bat_transient(logger *lg, log_id id)
                        logger_unlock(lg);
                        return GDK_FAIL;
                }
-       } else {
-               lg->end++;
        }
+       lg->end++;
        if (lg->debug & 1)
                fprintf(stderr, "#Logged destroyed bat (%d) %d\n", id,
                                bid);
@@ -2593,8 +2589,8 @@ log_delta(logger *lg, BAT *uid, BAT *uva
        nr = (BUNlast(uval));
        assert(nr);
 
+       lg->end += nr;
        if (LOG_DISABLED(lg)) {
-               lg->end += nr;
                /* logging is switched off */
                logger_unlock(lg);
                return GDK_SUCCEED;
@@ -2648,8 +2644,8 @@ log_bat_clear(logger *lg, int id)
 {
        logformat l;
 
+       lg->end++;
        if (LOG_DISABLED(lg)) {
-               lg->end++;
                logger_lock(lg);
                gdk_return res = la_bat_update_count(lg, id, 0);
                logger_unlock(lg);
@@ -2702,8 +2698,8 @@ log_tend(logger *lg)
                return logger_commit(lg);
        }
 
+       lg->end++;
        if (LOG_DISABLED(lg)) {
-               lg->end++;
                return GDK_SUCCEED;
        }
 
@@ -2909,8 +2905,8 @@ log_tstart(logger *lg, bool flushnow)
                lg->flushnow = flushnow;
        }
 
+       lg->end++;
        if (LOG_DISABLED(lg)) {
-               lg->end++;
                return GDK_SUCCEED;
        }
 
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -454,6 +454,7 @@ typedef struct sqlstore {
        list *active;                   /* list of running transactions */
 
        ATOMIC_TYPE nr_active;  /* count number of transactions */
+       ATOMIC_TYPE lastactive; /* timestamp of last active client */
     ATOMIC_TYPE timestamp;     /* timestamp counter */
     ATOMIC_TYPE transaction;/* transaction id counter */
        ulng oldest;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2031,6 +2031,9 @@ store_init(int debug, store_type store_t
                .singleuser = singleuser,
                .debug = debug,
                .transaction = ATOMIC_VAR_INIT(TRANSACTION_ID_BASE),
+               .nr_active = ATOMIC_VAR_INIT(0),
+               .timestamp = ATOMIC_VAR_INIT(0),
+               .lastactive = ATOMIC_VAR_INIT(0),
                .sa = pa,
        };
 
@@ -2264,6 +2267,8 @@ store_pending_changes(sqlstore *store, u
        store->oldest_pending = oldest_changes;
 }
 
+#define IDLE_TIME      30                      /* in seconds */
+
 void
 store_manager(sqlstore *store)
 {
@@ -2275,7 +2280,8 @@ store_manager(sqlstore *store)
        for (;;) {
                int res;
 
-               if (store->debug&128 && ATOMIC_GET(&store->nr_active) == 0) {
+               if (ATOMIC_GET(&store->nr_active) == 0 &&
+                       (store->debug&128 || ATOMIC_GET(&store->lastactive) + 
IDLE_TIME < (ATOMIC_BASE_TYPE) (GDKusec() / 1000000))) {
                        MT_lock_unset(&store->flush);
                        store_lock(store);
                        if (ATOMIC_GET(&store->nr_active) == 0) {
@@ -2285,6 +2291,7 @@ store_manager(sqlstore *store)
                        store_unlock(store);
                        MT_lock_set(&store->flush);
                        store->logger_api.activate(store); /* rotate to new log 
file */
+                       ATOMIC_SET(&store->lastactive, GDKusec() / 1000000);
                }
 
                if (GDKexiting())
@@ -6739,6 +6746,7 @@ sql_trans_end(sql_session *s, int ok)
        sqlstore *store = s->tr->store;
        store_lock(store);
        list_remove_data(store->active, NULL, s);
+       ATOMIC_SET(&store->lastactive, GDKusec() / 1000000);
        (void) ATOMIC_DEC(&store->nr_active);
        ulng oldest = store_get_timestamp(store);
        if (store->active && store->active->h) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to