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

When applying changes, use the relevant transaction id.


diffs (160 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -14,7 +14,7 @@
 #include "mutils.h"
 #include <string.h>
 
-static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id);
+static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id, int tid);
 static gdk_return logger_del_bat(logger *lg, log_bid bid);
 /*
  * The logger uses a directory to store its log files. One master log
@@ -179,18 +179,33 @@ log_find(BAT *b, BAT *d, int val)
 }
 
 static log_bid
-internal_find_bat(logger *lg, log_id id)
+internal_find_bat(logger *lg, log_id id, int tid)
 {
        BATiter cni = bat_iterator_nolock(lg->catalog_id);
        BUN p;
 
        if (BAThash(lg->catalog_id) == GDK_SUCCEED) {
                MT_rwlock_rdlock(&cni.b->thashlock);
-               HASHloop_int(cni, cni.b->thash, p, &id) {
-                       oid pos = p;
-                       if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) {
+               if (tid < 0) {
+                       HASHloop_int(cni, cni.b->thash, p, &id) {
+                               oid pos = p;
+                               if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) {
+                                       MT_rwlock_rdunlock(&cni.b->thashlock);
+                                       return *(log_bid *) 
Tloc(lg->catalog_bid, p);
+                               }
+                       }
+               } else {
+                       BUN cp = BUN_NONE;
+                       HASHloop_int(cni, cni.b->thash, p, &id) {
+                               lng lid = *(lng *) Tloc(lg->catalog_lid, p);
+                               if (lid != lng_nil && lid <= tid) {
+                                       break;
+                               }
+                               cp = p;
+                       }
+                       if (cp != BUN_NONE) {
                                MT_rwlock_rdunlock(&cni.b->thashlock);
-                               return *(log_bid *) Tloc(lg->catalog_bid, p);
+                               return *(log_bid *) Tloc(lg->catalog_bid, cp);
                        }
                }
                MT_rwlock_rdunlock(&cni.b->thashlock);
@@ -254,9 +269,9 @@ log_read_clear(logger *lg, trans *tr, lo
 }
 
 static gdk_return
-la_bat_clear(logger *lg, logaction *la)
+la_bat_clear(logger *lg, logaction *la, int tid)
 {
-       log_bid bid = internal_find_bat(lg, la->cid);
+       log_bid bid = internal_find_bat(lg, la->cid, tid);
        BAT *b;
 
        if (lg->debug & 1)
@@ -621,7 +636,7 @@ la_bat_update_count(logger *lg, log_id i
 static gdk_return
 la_bat_updates(logger *lg, logaction *la, int tid)
 {
-       log_bid bid = internal_find_bat(lg, la->cid);
+       log_bid bid = internal_find_bat(lg, la->cid, tid);
        BAT *b = NULL;
 
        if (bid == 0)
@@ -723,9 +738,9 @@ log_read_destroy(logger *lg, trans *tr, 
 }
 
 static gdk_return
-la_bat_destroy(logger *lg, logaction *la)
+la_bat_destroy(logger *lg, logaction *la, int tid)
 {
-       log_bid bid = internal_find_bat(lg, la->cid);
+       log_bid bid = internal_find_bat(lg, la->cid, tid);
 
        if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED)
                return GDK_FAIL;
@@ -758,7 +773,7 @@ log_read_create(logger *lg, trans *tr, l
 }
 
 static gdk_return
-la_bat_create(logger *lg, logaction *la)
+la_bat_create(logger *lg, logaction *la, int tid)
 {
        BAT *b;
 
@@ -770,7 +785,7 @@ la_bat_create(logger *lg, logaction *la)
                BATtseqbase(b, 0);
 
        if ((b = BATsetaccess(b, BAT_READ)) == NULL ||
-           logger_add_bat(lg, b, la->cid) != GDK_SUCCEED) {
+           logger_add_bat(lg, b, la->cid, tid) != GDK_SUCCEED) {
                logbat_destroy(b);
                return GDK_FAIL;
        }
@@ -845,15 +860,15 @@ la_apply(logger *lg, logaction *c, int t
                break;
        case LOG_CREATE:
                if (!lg->flushing)
-                       ret = la_bat_create(lg, c);
+                       ret = la_bat_create(lg, c, tid);
                break;
        case LOG_DESTROY:
                if (!lg->flushing)
-                       ret = la_bat_destroy(lg, c);
+                       ret = la_bat_destroy(lg, c, tid);
                break;
        case LOG_CLEAR:
                if (!lg->flushing)
-                       ret = la_bat_clear(lg, c);
+                       ret = la_bat_clear(lg, c, tid);
                break;
        default:
                assert(0);
@@ -2519,7 +2534,7 @@ log_bat_persists(logger *lg, BAT *b, log
        bte ta = find_type(lg, b->ttype);
        logformat l;
 
-       if (logger_add_bat(lg, b, id) != GDK_SUCCEED) {
+       if (logger_add_bat(lg, b, id, -1) != GDK_SUCCEED) {
                logger_unlock(lg);
                return GDK_FAIL;
        }
@@ -2545,7 +2560,7 @@ gdk_return
 log_bat_transient(logger *lg, log_id id)
 {
        logger_lock(lg);
-       log_bid bid = internal_find_bat(lg, id);
+       log_bid bid = internal_find_bat(lg, id, -1);
        logformat l;
 
        l.flag = LOG_DESTROY;
@@ -2830,9 +2845,9 @@ bm_commit(logger *lg)
 }
 
 static gdk_return
-logger_add_bat(logger *lg, BAT *b, log_id id)
+logger_add_bat(logger *lg, BAT *b, log_id id, int tid)
 {
-       log_bid bid = internal_find_bat(lg, id);
+       log_bid bid = internal_find_bat(lg, id, tid);
        lng cnt = 0;
        lng lid = lng_nil;
 
@@ -2894,7 +2909,7 @@ log_bid
 logger_find_bat(logger *lg, log_id id)
 {
        logger_lock(lg);
-       log_bid bid = internal_find_bat(lg, id);
+       log_bid bid = internal_find_bat(lg, id, -1);
        logger_unlock(lg);
        return bid;
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to