summaryrefslogtreecommitdiff
path: root/src/couchdb/couch_rep.erl
diff options
context:
space:
mode:
authorAdam Kocoloski <kocolosk@apache.org>2009-08-24 13:31:48 +0000
committerAdam Kocoloski <kocolosk@apache.org>2009-08-24 13:31:48 +0000
commite1b6dd15d993a3f424747ef5fc89ffa95a961613 (patch)
treeafd250106695bdbc6c357bce76136e33d316296b /src/couchdb/couch_rep.erl
parentab71069d36708d68206b79d97affce03173366b7 (diff)
skip full_commit during replication when its safe
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@807208 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb/couch_rep.erl')
-rw-r--r--src/couchdb/couch_rep.erl29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/couchdb/couch_rep.erl b/src/couchdb/couch_rep.erl
index 592693ee..95a23869 100644
--- a/src/couchdb/couch_rep.erl
+++ b/src/couchdb/couch_rep.erl
@@ -462,9 +462,9 @@ do_checkpoint(State) ->
try
{SrcRevPos,SrcRevId} =
- update_doc(Source, SourceLog#doc{body=NewRepHistory}, []),
+ update_local_doc(Source, SourceLog#doc{body=NewRepHistory}),
{TgtRevPos,TgtRevId} =
- update_doc(Target, TargetLog#doc{body=NewRepHistory}, []),
+ update_local_doc(Target, TargetLog#doc{body=NewRepHistory}),
State#state{
checkpoint_history = NewRepHistory,
source_log = SourceLog#doc{revs={SrcRevPos, [SrcRevId]}},
@@ -504,20 +504,33 @@ ensure_full_commit(#http_db{} = Db) ->
true = proplists:get_value(<<"ok">>, ResultProps),
proplists:get_value(<<"instance_start_time">>, ResultProps);
ensure_full_commit(Db) ->
- {ok, StartTime} = couch_db:ensure_full_commit(Db),
- StartTime.
+ {ok, NewDb} = couch_db:open(Db#db.name, []),
+ UpdateSeq = couch_db:get_update_seq(Db),
+ CommitSeq = couch_db:get_committed_update_seq(NewDb),
+ InstanceStartTime = NewDb#db.instance_start_time,
+ couch_db:close(NewDb),
+ if UpdateSeq > CommitSeq ->
+ ?LOG_DEBUG("replication needs a full commit: update ~p commit ~p",
+ [UpdateSeq, CommitSeq]),
+ {ok, NewTime} = couch_db:ensure_full_commit(Db),
+ NewTime;
+ true ->
+ ?LOG_DEBUG("replication doesn't need a full commit", []),
+ InstanceStartTime
+ end.
-update_doc(#http_db{} = Db, #doc{id=DocId} = Doc, []) ->
+update_local_doc(#http_db{} = Db, #doc{id=DocId} = Doc) ->
Req = Db#http_db{
resource = couch_util:url_encode(DocId),
method = put,
- body = couch_doc:to_json_obj(Doc, [attachments])
+ body = couch_doc:to_json_obj(Doc, [attachments]),
+ headers = [{"x-couch-full-commit", "false"} | Db#http_db.headers]
},
{ResponseMembers} = couch_rep_httpc:request(Req),
Rev = proplists:get_value(<<"rev">>, ResponseMembers),
couch_doc:parse_rev(Rev);
-update_doc(Db, Doc, Options) ->
- {ok, Result} = couch_db:update_doc(Db, Doc, Options),
+update_local_doc(Db, Doc) ->
+ {ok, Result} = couch_db:update_doc(Db, Doc, [delay_commit]),
Result.
up_to_date(#http_db{}, _Seq) ->