Skip to content

Commit

Permalink
Replicator DB: added _replication_state_time (a unix timestamp value)…
Browse files Browse the repository at this point in the history
… to replication documents.

git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@1038665 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
fdmanana committed Nov 24, 2010
1 parent 7c2a261 commit 67a79e7
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
12 changes: 12 additions & 0 deletions share/www/script/test/replicator_db.js
Expand Up @@ -104,6 +104,7 @@ couchTests.replicator_db = function(debug) {
T(repDoc1.source === repDoc.source);
T(repDoc1.target === repDoc.target);
T(repDoc1._replication_state === "completed", "simple");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");
}

Expand Down Expand Up @@ -155,6 +156,7 @@ couchTests.replicator_db = function(debug) {
T(repDoc1.source === repDoc.source);
T(repDoc1.target === repDoc.target);
T(repDoc1._replication_state === "completed", "filtered");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");
}

Expand Down Expand Up @@ -198,6 +200,7 @@ couchTests.replicator_db = function(debug) {
T(repDoc1.source === repDoc.source);
T(repDoc1.target === repDoc.target);
T(repDoc1._replication_state === "triggered");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");

// add a design doc to source, it will be replicated to target
Expand Down Expand Up @@ -312,6 +315,7 @@ couchTests.replicator_db = function(debug) {
T(repDoc1_copy.source === repDoc1.source);
T(repDoc1_copy.target === repDoc1.target);
T(repDoc1_copy._replication_state === "completed");
T(typeof repDoc1_copy._replication_state_time === "number");
T(typeof repDoc1_copy._replication_id === "string");

var newDoc = {
Expand Down Expand Up @@ -342,6 +346,7 @@ couchTests.replicator_db = function(debug) {
T(repDoc2_copy.source === repDoc1.source);
T(repDoc2_copy.target === repDoc1.target);
T(repDoc2_copy._replication_state === "completed");
T(typeof repDoc2_copy._replication_state_time === "number");
T(typeof repDoc2_copy._replication_id === "string");
T(repDoc2_copy._replication_id === repDoc1_copy._replication_id);
}
Expand Down Expand Up @@ -378,11 +383,13 @@ couchTests.replicator_db = function(debug) {
repDoc1 = repDb.open("foo_dup_rep_doc_1");
T(repDoc1 !== null);
T(repDoc1._replication_state === "completed", "identical");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");

repDoc2 = repDb.open("foo_dup_rep_doc_2");
T(repDoc2 !== null);
T(typeof repDoc2._replication_state === "undefined");
T(typeof repDoc2._replication_state_time === "undefined");
T(repDoc2._replication_id === repDoc1._replication_id);
}

Expand Down Expand Up @@ -420,11 +427,13 @@ couchTests.replicator_db = function(debug) {
repDoc1 = repDb.open("foo_dup_cont_rep_doc_1");
T(repDoc1 !== null);
T(repDoc1._replication_state === "triggered");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");

repDoc2 = repDb.open("foo_dup_cont_rep_doc_2");
T(repDoc2 !== null);
T(typeof repDoc2._replication_state === "undefined");
T(typeof repDoc2._replication_state_time === "undefined");
T(repDoc2._replication_id === repDoc1._replication_id);

var newDoc = {
Expand All @@ -444,6 +453,7 @@ couchTests.replicator_db = function(debug) {
repDoc1 = repDb.open("foo_dup_cont_rep_doc_1");
T(repDoc1 !== null);
T(repDoc1._replication_state === "triggered");
T(typeof repDoc1._replication_state_time === "number");

var newDoc2 = {
_id: "foo5000",
Expand Down Expand Up @@ -711,6 +721,7 @@ couchTests.replicator_db = function(debug) {
T(repDoc1.target === repDoc.target);
T(repDoc1._replication_state === "completed",
"replication document with bad replication id failed");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");
T(repDoc1._replication_id !== "1234abc");
}
Expand All @@ -730,6 +741,7 @@ couchTests.replicator_db = function(debug) {
var repDoc1 = repDb.open(repDoc._id);
T(repDoc1 !== null);
T(repDoc1._replication_state === "error");
T(typeof repDoc1._replication_state_time === "number");
T(typeof repDoc1._replication_id === "string");
}

Expand Down
3 changes: 3 additions & 0 deletions src/couchdb/couch_doc.erl
Expand Up @@ -256,6 +256,9 @@ transfer_fields([{<<"_deleted_conflicts">>, _} | Rest], Doc) ->
transfer_fields([{<<"_replication_state">>, _} = Field | Rest],
#doc{body=Fields} = Doc) ->
transfer_fields(Rest, Doc#doc{body=[Field|Fields]});
transfer_fields([{<<"_replication_state_time">>, _} = Field | Rest],
#doc{body=Fields} = Doc) ->
transfer_fields(Rest, Doc#doc{body=[Field|Fields]});
transfer_fields([{<<"_replication_id">>, _} = Field | Rest],
#doc{body=Fields} = Doc) ->
transfer_fields(Rest, Doc#doc{body=[Field|Fields]});
Expand Down
11 changes: 9 additions & 2 deletions src/couchdb/couch_rep.erl
Expand Up @@ -854,8 +854,15 @@ update_rep_doc({Props} = _RepDoc, KVs) ->

update_rep_doc(RepDb, #doc{body = {RepDocBody}} = RepDoc, KVs) ->
NewRepDocBody = lists:foldl(
fun({K, _V} = KV, Body) ->
lists:keystore(K, 1, Body, KV)
fun({<<"_replication_state">> = K, _V} = KV, Body) ->
Body1 = lists:keystore(K, 1, Body, KV),
{Mega, Secs, _} = erlang:now(),
UnixTime = Mega * 1000000 + Secs,
lists:keystore(
<<"_replication_state_time">>, 1,
Body1, {<<"_replication_state_time">>, UnixTime});
({K, _V} = KV, Body) ->
lists:keystore(K, 1, Body, KV)
end,
RepDocBody,
KVs
Expand Down

0 comments on commit 67a79e7

Please sign in to comment.