Changeset: fc42a2970fbe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fc42a2970fbe
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger_old.c
        sql/storage/bat/bat_logger.c
        sql/storage/bat/bat_storage.c
Branch: Jan2022
Log Message:

BAThash can fail (e.g. when exiting), also inside the logger.


diffs (truncated from 531 to 300 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -209,8 +209,9 @@ internal_find_bat(logger *lg, log_id id,
                        }
                }
                MT_rwlock_rdunlock(&cni.b->thashlock);
+               return 0;       /* not found */
        }
-       return 0;
+       return -1;              /* error creating hash */
 }
 
 static void
@@ -274,6 +275,9 @@ la_bat_clear(logger *lg, logaction *la, 
        log_bid bid = internal_find_bat(lg, la->cid, tid);
        BAT *b;
 
+       if (bid < 0)
+               return GDK_FAIL;
+
        if (lg->debug & 1)
                fprintf(stderr, "#la_bat_clear %d\n", la->cid);
 
@@ -633,8 +637,9 @@ la_bat_update_count(logger *lg, log_id i
                        }
                }
                MT_rwlock_rdunlock(&cni.b->thashlock);
+               return GDK_SUCCEED;
        }
-       return GDK_SUCCEED;
+       return GDK_FAIL;
 }
 
 static gdk_return
@@ -643,6 +648,8 @@ la_bat_updates(logger *lg, logaction *la
        log_bid bid = internal_find_bat(lg, la->cid, tid);
        BAT *b = NULL;
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid == 0)
                return GDK_SUCCEED; /* ignore bats no longer in the catalog */
 
@@ -746,6 +753,8 @@ la_bat_destroy(logger *lg, logaction *la
 {
        log_bid bid = internal_find_bat(lg, la->cid, tid);
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED)
                return GDK_FAIL;
        return GDK_SUCCEED;
@@ -2589,6 +2598,10 @@ log_bat_transient(logger *lg, log_id id)
        log_bid bid = internal_find_bat(lg, id, -1);
        logformat l;
 
+       if (bid < 0) {
+               logger_unlock(lg);
+               return GDK_FAIL;
+       }
        l.flag = LOG_DESTROY;
        l.id = id;
 
@@ -2887,6 +2900,8 @@ logger_add_bat(logger *lg, BAT *b, log_i
               b == lg->seqs_val ||
               b == lg->dseqs);
        assert(b->batRole == PERSISTENT);
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid) {
                if (bid != b->batCacheid) {
                        if (logger_del_bat(lg, bid) != GDK_SUCCEED)
diff --git a/gdk/gdk_logger_old.c b/gdk/gdk_logger_old.c
--- a/gdk/gdk_logger_old.c
+++ b/gdk/gdk_logger_old.c
@@ -313,6 +313,7 @@ old_logger_find_bat(old_logger *lg, cons
                                }
                        }
                        MT_rwlock_rdunlock(&cni.b->thashlock);
+                       return 0; /* not found */
                }
        } else {
                BATiter cni = bat_iterator_nolock(lg->catalog_oid);
@@ -331,9 +332,10 @@ old_logger_find_bat(old_logger *lg, cons
                                }
                        }
                        MT_rwlock_rdunlock(&cni.b->thashlock);
+                       return 0; /* not found */
                }
        }
-       return 0;
+       return -1;              /* BAThash failed */
 }
 
 static gdk_return
@@ -342,6 +344,9 @@ la_bat_clear(old_logger *lg, logaction *
        log_bid bid = old_logger_find_bat(lg, la->name, la->tpe, la->cid);
        BAT *b;
 
+       if (bid < 0)
+               return GDK_FAIL;
+
        if (lg->lg->debug & 1)
                fprintf(stderr, "#la_bat_clear %s\n", NAME(la->name, la->tpe, 
la->cid));
 
@@ -409,6 +414,8 @@ static log_return
 log_read_updates(old_logger *lg, trans *tr, logformat *l, char *name, int tpe, 
oid id, int pax)
 {
        log_bid bid = old_logger_find_bat(lg, name, tpe, id);
+       if (bid < 0)
+               return LOG_ERR;
        BAT *b = BATdescriptor(bid);
        log_return res = LOG_OK;
        int ht = -1, tt = -1, tseq = 0;
@@ -625,6 +632,8 @@ la_bat_updates(old_logger *lg, logaction
        log_bid bid = old_logger_find_bat(lg, la->name, la->tpe, la->cid);
        BAT *b;
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid == 0)
                return GDK_SUCCEED; /* ignore bats no longer in the catalog */
 
@@ -704,6 +713,8 @@ la_bat_destroy(old_logger *lg, logaction
 {
        log_bid bid = old_logger_find_bat(lg, la->name, la->tpe, la->cid);
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid) {
                BUN p;
 
@@ -1494,6 +1505,8 @@ logger_load(const char *fn, char filenam
                goto error;
        }
        snapshots_bid = old_logger_find_bat(lg, "snapshots_bid", 0, 0);
+       if (snapshots_bid < 0)
+               goto error;
        if (snapshots_bid == 0) {
                lg->snapshots_bid = logbat_new(TYPE_int, 1, TRANSIENT);
                lg->snapshots_tid = logbat_new(TYPE_int, 1, TRANSIENT);
@@ -1508,6 +1521,8 @@ logger_load(const char *fn, char filenam
                bat snapshots_tid = old_logger_find_bat(lg, "snapshots_tid", 0, 
0);
                bat dsnapshots = old_logger_find_bat(lg, "dsnapshots", 0, 0);
 
+               if (snapshots_tid < 0 || dsnapshots < 0)
+                       goto error;
                GDKdebug &= ~CHECKMASK;
                lg->snapshots_bid = BATdescriptor(snapshots_bid);
                if (lg->snapshots_bid == NULL) {
@@ -1924,6 +1939,8 @@ logger_add_bat(old_logger *lg, BAT *b, c
               b == lg->seqs_val ||
               b == lg->dseqs);
        assert(b->batRole == PERSISTENT);
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid) {
                if (bid != b->batCacheid) {
                        if (logger_del_bat(lg, bid) != GDK_SUCCEED)
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -78,6 +78,14 @@ bl_preversion(sqlstore *store, int oldve
 
 #define D(schema, table)       "D_" schema "_" table
 
+static BAT *
+log_temp_descriptor(log_bid b)
+{
+       if (b <= 0)
+               return NULL;
+       return temp_descriptor(b);
+}
+
 #if defined CATALOG_JUN2020 || defined CATALOG_OCT2020
 static gdk_return
 tabins(logger *lg, old_logger *old_lg, bool first, int tt, int nid, ...)
@@ -91,7 +99,7 @@ tabins(logger *lg, old_logger *old_lg, b
        va_start(va, nid);
        while ((cid = va_arg(va, int)) != 0) {
                cval = va_arg(va, void *);
-               if ((b = temp_descriptor(logger_find_bat(lg, cid))) == NULL) {
+               if ((b = log_temp_descriptor(logger_find_bat(lg, cid))) == 
NULL) {
                        va_end(va);
                        return GDK_FAIL;
                }
@@ -1335,18 +1343,18 @@ upgrade(old_logger *lg)
        BAT *mapold = COLnew(0, TYPE_int, 256, TRANSIENT);
        BAT *mapnew = COLnew(0, TYPE_int, 256, TRANSIENT);
 
-       bats[0].nmbat = temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_name", 0, 0));
-       bats[0].idbat = temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_id", 0, 0));
+       bats[0].nmbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_name", 0, 0));
+       bats[0].idbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_id", 0, 0));
        bats[0].parbat = NULL;
-       bats[0].cands = temp_descriptor(old_logger_find_bat(lg, 
"D_sys_schemas", 0, 0));
-       bats[1].nmbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_name", 0, 0));
-       bats[1].idbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_id", 0, 0));
-       bats[1].parbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_schema_id", 0, 0));
-       bats[1].cands = temp_descriptor(old_logger_find_bat(lg, 
"D_sys__tables", 0, 0));
-       bats[2].nmbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_name", 0, 0));
-       bats[2].idbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_id", 0, 0));
-       bats[2].parbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_table_id", 0, 0));
-       bats[2].cands = temp_descriptor(old_logger_find_bat(lg, 
"D_sys__columns", 0, 0));
+       bats[0].cands = log_temp_descriptor(old_logger_find_bat(lg, 
"D_sys_schemas", 0, 0));
+       bats[1].nmbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_name", 0, 0));
+       bats[1].idbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_id", 0, 0));
+       bats[1].parbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_schema_id", 0, 0));
+       bats[1].cands = log_temp_descriptor(old_logger_find_bat(lg, 
"D_sys__tables", 0, 0));
+       bats[2].nmbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_name", 0, 0));
+       bats[2].idbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_id", 0, 0));
+       bats[2].parbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_table_id", 0, 0));
+       bats[2].cands = log_temp_descriptor(old_logger_find_bat(lg, 
"D_sys__columns", 0, 0));
        if (mapold == NULL || mapnew == NULL)
                goto bailout;
        for (int i = 0; i < 3; i++) {
@@ -1451,11 +1459,11 @@ upgrade(old_logger *lg)
                        delidx = i;
                        continue;
                }
-               BAT *b = temp_descriptor(old_logger_find_bat(lg, 
tables[i].fullname, 0, 0));
+               BAT *b = log_temp_descriptor(old_logger_find_bat(lg, 
tables[i].fullname, 0, 0));
                if (b == NULL)
                        continue;
                if (delidx >= 0) {
-                       BAT *d = temp_descriptor(old_logger_find_bat(lg, 
delname, 0, 0));
+                       BAT *d = log_temp_descriptor(old_logger_find_bat(lg, 
delname, 0, 0));
                        BAT *m = BATconstant(0, TYPE_msk, &(msk){false}, 
BATcount(b), PERSISTENT);
                        if (m == NULL) {
                                bat_destroy(d);
@@ -1486,7 +1494,7 @@ upgrade(old_logger *lg)
                }
                if (tables[i].hasids && mapold) {
                        BAT *b1, *b2;
-                       BAT *cands = temp_descriptor(old_logger_find_bat(lg, 
delname, 0, 0));
+                       BAT *cands = 
log_temp_descriptor(old_logger_find_bat(lg, delname, 0, 0));
                        if (cands) {
                                if (BATcount(cands) == 0) {
                                        bat_destroy(cands);
@@ -1897,7 +1905,7 @@ bl_postversion(void *Store, void *Lg)
                const int *ocl; /* old eclass */
                int *ncl;       /* new eclass */
 
-               te = temp_descriptor(logger_find_bat(lg, 2014)); /* 
sys.types.eclass */
+               te = log_temp_descriptor(logger_find_bat(lg, 2014)); /* 
sys.types.eclass */
                if (te == NULL)
                        return GDK_FAIL;
                tne = COLnew(te->hseqbase, TYPE_int, BATcount(te), PERSISTENT);
@@ -1956,7 +1964,7 @@ bl_postversion(void *Store, void *Lg)
                BAT *b;                                                         
 /* temp variable */
                {
                        /* new BOOLEAN column sys.functions.semantics */
-                       b = temp_descriptor(logger_find_bat(lg, 2017)); /* 
sys.functions.id */
+                       b = log_temp_descriptor(logger_find_bat(lg, 2017)); /* 
sys.functions.id */
                        BAT *sem = BATconstant(b->hseqbase, TYPE_bit, 
&(bit){1}, BATcount(b), PERSISTENT);
                        bat_destroy(b);
                        if (sem == NULL)
@@ -1992,14 +2000,14 @@ bl_postversion(void *Store, void *Lg)
                }
 
                /* sys.functions i.e. deleted rows */
-               BAT *del_funcs = temp_descriptor(logger_find_bat(lg, 2016));
+               BAT *del_funcs = log_temp_descriptor(logger_find_bat(lg, 2016));
                {
                        /* move sql.degrees, sql.radians, sql.like and 
sql.ilike functions
                         * from 09_like.sql and 10_math.sql script to sql_types 
list */
                        /* sys.functions.name */
-                       BAT *func_func = temp_descriptor(logger_find_bat(lg, 
2018));
+                       BAT *func_func = 
log_temp_descriptor(logger_find_bat(lg, 2018));
                        /* sys.functions.schema_id */
-                       BAT *func_schem = temp_descriptor(logger_find_bat(lg, 
2026));
+                       BAT *func_schem = 
log_temp_descriptor(logger_find_bat(lg, 2026));
                        BAT *func_tid;
                        BAT *cands;
                        if (del_funcs == NULL || func_func == NULL || 
func_schem == NULL) {
@@ -2058,7 +2066,7 @@ bl_postversion(void *Store, void *Lg)
                         * sql.null, sql.all, sql.zero_or_one and 
sql.not_unique */
                        BAT *func_tid = BATmaskedcands(0, BATcount(del_funcs), 
del_funcs, false);
                        /* sys.functions.mod */
-                       BAT *func_mod = temp_descriptor(logger_find_bat(lg, 
2020));
+                       BAT *func_mod = log_temp_descriptor(logger_find_bat(lg, 
2020));
                        bat_destroy(del_funcs);
                        if (func_tid == NULL || func_mod == NULL) {
                                bat_destroy(func_tid);
@@ -2074,7 +2082,7 @@ bl_postversion(void *Store, void *Lg)
                                return GDK_FAIL;
                        }
                        /* sys.functions.type */
-                       BAT *func_type = temp_descriptor(logger_find_bat(lg, 
2022));
+                       BAT *func_type = 
log_temp_descriptor(logger_find_bat(lg, 2022));
                        if (func_type == NULL) {
                                bat_destroy(func_mod);
                                bat_destroy(sqlfunc);
@@ -2090,7 +2098,7 @@ bl_postversion(void *Store, void *Lg)
                        }
 
                        /* sys.functions.func */
-                       BAT *func_func = temp_descriptor(logger_find_bat(lg, 
2019));
+                       BAT *func_func = 
log_temp_descriptor(logger_find_bat(lg, 2019));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to