Changeset: 4784d7f2b200 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4784d7f2b200
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/objectset.c
        sql/storage/store.c
        testing/sqllogictest.py
Branch: default
Log Message:

Merge with Dec2023 branch.


diffs (129 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
@@ -3492,7 +3492,6 @@ log_segments(sql_trans *tr, segments *se
                unlock_table(tr->store, id);
                if (seg->ts == tr->tid && seg->end-seg->start) {
                        if (log_segment(tr, seg, id) != LOG_OK) {
-                               unlock_table(tr->store, id);
                                return LOG_ERR;
                        }
                }
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -55,6 +55,7 @@ typedef struct objectset {
        allocator *sa;
        destroy_fptr destroy;
        MT_RWLock rw_lock;      /*readers-writer lock to protect the links 
(chains) in the objectversion chain.*/
+       MT_Lock lock;   /* global objectset lock for os_add/del */
        versionhead  *name_based_h;
        versionhead  *name_based_t;
        versionhead  *id_based_h;
@@ -668,6 +669,7 @@ os_new(allocator *sa, destroy_fptr destr
                };
                os->destroy = destroy;
                MT_rwlock_init(&os->rw_lock, "sa_readers_lock");
+               MT_lock_init(&os->lock, "single_writer_lock");
        }
 
        return os;
@@ -685,6 +687,7 @@ os_destroy(objectset *os, sql_store stor
 {
        if (ATOMIC_DEC(&os->refcnt) > 0)
                return;
+       MT_lock_destroy(&os->lock);
        MT_rwlock_destroy(&os->rw_lock);
        versionhead* n=os->id_based_h;
        while(n) {
@@ -927,9 +930,9 @@ os_add_(objectset *os, struct sql_trans 
 int
 os_add(objectset *os, struct sql_trans *tr, const char *name, sql_base *b)
 {
-       store_lock(tr->store);
+       MT_lock_set(&os->lock);
        int res = os_add_(os, tr, name, b);
-       store_unlock(tr->store);
+       MT_lock_unset(&os->lock);
        return res;
 }
 
@@ -1032,9 +1035,9 @@ os_del_(objectset *os, struct sql_trans 
 int
 os_del(objectset *os, sql_trans *tr, const char *name, sql_base *b)
 {
-       store_lock(tr->store);
+       MT_lock_set(&os->lock);
        int res = os_del_(os, tr, name, b);
-       store_unlock(tr->store);
+       MT_lock_unset(&os->lock);
        return res;
 }
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3816,8 +3816,6 @@ sql_trans_destroy(sql_trans *tr)
                sql_trans_rollback(tr, false);
        sqlstore *store = tr->store;
        os_destroy(tr->localtmps, store);
-       store_lock(store);
-       store_unlock(store);
        MT_lock_destroy(&tr->lock);
        if (!list_empty(tr->dropped))
                list_destroy(tr->dropped);
diff --git a/testing/sqllogictest.py b/testing/sqllogictest.py
--- a/testing/sqllogictest.py
+++ b/testing/sqllogictest.py
@@ -656,10 +656,11 @@ class SQLLogic:
             result2 = result
         return result1, result2
 
-    def initfile(self, f, defines):
+    def initfile(self, f, defines, run_until=None):
         self.name = f
         self.file = open(f, 'r', encoding='utf-8', errors='replace')
         self.line = 0
+        self.run_until = run_until
         self.hashes = {}
         defs = []
         if defines:
@@ -674,6 +675,8 @@ class SQLLogic:
 
     def readline(self):
         self.line += 1
+        if self.run_until and self.line >= self.run_until:
+            return ''
         origline = line = self.file.readline()
         for reg, val, key in self.defines:
             line = reg.sub(val.replace('\\', r'\\'), line)
@@ -736,9 +739,9 @@ class SQLLogic:
                 self.raise_error('invalid connection parameters definition, 
username or password missing!')
         return res
 
-    def parse(self, f, approve=None, verbose=False, defines=None):
+    def parse(self, f, approve=None, verbose=False, defines=None, 
run_until=None):
         self.approve = approve
-        self.initfile(f, defines)
+        self.initfile(f, defines, run_until=run_until)
         nthreads = None
         if self.language == 'sql':
             self.crs.execute(f'call sys.setsessiontimeout({self.timeout or 
0})')
@@ -945,6 +948,8 @@ if __name__ == '__main__':
                         ' (can be repeated)')
     parser.add_argument('--alltests', action='store_true',
                         help='also executed "knownfail" tests')
+    parser.add_argument('--run-until', action='store', type=int,
+                        help='run tests until specified line')
     parser.add_argument('tests', nargs='*', help='tests to be run')
     opts = parser.parse_args()
     args = opts.tests
@@ -959,7 +964,7 @@ if __name__ == '__main__':
                 print('now testing {}'. format(test))
             try:
                 sql.parse(test, approve=opts.approve, verbose=opts.verbose,
-                          defines=opts.define)
+                          defines=opts.define, run_until=opts.run_until)
             except SQLLogicSyntaxError:
                 pass
         except BrokenPipeError:
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to