Update of /cvsroot/monetdb/pathfinder/runtime
In directory sc8-pr-cvs16:/tmp/cvs-serv26508

Modified Files:
        pathfinder.mx pf_support.mx xrpc_client.mx xrpc_server.mx 
Log Message:
further changes to stabilize MXQ under tpox
- when two overlapping transactions modify map_pid, abort the second that tries 
to commit.
  (this can be avoided at commit time by adapting the master map_pid from the 
committed image)

- fix bug in ws_precommit: access to page_ws/attr_ws should be short-locked

- allow again non .xml/.XML name (sorry Djoerd, I had forgotten!)

- HTTP-xrpc document access should now use the prefix doc/
  (e.g. http://host:50001/xrpc/doc/foo.xml == xrpc://host/doc/foo.xml)



Index: xrpc_client.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/xrpc_client.mx,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- xrpc_client.mx      27 Apr 2007 09:45:59 -0000      1.32
+++ xrpc_client.mx      3 May 2007 21:28:06 -0000       1.33
@@ -1215,7 +1215,7 @@
             "Content-Type: text/html; charset=\"utf-8\"\r\n"
             "Content-Length: " SZFMT "\r\n\r\n"
             "%s",
-            XRPCD_CALLBACK, dst, b->pos, b->buf);
+            XRPC_REQ_CALLBACK, dst, b->pos, b->buf);
     if (bytes_sent < b->pos) {
         GDKerror("CMDhttp_post: failed to send XRPC request.");
         clean_up(sock, out, bs, b, argcnt, iterc);

Index: pathfinder.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/pathfinder.mx,v
retrieving revision 1.355
retrieving revision 1.356
diff -u -d -r1.355 -r1.356
--- pathfinder.mx       3 May 2007 13:27:15 -0000       1.355
+++ pathfinder.mx       3 May 2007 21:27:51 -0000       1.356
@@ -1687,11 +1687,11 @@
             var page_ws := runtime.fetch(RT_PAGE_WS);
             var all_ws := 
reverse(kunique(ws_overlaps_ws).kunion(reverse(ws_overlaps_ws)));
             if (bit(count(page_ws))) {
-                page_ws.delete(tdiff(page_ws, all_ws));
+                page_ws.deleteBuns(tdiff(page_ws, all_ws));
             }
             var attr_ws := runtime.fetch(RT_ATTR_WS);
             if (bit(count(attr_ws))) {
-                attr_ws.delete(tdiff(attr_ws, all_ws));
+                attr_ws.deleteBuns(tdiff(attr_ws, all_ws));
             }
         }
 
@@ -2181,7 +2181,7 @@
 {
     var free_pages := runtime.fetch(RT_LOCK_FREELIST);
     var i := count(free_pages);
-    
+
     # re-use a page from the list; or -if empty- append a new page
     if (i > 0) {
         var last_pid := reverse(free_pages).fetch(i - 1);
@@ -2511,24 +2511,21 @@
         ws_log(wsid, "ws_coll_isolate: exec-" + str(ws_logtime - usec()));
 }
 
-PROC ws_precommit(BAT[void,BAT] ws,
-                  oid cont,
-                  BAT[void,oid] modified_page,
-                  BAT[void,oid] modified_attr) : void
+PROC _ws_precommit(BAT[void,BAT] ws,
+                   oid cont,
+                   BAT[void,oid] modified_page,
+                   BAT[void,oid] modified_attr,
+                   bit map_pid_changed) : void
 {
     var wsid := ws_id(ws);
     var runtime := ws.fetch(CONT_RUNTIME).fetch(cont);
     var page_ws := runtime.fetch(RT_PAGE_WS);
     var attr_ws := runtime.fetch(RT_ATTR_WS);
-    var ws_logtime;
-
-    lock_set(pf_short);
-    var overlap, err := CATCH(overlap := 
reverse(ws_overlaps_ws).uselect(wsid).kunique().mirror());
-    lock_unset(pf_short);
-    if (not(isnil(err))) ERROR(err);
-
+    var overlap := reverse(ws_overlaps_ws).uselect(wsid).kunique().mirror();
+    var ws_logtime := usec(); 
+    var err;
+    
     if (ws_log_active) {
-        ws_logtime := usec(); 
         ws_log(wsid, "ws_precommit");
         [EMAIL PROTECTED]() 
             ws_log(wsid, "ws_precommit: overlaps-" + str($t));
@@ -2542,6 +2539,16 @@
             ws_log(wsid, sprintf("ws_precommit: page_ws-%s,%s", str($h), 
str($t)));
     }
 
+    # do not allow concurrent page inserts/deletes (simplictic and can be 
improved!!)
+    if (map_pid_changed) {
+        if (page_ws.exist(DOCID_MAX)) {
+            err := sprintf("conflicting update in map_pid from ws %s", 
str(page_ws.find(DOCID_MAX)));
+            if (ws_log_active) ws_log(wsid, err);
+            ERROR(err);
+        }
+        page_ws.insert(DOCID_MAX,wsid);
+    }
+
     # concurrency control: abort conflicting queries
     var conflict1 := join(modified_page,page_ws).join(overlap);
     if (bit(count(conflict1))) { 
@@ -2566,7 +2573,7 @@
     attr_ws.insert(reverse(modified_attr).project(wsid));
 
     if (ws_log_active)
-        ws_log(wsid, "ws_precommit: exec=" + str(usec() - ws_logtime)); 
+        ws_log(wsid, "ws_precommit: exec=" + str(usec() - ws_logtime));
 }
 
 PROC __ws_isolate(BAT[void,BAT] ws,
@@ -2698,7 +2705,7 @@
     # if there is a free page, then this is easy
     var coll_shortlock := reverse(runtime).fetch(RT_LOCK_FREELIST);
     lock_set(coll_shortlock);
-    var page_id := [EMAIL PROTECTED], err := CATCH(page_id := 
__runtime_newpage(runtime));
+    var page_id := [EMAIL PROTECTED]; err := CATCH(page_id := 
__runtime_newpage(runtime));
     lock_unset(coll_shortlock);
 
     if (isnil(err) and isnil(page_id)) {
@@ -3393,12 +3400,6 @@
     if (count(selidx_colname) > 0)
         selidx_colname := reverse(reverse(idx_colnames).kunique().sort());
 
-    # we now want .xml document names (in order for the HTTP doc access to 
work always)
-    var illegal := [or]([endsWith](idx_names, ".xml"), [endsWith](idx_names, 
".XML")).select(false);
-    if (bit(count(illegal)))
-        ERROR("add-doc(%s): document name must end in .xml (%d such 
errors)!\n", 
-                                 illegal.fetch(0), count(illegal));
-
     lock_set(pf_short);
     err := CATCH(pivot := _shred_doc_base(selidx_colname, idx_names, 
idx_colnames, wsid));
     lock_unset(pf_short);

Index: xrpc_server.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/xrpc_server.mx,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- xrpc_server.mx      25 Apr 2007 21:21:08 -0000      1.38
+++ xrpc_server.mx      3 May 2007 21:28:32 -0000       1.39
@@ -167,8 +167,9 @@
 #include "serialize.h"
 #include "shttpd.h"
 
-#define XRPCD_CALLBACK          "/xrpc"
-#define MXQ_ADMIN_CALLBACK      "/mxqadmin"
+#define XRPC_REQ_CALLBACK       "/xrpc"
+#define XRPC_DOC_CALLBACK       "/xrpc/doc"
+#define XRPC_ADM_CALLBACK       "/xrpc/admin"
 #define ERR403                  "403 Verbidden"
 #define ERR404                  "404 Bad Request"
 #define ERR500                  "500 Internal Server Error"
@@ -1174,6 +1175,10 @@
     lng **argcnt = NULL;
 
     lng time_xrpcServDeSeria = GDKusec();
+
+    /* skip callback identifier that directed us here */
+    uri += strlen(XRPC_DOC_CALLBACK);
+
     /* we don't always have the second '/' */
     if(uri[0] == '/') uri++;
     if(uri[0] == '\0'){
@@ -1258,12 +1263,12 @@
     struct shttpd_callback_arg *arg = (struct shttpd_callback_arg *) mc->arg;
     char *uri = shttpd_get_uri(arg);
 
-    if(strncmp(uri, XRPCD_CALLBACK, 5) == 0) {
-        (void) xrpc_handle_request(mc, arg);
-    } else if (strncmp(uri, MXQ_ADMIN_CALLBACK, 9) == 0) {
+    if (strncmp(uri, XRPC_ADM_CALLBACK, strlen(XRPC_ADM_CALLBACK)) == 0) {
         (void) xrpc_handle_admin_request(mc, arg);
-    } else { /* GET/PUT/DELETE file request */
-        (void) xrpc_handle_file_request(mc, arg);
+    } else if (strncmp(uri, XRPC_DOC_CALLBACK, strlen(XRPC_DOC_CALLBACK)) == 
0) {
+        (void) xrpc_handle_file_request(mc, arg); /* GET/PUT/DELETE file 
request */
+    } else if (strncmp(uri, XRPC_REQ_CALLBACK, strlen(XRPC_REQ_CALLBACK)) == 
0) {
+        (void) xrpc_handle_request(mc, arg);
     }
 
     /* clean up */
@@ -1336,10 +1341,9 @@
         timing = 1;
 
     /* Register call back function, for XRPC (admin) requests, and XML 
(get/put/delete) file handling */
-    shttpd_register_url(XRPCD_CALLBACK,     xrpc_fork_mapiclient, NULL);
-    shttpd_register_url(MXQ_ADMIN_CALLBACK, xrpc_fork_mapiclient, NULL);
-    shttpd_register_url(".xml",             xrpc_fork_mapiclient, NULL);
-    shttpd_register_url(".XML",             xrpc_fork_mapiclient, NULL);
+    shttpd_register_url(XRPC_REQ_CALLBACK,  xrpc_fork_mapiclient, NULL);
+    shttpd_register_url(XRPC_DOC_CALLBACK,  xrpc_fork_mapiclient, NULL);
+    shttpd_register_url(XRPC_ADM_CALLBACK, xrpc_fork_mapiclient, NULL);
 
     /* get admin bats */
     if (xrpc_trusted == NULL)

Index: pf_support.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/pf_support.mx,v
retrieving revision 1.224
retrieving revision 1.225
diff -u -d -r1.224 -r1.225
--- pf_support.mx       3 May 2007 17:52:34 -0000       1.224
+++ pf_support.mx       3 May 2007 21:27:53 -0000       1.225
@@ -2839,9 +2839,11 @@
     if (ws_log_active)
       ws_log(ws, "commit-reread exec" + str(ws_logtime - usec())); 
 
-    # ws_precommit gives an ERROR if a conflicting transaction has committed 
already
-    ws_precommit(ws, cont, sel_modified_page, sel_modified_attr);
-#     ws_precommit(ws, cont, sel_modified_page, sel_modified_attr, 
map_pid_changed);
+    # _ws_precommit gives an ERROR if a conflicting transaction has committed 
already
+    lock_set(pf_short);
+    var err := CATCH(_ws_precommit(ws, cont, sel_modified_page, 
sel_modified_attr, map_pid_changed));
+    lock_unset(pf_short);
+    if (not(isnil(err))) ERROR(err);
   }
 
   var ws_logtime := usec();


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to