Changeset: 6a85126b4323 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6a85126b4323
Modified Files:
        gdk/gdk_orderidx.c
        monetdb5/modules/mal/tablet.c
Branch: default
Log Message:

Fix some data races.


diffs (123 lines):

diff --git a/gdk/gdk_orderidx.c b/gdk/gdk_orderidx.c
--- a/gdk/gdk_orderidx.c
+++ b/gdk/gdk_orderidx.c
@@ -76,57 +76,54 @@ BATcheckorderidx(BAT *b)
 
        if (b == NULL)
                return false;
-       /* we don't need the lock just to read the value b->torderidx */
+       MT_lock_set(&b->batIdxLock);
        if (b->torderidx == (Heap *) 1) {
-               /* but when we want to change it, we need the lock */
-               assert(!GDKinmemory(b->theap->farmid));
-               MT_lock_set(&b->batIdxLock);
-               if (b->torderidx == (Heap *) 1) {
-                       Heap *hp;
-                       const char *nme = BBP_physical(b->batCacheid);
-                       int fd;
+               Heap *hp;
+               const char *nme = BBP_physical(b->batCacheid);
+               int fd;
 
-                       b->torderidx = NULL;
-                       if ((hp = GDKzalloc(sizeof(*hp))) != NULL &&
-                           (hp->farmid = BBPselectfarm(b->batRole, b->ttype, 
orderidxheap)) >= 0) {
-                               strconcat_len(hp->filename,
-                                             sizeof(hp->filename),
-                                             nme, ".torderidx", NULL);
-                               hp->storage = hp->newstorage = STORE_INVALID;
+               assert(!GDKinmemory(b->theap->farmid));
+               b->torderidx = NULL;
+               if ((hp = GDKzalloc(sizeof(*hp))) != NULL &&
+                   (hp->farmid = BBPselectfarm(b->batRole, b->ttype, 
orderidxheap)) >= 0) {
+                       strconcat_len(hp->filename,
+                                     sizeof(hp->filename),
+                                     nme, ".torderidx", NULL);
+                       hp->storage = hp->newstorage = STORE_INVALID;
 
-                               /* check whether a persisted orderidx can be 
found */
-                               if ((fd = GDKfdlocate(hp->farmid, nme, "rb+", 
"torderidx")) >= 0) {
-                                       struct stat st;
-                                       oid hdata[ORDERIDXOFF];
+                       /* check whether a persisted orderidx can be found */
+                       if ((fd = GDKfdlocate(hp->farmid, nme, "rb+", 
"torderidx")) >= 0) {
+                               struct stat st;
+                               oid hdata[ORDERIDXOFF];
 
-                                       if (read(fd, hdata, sizeof(hdata)) == 
sizeof(hdata) &&
-                                           hdata[0] == (
+                               if (read(fd, hdata, sizeof(hdata)) == 
sizeof(hdata) &&
+                                   hdata[0] == (
 #ifdef PERSISTENTIDX
-                                                   ((oid) 1 << 24) |
+                                           ((oid) 1 << 24) |
 #endif
-                                                   ORDERIDX_VERSION) &&
-                                           hdata[1] == (oid) BATcount(b) &&
-                                           (hdata[2] == 0 || hdata[2] == 1) &&
-                                           fstat(fd, &st) == 0 &&
-                                           st.st_size >= (off_t) (hp->size = 
hp->free = (ORDERIDXOFF + hdata[1]) * SIZEOF_OID) &&
-                                           HEAPload(hp, nme, "torderidx", 
false) == GDK_SUCCEED) {
-                                               close(fd);
-                                               ATOMIC_INIT(&hp->refs, 1);
-                                               b->torderidx = hp;
-                                               TRC_DEBUG(ACCELERATOR, 
"BATcheckorderidx(" ALGOBATFMT "): reusing persisted orderidx\n", 
ALGOBATPAR(b));
-                                               MT_lock_unset(&b->batIdxLock);
-                                               return true;
-                                       }
+                                           ORDERIDX_VERSION) &&
+                                   hdata[1] == (oid) BATcount(b) &&
+                                   (hdata[2] == 0 || hdata[2] == 1) &&
+                                   fstat(fd, &st) == 0 &&
+                                   st.st_size >= (off_t) (hp->size = hp->free 
= (ORDERIDXOFF + hdata[1]) * SIZEOF_OID) &&
+                                   HEAPload(hp, nme, "torderidx", false) == 
GDK_SUCCEED) {
                                        close(fd);
-                                       /* unlink unusable file */
-                                       GDKunlink(hp->farmid, BATDIR, nme, 
"torderidx");
+                                       ATOMIC_INIT(&hp->refs, 1);
+                                       b->torderidx = hp;
+                                       TRC_DEBUG(ACCELERATOR, 
"BATcheckorderidx(" ALGOBATFMT "): reusing persisted orderidx\n", 
ALGOBATPAR(b));
+                                       MT_lock_unset(&b->batIdxLock);
+                                       return true;
                                }
+                               close(fd);
+                               /* unlink unusable file */
+                               GDKunlink(hp->farmid, BATDIR, nme, "torderidx");
                        }
-                       GDKfree(hp);
-                       GDKclrerr();    /* we're not currently interested in 
errors */
                }
-               MT_lock_unset(&b->batIdxLock);
+               GDKfree(hp);
+               GDKclrerr();    /* we're not currently interested in errors */
        }
+       MT_lock_unset(&b->batIdxLock);
+
        ret = b->torderidx != NULL;
        if (ret)
                TRC_DEBUG(ACCELERATOR, "BATcheckorderidx(" ALGOBATFMT "): 
already has orderidx, waited " LLFMT " usec\n", ALGOBATPAR(b), GDKusec() - t);
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -1839,10 +1839,13 @@ SQLload_file(Client cntxt, Tablet *as, b
                        /* producer should stop */
                        task.maxrow = cnt;
                        task.state = ENDOFCOPY;
+                       task.ateof = true;
                }
                if (task.ateof && task.top[task.cur] < task.limit && cnt != 
task.maxrow)
                        break;
                task.top[task.cur] = 0;
+               if (cnt == task.maxrow)
+                       task.ateof = true;
                MT_sema_up(&task.producer);
        }
 
@@ -1850,7 +1853,6 @@ SQLload_file(Client cntxt, Tablet *as, b
 
        cnt = BATcount(task.as->format[firstcol].c);
 
-       task.ateof = true;
        task.state = ENDOFCOPY;
 /*     TRC_DEBUG(MAL_SERVER, "Activate sync on disk\n");*/
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to