[prev in list] [next in list] [prev in thread] [next in thread]
List: monetdb-checkins
Subject: MonetDB: qcancel - merge default
From: svetlin <commits+svetlin.stalinov=monetdbsolutions.com () monetdb !
Date: 2021-03-30 11:11:48
Message-ID: hg.3b4cd640f024.1617102708.-952280114520215018 () monetdb-vm0 ! spin-off ! cwi ! nl
[Download RAW message or body]
Changeset: 3b4cd640f024 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3b4cd640f024
Modified Files:
gdk/gdk.h
gdk/gdk_hash.c
gdk/gdk_join.c
gdk/gdk_select.c
Branch: qcancel
Log Message:
merge default
diffs (truncated from 1655 to 300 lines):
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md \
b/.github/ISSUE_TEMPLATE/bug_report.md
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -11,9 +11,9 @@ assignees: ''
A clear and concise description of what the bug is.
**To Reproduce**
-Create a setting with minimal input for an external user to demonstrate him the \
buggy behavior.
-This includes the relevant part of the database schema description.
-Performance trace of the roque query (using the TRACE command)
+Create a setting with minimal input for an external user to demonstrate the buggy \
behavior. +This includes the relevant part of the database schema description.
+Performance trace of the rogue query (using the TRACE command)
**Expected behavior**
A clear and concise description of what you expected to happen.
diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -302,8 +302,8 @@ This package contains the files needed t
Summary: MonetDB ODBC driver
Group: Applications/Databases
Requires: %{name}-client%{?_isa} = %{version}-%{release}
-Requires(post): unixODBC
-Requires(postun): unixODBC
+Requires(post): %{_bindir}/odbcinst
+Requires(postun): %{_bindir}/odbcinst
%description client-odbc
MonetDB is a database management system that is developed from a
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -226,6 +226,7 @@ gdk_return BUNdelete(BAT *b, oid o) __at
BUN BUNfnd(BAT *b, const void *right);
gdk_return BUNreplace(BAT *b, oid left, const void *right, bool force) \
__attribute__((__warn_unused_result__)); gdk_return BUNreplacemulti(BAT *b, const \
oid *positions, const void *values, BUN count, bool force) \
__attribute__((__warn_unused_result__)); +gdk_return BUNreplacemultiincr(BAT *b, oid \
position, const void *values, BUN count, bool force) \
__attribute__((__warn_unused_result__)); BAT *COLcopy(BAT *b, int tt, bool writable, \
role_t role); BAT *COLnew(oid hseq, int tltype, BUN capacity, role_t role) \
__attribute__((__warn_unused_result__)); size_t GDK_mem_maxsize;
diff --git a/gdk/ChangeLog b/gdk/ChangeLog
--- a/gdk/ChangeLog
+++ b/gdk/ChangeLog
@@ -2,8 +2,10 @@
# This file is updated with Maddlog
* Mon Mar 29 2021 Sjoerd Mullender <sjoerd@acm.org>
+- Implemented function BUNreplacemultiincr to replace multiple values
+ in a BAT in one go, starting at a given position.
- Implemented new function BUNreplacemulti to replace multiple values
- in a BAT in one go.
+ in a BAT in one go, at the given positions.
- Removed function BUNinplace, just use BUNreplace, and check whether
the BAT argument is of type TYPE_void before calling if you don't
want to materialize.
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -772,7 +772,7 @@ typedef struct BAT {
COLrec T; /* column info */
MT_Lock theaplock; /* lock protecting heap reference changes */
- MT_Lock batIdxLock; /* lock to manipulate indexes */
+ MT_RWLock batIdxLock; /* lock to manipulate indexes */
} BAT;
typedef struct BATiter {
@@ -961,6 +961,8 @@ gdk_export gdk_return BUNreplace(BAT *b,
__attribute__((__warn_unused_result__));
gdk_export gdk_return BUNreplacemulti(BAT *b, const oid *positions, const void \
*values, BUN count, bool force) __attribute__((__warn_unused_result__));
+gdk_export gdk_return BUNreplacemultiincr(BAT *b, oid position, const void *values, \
BUN count, bool force) + __attribute__((__warn_unused_result__));
gdk_export gdk_return BUNdelete(BAT *b, oid o)
__attribute__((__warn_unused_result__));
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -142,7 +142,7 @@ VIEWcreate(oid seq, BAT *b)
}
HEAPdecref(bn->theap, false);
MT_lock_destroy(&bn->theaplock);
- MT_lock_destroy(&bn->batIdxLock);
+ MT_rwlock_destroy(&bn->batIdxLock);
GDKfree(bn);
return NULL;
}
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -142,7 +142,7 @@ BATcreatedesc(oid hseq, int tt, bool hea
snprintf(name, sizeof(name), "heaplock%d", bn->batCacheid); /* fits */
MT_lock_init(&bn->theaplock, name);
snprintf(name, sizeof(name), "BATlock%d", bn->batCacheid); /* fits */
- MT_lock_init(&bn->batIdxLock, name);
+ MT_rwlock_init(&bn->batIdxLock, name);
bn->batDirtydesc = true;
return bn;
bailout:
@@ -247,7 +247,7 @@ COLnew(oid hseq, int tt, BUN cap, role_t
if (bn->tvheap)
HEAPdecref(bn->tvheap, true);
MT_lock_destroy(&bn->theaplock);
- MT_lock_destroy(&bn->batIdxLock);
+ MT_rwlock_destroy(&bn->batIdxLock);
GDKfree(bn);
return NULL;
}
@@ -631,7 +631,7 @@ BATdestroy(BAT *b)
GDKfree(b->tvheap);
PROPdestroy(b);
MT_lock_destroy(&b->theaplock);
- MT_lock_destroy(&b->batIdxLock);
+ MT_rwlock_destroy(&b->batIdxLock);
GDKfree(b->theap);
GDKfree(b);
}
@@ -1326,7 +1326,7 @@ BUNdelete(BAT *b, oid o)
* be saved explicitly.
*/
static gdk_return
-BUNinplacemulti(BAT *b, const oid *positions, const void *values, BUN count, bool \
force) +BUNinplacemulti(BAT *b, const oid *positions, const void *values, BUN count, \
bool force, bool autoincr) {
BUN last = BUNlast(b) - 1;
BATiter bi = bat_iterator(b);
@@ -1341,7 +1341,7 @@ BUNinplacemulti(BAT *b, const oid *posit
return GDK_FAIL;
}
for (BUN i = 0; i < count; i++) {
- BUN p = positions[i] - b->hseqbase;
+ BUN p = autoincr ? positions[0] - b->hseqbase + i : positions[i] - b->hseqbase;
const void *t = b->ttype && b->tvarsized ?
((const void **) values)[i] :
(const void *) ((const char *) values + i * Tsize(b));
@@ -1549,8 +1549,7 @@ BUNinplacemulti(BAT *b, const oid *posit
return GDK_SUCCEED;
}
-/* very much like void_inplace, except this materializes a void tail
- * column if necessarry */
+/* Replace multiple values given by their positions with the given values. */
gdk_return
BUNreplacemulti(BAT *b, const oid *positions, const void *values, BUN count, bool \
force) {
@@ -1559,7 +1558,20 @@ BUNreplacemulti(BAT *b, const oid *posit
if (b->ttype == TYPE_void && BATmaterialize(b) != GDK_SUCCEED)
return GDK_FAIL;
- return BUNinplacemulti(b, positions, values, count, force);
+ return BUNinplacemulti(b, positions, values, count, force, false);
+}
+
+/* Replace multiple values starting from a given position with the given
+ * values. */
+gdk_return
+BUNreplacemultiincr(BAT *b, oid position, const void *values, BUN count, bool force)
+{
+ BATcheck(b, GDK_FAIL);
+
+ if (b->ttype == TYPE_void && BATmaterialize(b) != GDK_SUCCEED)
+ return GDK_FAIL;
+
+ return BUNinplacemulti(b, &position, values, count, force, true);
}
gdk_return
@@ -1580,7 +1592,7 @@ void_inplace(BAT *b, oid id, const void
}
if (b->ttype == TYPE_void)
return GDK_SUCCEED;
- return BUNinplacemulti(b, &id, b->ttype && b->tvarsized ? (const void *) &val : \
(const void *) val, 1, force); + return BUNinplacemulti(b, &id, b->ttype && \
b->tvarsized ? (const void *) &val : (const void *) val, 1, force, false); }
/*
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1835,12 +1835,12 @@ BATordered(BAT *b)
if (b->tnosorted > 0 || !ATOMlinear(b->ttype))
return false;
- /* In order that multiple threads don't scan the same BAT at
- * the same time (happens a lot with mitosis/mergetable), we
- * use a lock. We reuse the hash lock for this, not because
- * this scanning interferes with hashes, but because it's
- * there, and not so likely to be used at the same time. */
- MT_lock_set(&b->batIdxLock);
+ /* In order that multiple threads don't scan the same BAT at the
+ * same time (happens a lot with mitosis/mergetable), we use a
+ * lock. We reuse the theaplock lock for this, not because this
+ * scanning interferes with heap reference counting, but because
+ * it's there, and not so likely to be used at the same time. */
+ MT_lock_set(&b->theaplock);
if (!b->tsorted && b->tnosorted == 0) {
b->batDirtydesc = true;
switch (ATOMbasetype(b->ttype)) {
@@ -1907,7 +1907,7 @@ BATordered(BAT *b)
}
}
doreturn:
- MT_lock_unset(&b->batIdxLock);
+ MT_lock_unset(&b->theaplock);
return b->tsorted;
}
@@ -1953,7 +1953,7 @@ BATordered_rev(BAT *b)
return is_oid_nil(b->tseqbase);
if (BATtdense(b) || b->tnorevsorted > 0)
return false;
- MT_lock_set(&b->batIdxLock);
+ MT_lock_set(&b->theaplock);
if (!b->trevsorted && b->tnorevsorted == 0) {
b->batDirtydesc = true;
switch (ATOMbasetype(b->ttype)) {
@@ -1997,7 +1997,7 @@ BATordered_rev(BAT *b)
TRC_DEBUG(ALGO, "Fixed revsorted for " ALGOBATFMT " (" LLFMT " usec)\n", \
ALGOBATPAR(b), GDKusec() - t0); }
doreturn:
- MT_lock_unset(&b->batIdxLock);
+ MT_lock_unset(&b->theaplock);
return b->trevsorted;
}
@@ -2204,7 +2204,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
mkorderidx = (g == NULL && !reverse && !nilslast && pb != NULL && (order || \
!pb->batTransient)); if (g == NULL && !reverse && !nilslast &&
pb != NULL && !BATcheckorderidx(pb)) {
- MT_lock_set(&pb->batIdxLock);
+ MT_rwlock_wrlock(&pb->batIdxLock);
if (pb->torderidx == NULL) {
/* no index created while waiting for lock */
if (mkorderidx) /* keep lock when going to create */
@@ -2214,7 +2214,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
mkorderidx = false;
}
if (!orderidxlock)
- MT_lock_unset(&pb->batIdxLock);
+ MT_rwlock_wrunlock(&pb->batIdxLock);
} else {
mkorderidx = false;
}
@@ -2441,7 +2441,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
GDKfree(m);
}
if (orderidxlock)
- MT_lock_unset(&pb->batIdxLock);
+ MT_rwlock_wrunlock(&pb->batIdxLock);
goto error;
}
bn->tsorted = !reverse && !nilslast;
@@ -2464,7 +2464,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
}
}
if (orderidxlock)
- MT_lock_unset(&pb->batIdxLock);
+ MT_rwlock_wrunlock(&pb->batIdxLock);
bn->theap->dirty = true;
bn->tnosorted = 0;
bn->tnorevsorted = 0;
@@ -2723,7 +2723,7 @@ BATgetprop(BAT *b, enum prop_t idx)
{
PROPrec *p;
- MT_lock_set(&b->batIdxLock);
+ MT_rwlock_wrlock(&b->batIdxLock);
p = BATgetprop_nolock(b, idx);
if (p == NULL) {
/* if looking for the min/max value, we may be able to
@@ -2747,7 +2747,7 @@ BATgetprop(BAT *b, enum prop_t idx)
break;
}
}
- MT_lock_unset(&b->batIdxLock);
+ MT_rwlock_wrunlock(&b->batIdxLock);
return p;
}
@@ -2755,18 +2755,18 @@ PROPrec *
BATsetprop(BAT *b, enum prop_t idx, int type, const void *v)
{
PROPrec *p;
- MT_lock_set(&b->batIdxLock);
+ MT_rwlock_wrlock(&b->batIdxLock);
p = BATsetprop_nolock(b, idx, type, v);
- MT_lock_unset(&b->batIdxLock);
+ MT_rwlock_wrunlock(&b->batIdxLock);
return p;
}
void
BATrmprop(BAT *b, enum prop_t idx)
{
- MT_lock_set(&b->batIdxLock);
+ MT_rwlock_wrlock(&b->batIdxLock);
BATrmprop_nolock(b, idx);
- MT_lock_unset(&b->batIdxLock);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic