Changeset: a7d47be1a358 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a7d47be1a358
Modified Files:
        gdk/gdk_logger.c
Branch: Jan2022
Log Message:

Merge with Jul2021 branch.


diffs (112 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2246,19 +2246,26 @@ logger_create(int debug, const char *fn,
 static ulng
 logger_next_logfile(logger *lg, ulng ts)
 {
+       int m = (GDKdebug & FORCEMITOMASK)?1000:10;
        if (!lg->pending || !lg->pending->next)
                return 0;
-       if (lg->pending->last_ts <= ts)
-               return lg->pending->id;
+       if (lg->pending != lg->current && lg->pending->last_ts <= ts) {
+               logged_range *p = lg->pending;
+               for(int i = 1; i<m && p->next && p->next != lg->current && 
p->last_ts <= ts; i++)
+                       p = p->next;
+               return p->id;
+       }
        return 0;
 }
 
 static void
-logger_cleanup_range(logger *lg)
+logger_cleanup_range(logger *lg, ulng id)
 {
-       logged_range *p = lg->pending;
-       if (p) {
-               lg->pending = p->next;
+       while (lg->pending && lg->pending->id <= id) {
+               logged_range *p;
+               p = lg->pending;
+               if (p)
+                       lg->pending = p->next;
                GDKfree(p);
        }
 }
@@ -2279,28 +2286,30 @@ logger_activate(logger *lg)
 gdk_return
 logger_flush(logger *lg, ulng ts)
 {
-       ulng lid = logger_next_logfile(lg, ts);
+       ulng lid = logger_next_logfile(lg, ts), olid = lg->saved_id;
        if (LOG_DISABLED(lg)) {
                lg->saved_id = lid;
                lg->saved_tid = lg->tid;
                if (lid)
-                       logger_cleanup_range(lg);
+                       logger_cleanup_range(lg, lg->saved_id);
                if (logger_commit(lg) != GDK_SUCCEED)
                        TRC_ERROR(GDK, "failed to commit");
                return GDK_SUCCEED;
        }
        if (lg->saved_id >= lid)
                return GDK_SUCCEED;
-       if (lg->saved_id+1 >= lg->id) /* logger should first release the file */
+       ulng lgid = lg->id;
+       if (lg->saved_id+1 >= lgid) /* logger should first release the file */
                return GDK_SUCCEED;
        log_return res = LOG_OK;
-       while(lg->saved_id < lid && res == LOG_OK) {
-               if (lg->saved_id >= lg->id)
-                       break;
+       ulng cid = olid;
+       if (lid > lgid)
+               lid = lgid;
+       while(cid < lid && res == LOG_OK) {
                if (!lg->input_log) {
                        char *filename;
                        char id[32];
-                       if (snprintf(id, sizeof(id), LLFMT, lg->saved_id+1) >= 
(int) sizeof(id)) {
+                       if (snprintf(id, sizeof(id), LLFMT, cid+1) >= (int) 
sizeof(id)) {
                                TRC_CRITICAL(GDK, "log_id filename is too 
large\n");
                                return GDK_FAIL;
                        }
@@ -2329,22 +2338,25 @@ logger_flush(logger *lg, ulng ts)
                        logger_close_input(lg);
                        res = LOG_OK;
                }
+               cid++;
+       }
+       if (lid > olid && res == LOG_OK) {
+               lg->saved_id = lid;
+               if (logger_commit(lg) != GDK_SUCCEED) {
+                       TRC_ERROR(GDK, "failed to commit");
+                       res = LOG_ERR;
+                       lg->saved_id = olid; /* reset !! */
+               }
                if (res != LOG_ERR) {
-                       lg->saved_id++;
-                       if (logger_commit(lg) != GDK_SUCCEED) {
-                               TRC_ERROR(GDK, "failed to commit");
-                               res = LOG_ERR;
-                       }
-
-                       /* remove old log file */
-                       if (res != LOG_ERR) {
-                               if (logger_cleanup(lg, lg->saved_id) != 
GDK_SUCCEED)
-                                       res = LOG_ERR;
+                       while(olid <= lid) {
+                               /* Try to cleanup, remove old log file, 
continue on failure! */
+                               (void)logger_cleanup(lg, olid);
+                               olid++;
                        }
                }
+               if (res == LOG_OK)
+                       logger_cleanup_range(lg, lg->saved_id);
        }
-       if (lid && res == LOG_OK)
-               logger_cleanup_range(lg);
        return res == LOG_ERR ? GDK_FAIL : GDK_SUCCEED;
 }
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to