You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by jc...@apache.org on 2009/11/30 04:59:03 UTC

svn commit: r885329 - in /couchdb/trunk: share/www/script/test/changes.js src/couchdb/couch_httpd_db.erl

Author: jchris
Date: Mon Nov 30 03:59:02 2009
New Revision: 885329

URL: http://svn.apache.org/viewvc?rev=885329&view=rev
Log:
work on COUCHDB-582, fixes issues with filtered longpoll requests closing early

Modified:
    couchdb/trunk/share/www/script/test/changes.js
    couchdb/trunk/src/couchdb/couch_httpd_db.erl

Modified: couchdb/trunk/share/www/script/test/changes.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/changes.js?rev=885329&r1=885328&r2=885329&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/test/changes.js (original)
+++ couchdb/trunk/share/www/script/test/changes.js Mon Nov 30 03:59:02 2009
@@ -26,10 +26,10 @@
   var resp = JSON.parse(req.responseText);
 
   T(resp.results.length == 0 && resp.last_seq==0, "empty db")
-
   var docFoo = {_id:"foo", bar:1};
   T(db.save(docFoo).ok);
-
+  T(db.ensureFullCommit().ok);
+  
   req = CouchDB.request("GET", "/test_suite_db/_changes");
   var resp = JSON.parse(req.responseText);
 
@@ -186,6 +186,7 @@
   T(resp.results.length == 0); 
 
   db.save({"bop" : "foom"});
+  db.save({"bop" : false});
   
   var req = CouchDB.request("GET", "/test_suite_db/_changes?filter=changes_filter/bop");
   var resp = JSON.parse(req.responseText);
@@ -199,6 +200,27 @@
   resp = JSON.parse(req.responseText);
   T(resp.results.length == 1);
 
+  if (!is_safari && xhr) { // full test requires parallel connections
+    // filter with longpoll
+    // longpoll filters full history when run without a since seq
+    xhr = CouchDB.newXhr();
+    xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&filter=changes_filter/bop", true);
+    xhr.send("");
+    sleep(100);
+    var resp = JSON.parse(xhr.responseText);
+    T(resp.last_seq == 7);
+    // longpoll waits until a matching change before returning
+    xhr = CouchDB.newXhr();
+    xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&since=7&filter=changes_filter/bop", true);
+    xhr.send("");
+    db.save({"bop" : ""}); // empty string is falsy
+    var id = db.save({"bop" : "bingo"}).id;
+    sleep(100);
+    var resp = JSON.parse(xhr.responseText);
+    T(resp.last_seq == 9);
+    T(resp.results && resp.results.length > 0 && resp.results[0]["id"] == id, "filter the correct update");
+  }
+
   // error conditions
 
   // non-existing design doc
@@ -224,7 +246,7 @@
   var req = CouchDB.request("GET", 
     "/test_suite_db/_changes?filter=changes_filter/bop&style=all_docs");
   var resp = JSON.parse(req.responseText);
-  TEquals(1, resp.results.length, "should return one result row");
+  TEquals(2, resp.results.length, "should return two rows");
   
   // test for userCtx
   run_on_modified_server(
@@ -248,6 +270,7 @@
 
       var docResp = db.save({"user" : "Chris Anderson"});
       T(docResp.ok);
+      T(db.ensureFullCommit().ok);
       req = CouchDB.request("GET", "/test_suite_db/_changes?filter=changes_filter/userCtx", authOpts);
       resp = JSON.parse(req.responseText);
       T(resp.results.length == 1, "userCtx");

Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=885329&r1=885328&r2=885329&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Mon Nov 30 03:59:02 2009
@@ -159,7 +159,7 @@
         Prepend, ResponseType, Limit, Filter, End),
     couch_db:close(Db),
     if
-    EndSeq > StartSeq, ResponseType == "longpoll" ->
+    Limit > NewLimit, ResponseType == "longpoll" ->
         end_sending_changes(Resp, EndSeq, ResponseType);
     true ->
         case wait_db_updated(Timeout, TimeoutFun) of