Changeset: 46605400f0be for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/46605400f0be
Modified Files:
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_bbp.c
monetdb5/modules/mal/querylog.c
Branch: default
Log Message:
Merge with Jul2021 branch.
diffs (186 lines):
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2128,7 +2128,7 @@ BATroles(BAT *b, const char *tnme)
/* rather than deleting X.new, we comply with the commit protocol and
* move it to backup storage */
static gdk_return
-backup_new(Heap *hp)
+backup_new(Heap *hp, bool lock)
{
int batret, bakret, ret = -1;
char *batpath, *bakpath;
@@ -2139,7 +2139,8 @@ backup_new(Heap *hp)
bakpath = GDKfilepath(hp->farmid, BAKDIR, hp->filename, ".new");
if (batpath != NULL && bakpath != NULL) {
/* file actions here interact with the global commits */
- MT_lock_set(&GDKtmLock);
+ if (lock)
+ MT_lock_set(&GDKtmLock);
batret = MT_stat(batpath, &st);
bakret = MT_stat(bakpath, &st);
@@ -2159,7 +2160,8 @@ backup_new(Heap *hp)
} else {
ret = 0;
}
- MT_lock_unset(&GDKtmLock);
+ if (lock)
+ MT_lock_unset(&GDKtmLock);
}
GDKfree(batpath);
GDKfree(bakpath);
@@ -2178,11 +2180,12 @@ HEAPchangeaccess(Heap *hp, int dstmode,
if (dstmode == BAT_WRITE) {
if (hp->storage != STORE_PRIV)
hp->dirty = true; /* exception c does not make it
dirty */
- return STORE_PRIV; /* 4=>6,5=>7,c=>6 persistent BAT_WRITE
needs STORE_PRIV */
+// return STORE_PRIV; /* 4=>6,5=>7,c=>6 persistent BAT_WRITE
needs STORE_PRIV */
+ return STORE_MMAP;
}
if (hp->storage == STORE_MMAP) { /* 6=>4 */
hp->dirty = true;
- return backup_new(hp) != GDK_SUCCEED ? STORE_INVALID :
STORE_MMAP; /* only called for existing bats */
+ return backup_new(hp, true) != GDK_SUCCEED ? STORE_INVALID :
STORE_MMAP; /* only called for existing bats */
}
return hp->storage; /* 7=>5 */
}
@@ -2194,7 +2197,7 @@ HEAPcommitpersistence(Heap *hp, bool wri
if (existing) { /* existing, ie will become transient */
if (hp->storage == STORE_MMAP && hp->newstorage == STORE_PRIV
&& writable) { /* 6=>2 */
hp->dirty = true;
- return backup_new(hp) != GDK_SUCCEED ? STORE_INVALID :
STORE_MMAP; /* only called for existing bats */
+ return backup_new(hp, false) != GDK_SUCCEED ?
STORE_INVALID : STORE_MMAP; /* only called for existing bats */
}
return hp->newstorage; /* 4=>0,5=>1,7=>3,c=>a no change */
}
@@ -2206,11 +2209,12 @@ HEAPcommitpersistence(Heap *hp, bool wri
if (hp->newstorage == STORE_MMAP)
hp->dirty = true; /* 2=>6 */
- return STORE_PRIV; /* 1=>5,2=>6,3=>7,a=>c,b=>6 states */
+// return STORE_PRIV; /* 1=>5,2=>6,3=>7,a=>c,b=>6 states */
+ return STORE_MMAP;
}
-#define ATOMappendpriv(t, h) (ATOMstorage(t) != TYPE_str || GDK_ELIMDOUBLES(h))
+#define ATOMappendpriv(t, h) (ATOMstorage(t) != TYPE_str /*||
GDK_ELIMDOUBLES(h) */)
/* change the heap modes at a commit */
gdk_return
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1467,7 +1467,6 @@ BATappend_or_update(BAT *b, BAT *p, cons
goto bailout;
}
if (BUNappend(b, new, force) != GDK_SUCCEED) {
- MT_rwlock_wrunlock(&b->thashlock);
bat_iterator_end(&ni);
return GDK_FAIL;
}
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3625,7 +3625,9 @@ BBPsync(int cnt, bat *restrict subcommit
BATiter bi = bat_iterator(b);
if (size > bi.count)
size = bi.count;
+ MT_rwlock_rdlock(&b->thashlock);
ret = BATsave_locked(b, &bi, size);
+ MT_rwlock_rdunlock(&b->thashlock);
bat_iterator_end(&bi);
BBP_status_off(i, BBPSAVING);
}
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -560,7 +560,7 @@ GDKload(int farmid, const char *nme, con
/* we couldn't read all, error
* already generated */
GDKfree(ret);
- GDKerror("short read from heap %s%s\n",
nme, ext ? ext : "");
+ GDKerror("short read from heap %s%s%s,
expected %zu, missing %zd\n", nme, ext ? "." : "", ext ? ext : "", size,
n_expected);
ret = NULL;
}
#ifndef NDEBUG
@@ -881,17 +881,8 @@ BATsave_locked(BAT *b, BATiter *bi, BUN
b->batDirtydesc = false;
}
MT_lock_unset(&b->theaplock);
- if (MT_rwlock_rdtry(&b->thashlock)) {
- /* if we can't get the lock, don't bother saving
- * the hash (normally, the hash lock should not
- * be acquired when the heap lock has already
- * been acquired, and here we have the heap
- * lock, so we must be careful with the hash
- * lock) */
- if (b->thash && b->thash != (Hash *) 1)
- BAThashsave(b, dosync);
- MT_rwlock_rdunlock(&b->thashlock);
- }
+ if (b->thash && b->thash != (Hash *) 1)
+ BAThashsave(b, dosync);
}
return err;
}
@@ -901,11 +892,11 @@ BATsave(BAT *b)
{
gdk_return rc;
+ BATiter bi = bat_iterator(b);
MT_rwlock_rdlock(&b->thashlock);
- BATiter bi = bat_iterator(b);
rc = BATsave_locked(b, &bi, bi.count);
+ MT_rwlock_rdunlock(&b->thashlock);
bat_iterator_end(&bi);
- MT_rwlock_rdunlock(&b->thashlock);
return rc;
}
diff --git a/monetdb5/modules/mal/querylog.c b/monetdb5/modules/mal/querylog.c
--- a/monetdb5/modules/mal/querylog.c
+++ b/monetdb5/modules/mal/querylog.c
@@ -167,12 +167,16 @@ QLOGcreate(str hnme, str tnme, int tt)
snprintf(buf, 128, "querylog_%s_%s", hnme, tnme);
b = BATdescriptor(BBPindex(buf));
- if (b)
- return b;
+ if (b) {
+ /* make append-only in case this wasn't done when created */
+ return BATsetaccess(b, BAT_APPEND);
+ }
b = COLnew(0, tt, 1 << 16, PERSISTENT);
if (b == NULL)
return NULL;
+ if ((b = BATsetaccess(b, BAT_APPEND)) == NULL)
+ return NULL;
if (BBPrename(b->batCacheid, buf) != 0 ||
BATmode(b, false) != GDK_SUCCEED) {
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -1374,6 +1374,9 @@ def PerformDir(env, testdir, testlist, a
pollfile)
os.chdir(TSTTRGDIR)
pSrvr.LaunchIt()
+ if pSrvr.port is None:
+ print('\nFailed to start server.\n')
+ break
os.environ['MAPIPORT'] = env['MAPIPORT'] = pSrvr.port
SetExecEnv(env['exe'],pSrvr.port,verbose)
if global_timeout and start_time + global_timeout <
time.time():
@@ -2764,6 +2767,9 @@ def DoIt(env, SERVER, CALL, TST, EXT, Te
Srvr.extend(mserver5_opts)
pSrvr = ServerClass(Srvr, SrvrOut, SrvrErr, TIMEOUT,
os.path.join(dbpath, '.started'))
pSrvr.LaunchIt()
+ if pSrvr.port is None:
+ print('\nFailed to start server.\n')
+ return 'serverfail'
os.environ['MAPIPORT'] = env['MAPIPORT'] = pSrvr.port
SetExecEnv(exe,pSrvr.port,verbose)
else:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list