a | b | |
---|
| 0 | + | diff --git a/etc/couchdb/default.ini.tpl.in b/etc/couchdb/default.ini.tpl.in |
---|
| 0 | + | index 8207d6e..e05ddd2 100644 |
---|
| 0 | + | --- a/etc/couchdb/default.ini.tpl.in |
---|
| 0 | + | +++ b/etc/couchdb/default.ini.tpl.in |
---|
| 0 | + | @@ -12,6 +12,10 @@ max_dbs_open = 100 |
---|
| 0 | + | delayed_commits = true ; set this to false to ensure an fsync before 201 Created is returned |
---|
| 0 | + | uri_file = %localstaterundir%/couch.uri |
---|
| 0 | + | |
---|
| 0 | + | +[database_compaction] |
---|
| 0 | + | +doc_buffer_size = 1048576 ; value in bytes |
---|
| 0 | + | +checkpoint_after = 10485760 ; checkpoint after every N bytes were written |
---|
| 0 | + | + |
---|
| 0 | + | [httpd] |
---|
| 0 | + | port = 5984 |
---|
| 0 | + | bind_address = 127.0.0.1 |
---|
| 0 | + | diff --git a/src/couchdb/couch_db_updater.erl b/src/couchdb/couch_db_updater.erl |
---|
| 0 | + | index fef4032..4a626b0 100644 |
---|
| 0 | + | --- a/src/couchdb/couch_db_updater.erl |
---|
| 0 | + | +++ b/src/couchdb/couch_db_updater.erl |
---|
| 0 | + | @@ -858,32 +858,48 @@ copy_compact(Db, NewDb0, Retry) -> |
---|
| 0 | + | FsyncOptions = [Op || Op <- NewDb0#db.fsync_options, Op == before_header], |
---|
| 0 | + | NewDb = NewDb0#db{fsync_options=FsyncOptions}, |
---|
| 0 | + | TotalChanges = couch_db:count_changes_since(Db, NewDb#db.update_seq), |
---|
| 0 | + | + BufferSize = list_to_integer( |
---|
| 0 | + | + couch_config:get("database_compaction", "doc_buffer_size", "1048576")), |
---|
| 0 | + | + CheckpointAfter = list_to_integer( |
---|
| 0 | + | + couch_config:get("database_compaction", "checkpoint_after", "10485760")), |
---|
| 0 | + | + |
---|
| 0 | + | EnumBySeqFun = |
---|
| 0 | + | - fun(#doc_info{high_seq=Seq}=DocInfo, _Offset, {AccNewDb, AccUncopied, TotalCopied}) -> |
---|
| 0 | + | - couch_task_status:update("Copied ~p of ~p changes (~p%)", |
---|
| 0 | + | - [TotalCopied, TotalChanges, (TotalCopied*100) div TotalChanges]), |
---|
| 0 | + | - if TotalCopied rem 1000 =:= 0 -> |
---|
| 0 | + | - NewDb2 = copy_docs(Db, AccNewDb, lists:reverse([DocInfo | AccUncopied]), Retry), |
---|
| 0 | + | - if TotalCopied rem 10000 =:= 0 -> |
---|
| 0 | + | - {ok, {commit_data(NewDb2#db{update_seq=Seq}), [], TotalCopied + 1}}; |
---|
| 0 | + | + fun(#doc_info{high_seq=Seq}=DocInfo, _Offset, |
---|
| 0 | + | + {AccNewDb, AccUncopied, AccUncopiedSize, AccCopiedSize, TotalCopied}) -> |
---|
| 0 | + | + |
---|
| 0 | + | + AccUncopiedSize2 = AccUncopiedSize + byte_size(term_to_binary(DocInfo)), |
---|
| 0 | + | + if AccUncopiedSize2 >= BufferSize -> |
---|
| 0 | + | + NewDb2 = copy_docs( |
---|
| 0 | + | + Db, AccNewDb, lists:reverse([DocInfo | AccUncopied]), Retry), |
---|
| 0 | + | + TotalCopied2 = TotalCopied + 1 + length(AccUncopied), |
---|
| 0 | + | + couch_task_status:update("Copied ~p of ~p changes (~p%)", |
---|
| 0 | + | + [TotalCopied2, TotalChanges, (TotalCopied2 * 100) div TotalChanges]), |
---|
| 0 | + | + AccCopiedSize2 = AccCopiedSize + AccUncopiedSize2, |
---|
| 0 | + | + if AccCopiedSize2 >= CheckpointAfter -> |
---|
| 0 | + | + {ok, {commit_data(NewDb2#db{update_seq = Seq}), [], |
---|
| 0 | + | + 0, 0, TotalCopied2}}; |
---|
| 0 | + | true -> |
---|
| 0 | + | - {ok, {NewDb2#db{update_seq=Seq}, [], TotalCopied + 1}} |
---|
| 0 | + | + {ok, {NewDb2#db{update_seq = Seq}, [], |
---|
| 0 | + | + 0, AccCopiedSize2, TotalCopied2}} |
---|
| 0 | + | end; |
---|
| 0 | + | true -> |
---|
| 0 | + | - {ok, {AccNewDb, [DocInfo | AccUncopied], TotalCopied + 1}} |
---|
| 0 | + | + {ok, {AccNewDb, [DocInfo | AccUncopied], AccUncopiedSize2, |
---|
| 0 | + | + AccCopiedSize, TotalCopied}} |
---|
| 0 | + | end |
---|
| 0 | + | end, |
---|
| 0 | + | |
---|
| 0 | + | couch_task_status:set_update_frequency(500), |
---|
| 0 | + | + couch_task_status:update("Copied 0 of ~p changes (0%)", [TotalChanges]), |
---|
| 0 | + | |
---|
| 0 | + | - {ok, _, {NewDb2, Uncopied, TotalChanges}} = |
---|
| 0 | + | + {ok, _, {NewDb2, Uncopied, _, _, ChangesDone}} = |
---|
| 0 | + | couch_btree:foldl(Db#db.docinfo_by_seq_btree, EnumBySeqFun, |
---|
| 0 | + | - {NewDb, [], 0}, |
---|
| 0 | + | + {NewDb, [], 0, 0, 0}, |
---|
| 0 | + | [{start_key, NewDb#db.update_seq + 1}]), |
---|
| 0 | + | |
---|
| 0 | + | couch_task_status:update("Flushing"), |
---|
| 0 | + | |
---|
| 0 | + | NewDb3 = copy_docs(Db, NewDb2, lists:reverse(Uncopied), Retry), |
---|
| 0 | + | + TotalChanges = ChangesDone + length(Uncopied), |
---|
| 0 | + | |
---|
| 0 | + | % copy misc header values |
---|
| 0 | + | if NewDb3#db.security /= Db#db.security -> |
---|
... | |
---|