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