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

Modified Files:
        pathfinder.mx 
Log Message:
Move [save](docBAT) to somewhere else in preparation for logging
document management calls.
Do not call collection_cleanup() on every document management run but
only when documents are actually deleted.  This version goes even
further than that and will only call collection_cleanup() when the
document that was deleted was identical to the collection.  Further
cleanup is postponed to restart of the server.


Index: pathfinder.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/pathfinder.mx,v
retrieving revision 1.344
retrieving revision 1.345
diff -u -d -r1.344 -r1.345
--- pathfinder.mx       19 Apr 2007 11:11:15 -0000      1.344
+++ pathfinder.mx       20 Apr 2007 12:08:39 -0000      1.345
@@ -3310,8 +3310,6 @@
     }
 
     if (doCommit) {
-      [save](docBAT); # make persistent documents clean on disk outside the 
locks
-
       lock_set(pf_short);
 
       # possibly back off if auto-caching documents gets us into meta-data 
locking trouble
@@ -3367,7 +3365,7 @@
 }
 var pf_commit_docmgt := true;
 
-PROC shred_doc_base(BAT[void,str] commitBAT,
+PROC shred_doc_base(bit cleanup,
                     BAT[void,str] idx_locations, 
                     BAT[void,str] idx_names, 
                     BAT[void,str] idx_colnames, 
@@ -3375,7 +3373,8 @@
                     Stream s,
                     lng wsid) : void
 {
-    var pivot, err, nr := 0, cleanup := bit(count(commitBAT));
+    var commitBAT := new(void,str);
+    var pivot, err, nr := 0;
     var selidx_colname := idx_colnames;
     if (count(selidx_colname) > 0)
         selidx_colname := reverse(reverse(idx_colnames).kunique().sort());
@@ -3417,6 +3416,9 @@
                           idx.project(timestamp_nil),
                           colname, coll_oid, runtime, oid_nil, percentage, 
true, s, wsid);
 
+       if (pf_commit_docmgt)
+         [save](docBAT); # make persistent documents clean on disk outside the 
locks
+
        if (isnil(coll_oid)) {
             # register new bats with the logger
            newcoll.append([bbpname](logger_bats.join(docBAT)));
@@ -3448,7 +3450,7 @@
 {
     var names := bat(void,str).append(name).access(BAT_READ).seqbase([EMAIL 
PROTECTED]);
     var wsid := WS_MAXID + lng(clientid() + 1);
-    var err := CATCH(shred_doc_base(bat(void,str), names, names, 
names.project(colname), names.project(pageFree), s, wsid));
+    var err := CATCH(shred_doc_base(false, names, names, 
names.project(colname), names.project(pageFree), s, wsid));
     ws_free(wsid); 
     if (not(isnil(err))) ERROR(err);
 }
@@ -3473,9 +3475,10 @@
 PROC _del_doc(bit cachedOnly,  
               BAT[any,str] names, # dummy param iff not(isnil(cachedOnly)) 
               BAT[oid,str] bak_locations, 
-              BAT[oid,str] bak_names) : void
+              BAT[oid,str] bak_names) : bit
 {
     var del := doc_timestamp; # select all at first
+    var ret := false;
     if (isnil(cachedOnly)) {
         del := reverse(names.outerjoin(reverse(doc_name)));
         if (del.exist(oid_nil)) {
@@ -3484,6 +3487,11 @@
                                  count(reverse(del).uselect(oid_nil)));
         }
         del := kunique(del);
+
+        # check if a document-id = its collection-id
+        # this detects del-doc()s on single-doc collections
+       var chk := mirror(del).leftjoin(doc_collection);
+        ret := [=](chk.hmark([EMAIL PROTECTED]),chk.tmark([EMAIL 
PROTECTED])).texist(true);
     } else if (cachedOnly) {
         del := del.uselect(timestamp_nil,timestamp_nil);
     } 
@@ -3491,22 +3499,23 @@
     bak_locations.insert(mirror(del).join(doc_location));
     bak_names.insert(mirror(del).join(doc_name));
     _del_doc_replace(del, del);
+    return ret; # returns whether we should force a cleanup
 }
 
 PROC del_doc(bit cachedOnly, 
              BAT[any,str] names,
-             bit pf_short_req) : BAT[void,str]
+             bit pf_short_req) : bit
 {
     var bak_locations := bat(oid,str);
     var bak_names := bat(oid,str);
 
     if (pf_short_req) lock_set(pf_short);
-    var err := CATCH(_del_doc(cachedOnly, names, bak_locations, bak_names));
+    var ret, err := CATCH(ret := _del_doc(cachedOnly, names, bak_locations, 
bak_names));
     if (not(isnil(err))) pf_assert(CATCH(_del_doc_replace(bak_locations, 
bak_names)), "in-memory recovery failed");
     if (pf_short_req) lock_unset(pf_short);
     if (not(isnil(err))) ERROR(err);
 
-    return bat(void,str).append("doc_name").append("doc_location");
+    return ret;
 }
 
 PROC del_doc_base(bit cachedOnly, 
@@ -3586,7 +3595,7 @@
 {
     var us := usec();
     var wsid := WS_MAXID + lng(clientid() + 1);
-    var err := CATCH(shred_doc_base(bat(void,str), 
+    var err := CATCH(shred_doc_base(false, 
                                     locations.tmark([EMAIL PROTECTED]), 
                                     names.tmark([EMAIL PROTECTED]), 
                                     colnames.tmark([EMAIL PROTECTED]), 


-------------------------------------------------------------------------
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