On Wed, Aug 10, 2011 at 5:58 PM, Paul Davis <[email protected]> wrote:
>
> Since no one seems to have believed me I decided to take a closer look
I believe you, and in my machine, replication.js, takes about 120ms.
> at replication.js tests. And as I pointed out it was just polling a
> URL in a tight loop for 3s at a time. On my machine, this patch drops
> replication.js from 93329ms to 41785ms
That's awesome. If it doesn't make assertions fails for others, go ahead.
One thing I noticed in the past is that the browser seems to cache the
results of db.info() call. A solution (that is employed somewhere
else, but for another request) is to add some random parameter to the
query string, like /db?anticache=Math.random(1000000).
>. I'll point out that that's
> more than twice as fast. And that was just an obvious optimization
> from watching the log scroll. There are plenty more simple things that
> could be done to speed these up.
>
> Also, this patch makes me think that a _replication/localid -> JSON
> status blob might be useful. Though I dunno how possible that is. I
> reckon if we had that these would be sped up even more.
>
>
> diff --git a/share/www/script/couch.js b/share/www/script/couch.js
> index 304c9c1..792e638 100644
> --- a/share/www/script/couch.js
> +++ b/share/www/script/couch.js
> @@ -40,6 +40,8 @@ function CouchDB(name, httpHeaders) {
> if (this.last_req.status == 404) {
> return false;
> }
> + var t0 = new Date();
> + while(true) {if((new Date()) - t0 > 100) break;}
> CouchDB.maybeThrowError(this.last_req);
> return JSON.parse(this.last_req.responseText);
> };
> diff --git a/share/www/script/test/replication.js
> b/share/www/script/test/replication.js
> index 65c5eaa..b82375a 100644
> --- a/share/www/script/test/replication.js
> +++ b/share/www/script/test/replication.js
> @@ -149,24 +149,40 @@ couchTests.replication = function(debug) {
> }
>
>
> - function waitForSeq(sourceDb, targetDb) {
> - var targetSeq,
> - sourceSeq = sourceDb.info().update_seq,
> + function waitForSeq(sourceDb, targetDb, rep_id) {
> + var seq = sourceDb.info().update_seq,
> + ri = new RegExp(rep_id),
> + tasks,
> t0 = new Date(),
> t1,
> ms = 3000;
>
> do {
> - targetSeq = targetDb.info().update_seq;
> + tasks = JSON.parse(CouchDB.request("GET",
> "/_active_tasks").responseText);
> + for(var i = 0; i < tasks.length; i++) {
> + if(!ri.test(tasks[i].task)) continue;
> + var captured = /Processed (\d+)/.exec(tasks[i].status);
> + if(parseInt(captured[1]) >= seq) return;
> + break;
> + }
> t1 = new Date();
> - } while (((t1 - t0) <= ms) && targetSeq < sourceSeq);
> + } while ((t1 - t0) <= ms);
> }
>
> + function waitForRepEnd(rep_id) {
> + var ri = new RegExp(rep_id),
> + tasks,
> + t0 = new Date(),
> + t1,
> + ms = 3000;
>
> - function wait(ms) {
> - var t0 = new Date(), t1;
> do {
> - CouchDB.request("GET", "/");
> + tasks = JSON.parse(CouchDB.request("GET",
> "/_active_tasks").responseText);
> + var found = false;
> + for(var i = 0; i < tasks.length; i++) {
> + if(!ri.test(tasks[i].task)) found = true;
> + }
> + if(!found) return;
> t1 = new Date();
> } while ((t1 - t0) <= ms);
> }
> @@ -1143,7 +1159,7 @@ couchTests.replication = function(debug) {
>
> var rep_id = repResult._local_id;
>
> - waitForSeq(sourceDb, targetDb);
> + waitForSeq(sourceDb, targetDb, rep_id);
>
> for (j = 0; j < docs.length; j++) {
> doc = docs[j];
> @@ -1181,7 +1197,7 @@ couchTests.replication = function(debug) {
> var ddoc = docs[docs.length - 1]; // design doc
> addAtt(sourceDb, ddoc, "readme.txt", att1_data, "text/plain");
>
> - waitForSeq(sourceDb, targetDb);
> + waitForSeq(sourceDb, targetDb, rep_id);
>
> var modifDocs = docs.slice(10, 15).concat([ddoc]);
> for (j = 0; j < modifDocs.length; j++) {
> @@ -1226,7 +1242,7 @@ couchTests.replication = function(debug) {
> // add another attachment to the ddoc on source
> addAtt(sourceDb, ddoc, "data.dat", att2_data, "application/binary");
>
> - waitForSeq(sourceDb, targetDb);
> + waitForSeq(sourceDb, targetDb, rep_id);
>
> copy = targetDb.open(ddoc._id);
> var atts = copy._attachments;
> @@ -1263,7 +1279,7 @@ couchTests.replication = function(debug) {
> var newDocs = makeDocs(25, 35);
> populateDb(sourceDb, newDocs, true);
>
> - waitForSeq(sourceDb, targetDb);
> + waitForSeq(sourceDb, targetDb, rep_id);
>
> for (j = 0; j < newDocs.length; j++) {
> doc = newDocs[j];
> @@ -1282,7 +1298,7 @@ couchTests.replication = function(debug) {
> TEquals(true, sourceDb.deleteDoc(newDocs[0]).ok);
> TEquals(true, sourceDb.deleteDoc(newDocs[6]).ok);
>
> - waitForSeq(sourceDb, targetDb);
> + waitForSeq(sourceDb, targetDb, rep_id);
>
> copy = targetDb.open(newDocs[0]._id);
> TEquals(null, copy);
> @@ -1317,7 +1333,7 @@ couchTests.replication = function(debug) {
> };
> TEquals(true, sourceDb.save(doc).ok);
>
> - wait(2000);
> + waitForRepEnd(rep_id);
> copy = targetDb.open(doc._id);
> TEquals(null, copy);
> }
> @@ -1359,7 +1375,7 @@ couchTests.replication = function(debug) {
>
> var tasksAfter = JSON.parse(xhr.responseText);
> TEquals(tasks.length, tasksAfter.length);
> - waitForSeq(sourceDb, targetDb);
> + waitForSeq(sourceDb, targetDb, rep_id);
> T(sourceDb.open("30") !== null);
>
> // cancel replication
>
--
Filipe David Manana,
[email protected], [email protected]
"Reasonable men adapt themselves to the world.
Unreasonable men adapt the world to themselves.
That's why all progress depends on unreasonable men."