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