Changeset: 6bfac24cef56 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6bfac24cef56 Branch: distinct_from Log Message:
merge with default diffs (truncated from 1041 to 300 lines): diff --git a/gdk/ChangeLog.Dec2023 b/gdk/ChangeLog.Dec2023 --- a/gdk/ChangeLog.Dec2023 +++ b/gdk/ChangeLog.Dec2023 @@ -1,3 +1,7 @@ # ChangeLog file for GDK # This file is updated with Maddlog +* Mon Mar 18 2024 Sjoerd Mullender <sjo...@acm.org> +- Fixed a couple of deadlock situations, one actually observed, one + never observed. + diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -2372,10 +2372,10 @@ gdk_export BAT *BATsample_with_seed(BAT static inline void TIMEOUT_ERROR(QryCtx *qc, const char *file, const char *func, int lineno) { - if (GDKexiting()) + if (GDKexiting()) { GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL, "%s\n", EXITING_MSG); - else { + } else if (qc) { switch (qc->endtime) { case QRY_TIMEOUT: GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL, diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -208,7 +208,6 @@ dofsum(const void *restrict values, oid volatile flt f; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; /* we only deal with the two floating point types */ assert(tp1 == TYPE_flt || tp1 == TYPE_dbl); @@ -719,7 +718,6 @@ dosum(const void *restrict values, bool unsigned int *restrict seen = NULL; /* bitmask for groups that we've seen */ QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; switch (tp2) { case TYPE_flt: @@ -1359,7 +1357,6 @@ doprod(const void *restrict values, oid unsigned int *restrict seen; /* bitmask for groups that we've seen */ QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; /* allocate bitmap for seen group ids */ seen = GDKzalloc(((ngrp + 31) / 32) * sizeof(int)); @@ -1818,7 +1815,6 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT BATiter bi = {0}; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); @@ -2008,7 +2004,6 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT oid o; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &ci)) != NULL) { GDKerror("%s\n", err); @@ -2646,7 +2641,6 @@ BATgroupavg3combine(BAT *avg, BAT *rem, BAT *bn, *rn, *cn; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; if ((err = BATgroupaggrinit(avg, g, e, NULL, &min, &max, &ngrp, &ci)) != NULL) { GDKerror("%s\n", err); @@ -3003,7 +2997,6 @@ BATcalcavg(BAT *b, BAT *s, dbl *avg, BUN const void *restrict src; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; canditer_init(&ci, b, s); @@ -3090,7 +3083,6 @@ BATgroupcount(BAT *b, BAT *g, BAT *e, BA BATiter bi = {0}; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); @@ -3263,7 +3255,6 @@ do_groupmin(oid *restrict oids, BATiter int (*atomcmp)(const void *, const void *); QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; nils = ngrp; TIMEOUT_LOOP_IDX(i, ngrp, qry_ctx) @@ -3386,7 +3377,6 @@ do_groupmax(oid *restrict oids, BATiter int (*atomcmp)(const void *, const void *); QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; nils = ngrp; TIMEOUT_LOOP_IDX(i, ngrp, qry_ctx) @@ -3984,7 +3974,6 @@ doBATgroupquantile(BAT *b, BAT *g, BAT * size_t counter = 0; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); @@ -4366,7 +4355,6 @@ calcvariance(dbl *restrict avgp, const v dbl delta; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; switch (tp) { case TYPE_bte: @@ -4493,7 +4481,6 @@ calccovariance(const void *v1, const voi dbl mean1 = 0, mean2 = 0, m2 = 0, delta1, delta2; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; switch (tp) { @@ -4597,7 +4584,6 @@ BATcalccorrelation(BAT *b1, BAT *b2) lng t0 = 0; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); @@ -4714,7 +4700,6 @@ dogroupstdev(BAT **avgb, BAT *b, BAT *g, BATiter bi = {0}; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); @@ -4952,7 +4937,6 @@ dogroupcovariance(BAT *b1, BAT *b2, BAT BATiter b1i = {0}, b2i = {0}; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); @@ -5158,7 +5142,6 @@ BATgroupcorrelation(BAT *b1, BAT *b2, BA BATiter b1i = {0}, b2i = {0}; QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; TRC_DEBUG_IF(ALGO) t0 = GDKusec(); diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -814,8 +814,7 @@ COLcopy(BAT *b, int tt, bool writable, r return NULL; } - MT_lock_set(&b->theaplock); - bi = bat_iterator_nolock(b); + bi = bat_iterator(b); /* first try case (1); create a view, possibly with different * atom-types */ @@ -823,12 +822,12 @@ COLcopy(BAT *b, int tt, bool writable, r role == TRANSIENT && bi.restricted == BAT_READ && ATOMstorage(b->ttype) != TYPE_msk && /* no view on TYPE_msk */ - (!VIEWtparent(b) || - BBP_desc(VIEWtparent(b))->batRestricted == BAT_READ)) { - MT_lock_unset(&b->theaplock); + (bi.h == NULL || + bi.h->parentid == b->batCacheid || + BBP_desc(bi.h->parentid)->batRestricted == BAT_READ)) { bn = VIEWcreate(b->hseqbase, b); if (bn == NULL) { - return NULL; + goto bunins_failed; } if (tt != bn->ttype) { bn->ttype = tt; @@ -840,6 +839,7 @@ COLcopy(BAT *b, int tt, bool writable, r } bn->tseqbase = ATOMtype(tt) == TYPE_oid ? bi.tseq : oid_nil; } + bat_iterator_end(&bi); return bn; } else { /* check whether we need case (4); BUN-by-BUN copy (by @@ -867,8 +867,7 @@ COLcopy(BAT *b, int tt, bool writable, r bn = COLnew2(b->hseqbase, tt, bi.count, role, bi.width); if (bn == NULL) { - MT_lock_unset(&b->theaplock); - return NULL; + goto bunins_failed; } if (bn->tvheap != NULL && bn->tvheap->base == NULL) { /* this combination can happen since the last @@ -906,15 +905,16 @@ COLcopy(BAT *b, int tt, bool writable, r bn->batCapacity = 0; } else if (BATatoms[tt].atomFix || tt != TYPE_void || ATOMextern(tt)) { /* case (4): one-by-one BUN insert (really slow) */ - BUN p, q; + QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - BATloop(b, p, q) { + TIMEOUT_LOOP_IDX_DECL(p, bi.count, qry_ctx) { const void *t = BUNtail(bi, p); if (bunfastapp_nocheck(bn, t) != GDK_SUCCEED) { goto bunins_failed; } } + TIMEOUT_CHECK(qry_ctx, GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed, qry_ctx)); bn->theap->dirty |= bi.count > 0; } else if (tt != TYPE_void && bi.type == TYPE_void) { /* case (4): optimized for unary void @@ -951,7 +951,7 @@ COLcopy(BAT *b, int tt, bool writable, r } else { BATtseqbase(bn, oid_nil); } - BATkey(bn, BATtkey(b)); + BATkey(bn, bi.key); bn->tsorted = bi.sorted; bn->trevsorted = bi.revsorted; bn->tnorevsorted = bi.norevsorted; @@ -969,7 +969,7 @@ COLcopy(BAT *b, int tt, bool writable, r bn->tunique_est = bi.unique_est; } else if (ATOMstorage(tt) == ATOMstorage(b->ttype) && ATOMcompare(tt) == ATOMcompare(b->ttype)) { - BUN h = BATcount(b); + BUN h = bi.count; bn->tsorted = bi.sorted; bn->trevsorted = bi.revsorted; BATkey(bn, bi.key); @@ -1006,14 +1006,14 @@ COLcopy(BAT *b, int tt, bool writable, r bn->trevsorted = ATOMlinear(b->ttype); bn->tkey = true; } + bat_iterator_end(&bi); if (!writable) bn->batRestricted = BAT_READ; TRC_DEBUG(ALGO, ALGOBATFMT " -> " ALGOBATFMT "\n", ALGOBATPAR(b), ALGOBATPAR(bn)); - MT_lock_unset(&b->theaplock); return bn; bunins_failed: - MT_lock_unset(&b->theaplock); + bat_iterator_end(&bi); BBPreclaim(bn); return NULL; } diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -703,7 +703,6 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool } QryCtx *qry_ctx = MT_thread_get_qry_ctx(); - qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; BATiter ni = bat_iterator(n); @@ -739,6 +738,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool atomcmp(BUNtail(ni, ni.minpos), minbound) < 0) { assert(0); GDKerror("value out of bounds\n"); + MT_lock_unset(&b->theaplock); goto bailout; } } @@ -750,6 +750,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool atomcmp(BUNtail(ni, ni.maxpos), maxbound) >= 0) { assert(0); GDKerror("value out of bounds\n"); + MT_lock_unset(&b->theaplock); goto bailout; } } @@ -802,6 +803,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool if (minbound && n->tseqbase + ci.seq - hseq < *(const oid *)minbound) { assert(0); GDKerror("value not within bounds\n"); + MT_lock_unset(&b->theaplock); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org