Changeset: 7cf0061d8bd1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7cf0061d8bd1
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: default
Log Message:

merge_cs failure should cause server to exit


diffs (109 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -14,6 +14,7 @@
 #include "gdk_atoms.h"
 #include "matomic.h"
 
+#define FATAL_MERGE_FAILURE "Out Of Memory during critical merge operation: %s"
 #define inTransaction(tr,t) (isLocalTemp(t))
 
 static int log_update_col( sql_trans *tr, sql_change *c);
@@ -4097,11 +4098,9 @@ log_storage(sql_trans *tr, sql_table *t,
        return ok;
 }
 
-static int
-merge_cs( column_storage *cs)
+static void
+merge_cs( column_storage *cs, const char* caller)
 {
-       int ok = LOG_OK;
-
        if (cs->bid && cs->ucnt) {
                BAT *cur = temp_descriptor(cs->bid);
                BAT *ui = temp_descriptor(cs->uibid);
@@ -4111,7 +4110,7 @@ merge_cs( column_storage *cs)
                        bat_destroy(ui);
                        bat_destroy(uv);
                        bat_destroy(cur);
-                       return LOG_ERR;
+                       GDKfatal(FATAL_MERGE_FAILURE, caller);
                }
                assert(BATcount(ui) == BATcount(uv));
 
@@ -4121,7 +4120,7 @@ merge_cs( column_storage *cs)
                        bat_destroy(ui);
                        bat_destroy(uv);
                        bat_destroy(cur);
-                       return LOG_ERR;
+                       GDKfatal(FATAL_MERGE_FAILURE, caller);
                }
                /* cleanup the old deltas */
                temp_destroy(cs->uibid);
@@ -4136,41 +4135,26 @@ merge_cs( column_storage *cs)
        }
        cs->cleared = 0;
        cs->merged = 1;
-       return ok;
-}
-
-static inline int
-_merge_delta( sql_delta *obat)
-{
-       int ok = LOG_OK;
-
-       if (obat && obat->next && !obat->cs.merged && (ok = 
_merge_delta(obat->next)) != LOG_OK)
-               return ok;
-       return merge_cs(&obat->cs);
+       return;
 }
 
 static void
-merge_delta( sql_delta *obat) {
-       /*
-        * _merge_delta might only fail in extreme corner cases in which
-        * merge_cs fails because of impending transgressions of memory 
capacity.
-        * However this does not warrant an error from merge_delta as it is an
-        * opportunistic cleanup of the delta's which in absence does not cause 
data corruption.
-        * So the wrapper merge_delta can safely return void.
-        * */
-       (void) _merge_delta(obat);
+merge_delta( sql_delta *obat)
+{
+       if (obat && obat->next && !obat->cs.merged)
+               merge_delta(obat->next);
+       merge_cs(&obat->cs, __func__);
 }
 
-static int
+static void
 merge_storage(storage *tdb)
 {
-       int ok = merge_cs(&tdb->cs);
+       merge_cs(&tdb->cs, __func__);
 
        if (tdb->next) {
-               ok = destroy_storage(tdb->next);
+               destroy_storage(tdb->next);
                tdb->next = NULL;
        }
-       return ok;
 }
 
 static sql_delta *
@@ -4492,10 +4476,11 @@ commit_update_del( sql_trans *tr, sql_ch
 
                ok = segments2cs(tr, dbat->segs, &dbat->cs);
                assert(ok == LOG_OK);
-               if (ok == LOG_OK)
+               if (ok == LOG_OK) {
                        merge_segments(dbat, tr, change, commit_ts, oldest);
-               if (ok == LOG_OK && oldest == commit_ts)
-                       ok = merge_storage(dbat);
+                       if (oldest == commit_ts)
+                               merge_storage(dbat);
+               }
                if (dbat)
                        dbat->cs.cleared = false;
        } else if (ok == LOG_OK && tr->parent) {/* cleanup older save points */
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to