Improvements to custom org tree UI user/berick/custom-org-tree-UI-repairs
authorBill Erickson <berick@esilibrary.com>
Thu, 23 Aug 2012 21:29:42 +0000 (17:29 -0400)
committerBill Erickson <berick@esilibrary.com>
Thu, 23 Aug 2012 21:29:42 +0000 (17:29 -0400)
This replaced the PermaCrud.js create() calls with inline transaction
begin, creates, and commit.  We do this to solve a number of problems:

* Create all new nodes within the same transaction so that a failure
gracefully rolls back.

* PermaCrud.js does not currently disconnect opensrf client sessions
(though it has a disconnect() method), which can lead to pcrud drone
exhaustion when processing large batches of creates, etc.

* Re-using the same opensrf session leads to re-using the thread trace
(opensrf.js bug), which causes requests to intermittently fail as pcrud
backends slowly die off (see bug above), which causes their translater
cache entry to clear, which causes new sessions to fail when the hit the
translater with an already-cleared translator cache key.

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/web/js/ui/default/conify/global/actor/org_unit_custom_tree.js

index 88d35dc..b4fd42a 100644 (file)
@@ -162,12 +162,19 @@ function applyChanges() {
 }
 
 function applyChanges2() {
+
+    // pcrud.disconnect() exits before disconnecting the session.
+    // Clean up the session here.  TODO: fix pcrud
+    pcrud.session.disconnect();
+    pcrud.session.cleanup();
+
     ctNodes = [];
     var newCtNodes = [];
     var nodeList = [];
     var sorder = 0;
     var prevTn;
     var progress = 0;
+    var session = new OpenSRF.ClientSession('open-ils.pcrud');
 
     // flatten child nodes into a level-order (by parent) list
     var nodeList = [magicTree.rootNode];
@@ -178,6 +185,19 @@ function applyChanges2() {
     }
     flatten(magicTree.rootNode);
 
+    // called after all nodes are processed
+    function finishUp() {
+        // commit the transaction
+        session.request({
+            method : 'open-ils.pcrud.transaction.commit',
+            params : [ openils.User.authtoken ],
+            oncomplete : function (r) {
+                session.disconnect();
+                location.href = location.href;
+            }
+        }).send();
+    }
+
     // traverse the nodes, creating new aoucnt's as we go
     function traverseAndCreate(node) {
         var item = node.item;
@@ -199,25 +219,36 @@ function applyChanges2() {
             tn.sibling_order(++sorder);
         } else { sorder = 0; }
 
-        console.log("Creating new node for org unit " + tn.org_unit());
-
-        // create the new node, then process the children
-        pcrud.create(tn, {
-            oncomplete : function(r, objs) {
-                var newTn = objs[0];
+        // create the new node, then process the children (async)
+        session.request({
+            method : 'open-ils.pcrud.create.aouctn',
+            params : [ openils.User.authtoken, tn ],
+            oncomplete : function (r) {
+                var newTn = openils.Util.readResponse(r);
+                console.log("Created new node for org " + newTn.org_unit() + " => " + newTn.id());
                 ctNodes.push(newTn);
                 prevTn = newTn;
                 if (nodeList.length == 0) {
-                    progressDialog.hide();
-                    location.href = location.href;
+                    finishUp();
                 } else {
                     progressDialog.update({maximum : nodeList.length, progress : ++progress});
                     traverseAndCreate(nodeList.shift());
                 }
             }
-        });
+        }).send();
     }
-    traverseAndCreate(nodeList.shift());
+
+    // kick things off...
+    session.connect();
+
+    // start the transaction
+    session.request({
+        method : 'open-ils.pcrud.transaction.begin',
+        params : [ openils.User.authtoken ],
+        oncomplete : function (r) {
+            traverseAndCreate(nodeList.shift());
+        }
+    }).send();
 }
 
 function deleteSelected() {