Changeset: 84f66ba47ea2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/84f66ba47ea2
Modified Files:
        gdk/gdk_bat.c
Branch: Dec2023
Log Message:

Delay calling BBPretain until after bat_iterator_end.
This fixes bug #7504.


diffs (53 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2575,6 +2575,7 @@ BATmode(BAT *b, bool transient)
 
        BATiter bi = bat_iterator(b);
        bool mustrelease = false;
+       bool mustretain = false;
        bat bid = b->batCacheid;
 
        if (transient != bi.transient) {
@@ -2591,16 +2592,20 @@ BATmode(BAT *b, bool transient)
                        }
                }
 
-               /* persistent BATs get a logical reference */
+               /* we need to delay the calls to BBPretain and
+                * BBPrelease until after we have released our reference
+                * to the heaps (i.e. until after bat_iterator_end),
+                * because in either case, BBPfree can be called (either
+                * directly here or in BBPtrim) which waits for the heap
+                * reference to come down.  BBPretain calls incref which
+                * waits until the trim that is waiting for us is done,
+                * so that causes deadlock, and BBPrelease can call
+                * BBPfree which causes deadlock with a single thread */
                if (!transient) {
-                       BBPretain(bid);
+                       /* persistent BATs get a logical reference */
+                       mustretain = true;
                } else if (!bi.transient) {
-                       /* we need to delay the release because if there
-                        * is no fix and the bat is loaded, BBPrelease
-                        * can call BBPfree which calls BATfree which
-                        * may hang while waiting for the heap reference
-                        * that we have because of the BAT iterator to
-                        * come down, in other words, deadlock */
+                       /* transient BATs loose their logical reference */
                        mustrelease = true;
                }
                MT_lock_set(&GDKswapLock(bid));
@@ -2632,8 +2637,10 @@ BATmode(BAT *b, bool transient)
                MT_lock_unset(&GDKswapLock(bid));
        }
        bat_iterator_end(&bi);
-       /* release after bat_iterator_end because of refs to heaps */
-       if (mustrelease)
+       /* retain/release after bat_iterator_end because of refs to heaps */
+       if (mustretain)
+               BBPretain(bid);
+       else if (mustrelease)
                BBPrelease(bid);
        return GDK_SUCCEED;
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to