summaryrefslogtreecommitdiffstats
path: root/sync/engine/directory_update_handler.cc
diff options
context:
space:
mode:
authorhaitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-01 00:39:05 +0000
committerhaitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-01 00:39:05 +0000
commit74001d2d9297c41dd15834cb59e90064f1c158df (patch)
treead8d5e6f60c6a07b19c003906154010d696c12b4 /sync/engine/directory_update_handler.cc
parent6a84742a22f1cc167599e97c61303abb64e7fd91 (diff)
downloadchromium_src-74001d2d9297c41dd15834cb59e90064f1c158df.zip
chromium_src-74001d2d9297c41dd15834cb59e90064f1c158df.tar.gz
chromium_src-74001d2d9297c41dd15834cb59e90064f1c158df.tar.bz2
Implememt garbage collection of old entries according to
version_watermark specified in progress marker during update processing. BUG=347253 Review URL: https://codereview.chromium.org/180673002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254298 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/engine/directory_update_handler.cc')
-rw-r--r--sync/engine/directory_update_handler.cc54
1 files changed, 50 insertions, 4 deletions
diff --git a/sync/engine/directory_update_handler.cc b/sync/engine/directory_update_handler.cc
index be36082..9d97765 100644
--- a/sync/engine/directory_update_handler.cc
+++ b/sync/engine/directory_update_handler.cc
@@ -37,7 +37,11 @@ void DirectoryUpdateHandler::ProcessGetUpdatesResponse(
sessions::StatusController* status) {
syncable::ModelNeutralWriteTransaction trans(FROM_HERE, SYNCER, dir_);
UpdateSyncEntities(&trans, applicable_updates, status);
- UpdateProgressMarker(progress_marker);
+
+ if (IsValidProgressMarker(progress_marker)) {
+ ExpireEntriesIfNeeded(&trans, progress_marker);
+ UpdateProgressMarker(progress_marker);
+ }
}
void DirectoryUpdateHandler::ApplyUpdates(sessions::StatusController* status) {
@@ -147,8 +151,8 @@ void DirectoryUpdateHandler::UpdateSyncEntities(
ProcessDownloadedUpdates(dir_, trans, type_, applicable_updates, status);
}
-void DirectoryUpdateHandler::UpdateProgressMarker(
- const sync_pb::DataTypeProgressMarker& progress_marker) {
+bool DirectoryUpdateHandler::IsValidProgressMarker(
+ const sync_pb::DataTypeProgressMarker& progress_marker) const {
int field_number = progress_marker.data_type_id();
ModelType model_type = GetModelTypeFromSpecificsFieldNumber(field_number);
if (!IsRealDataType(model_type) || type_ != model_type) {
@@ -156,8 +160,50 @@ void DirectoryUpdateHandler::UpdateProgressMarker(
<< "Update handler of type " << ModelTypeToString(type_)
<< " asked to process progress marker with invalid type "
<< field_number;
+ return false;
+ }
+ return true;
+}
+
+void DirectoryUpdateHandler::UpdateProgressMarker(
+ const sync_pb::DataTypeProgressMarker& progress_marker) {
+ if (progress_marker.has_gc_directive() || !cached_gc_directive_) {
+ dir_->SetDownloadProgress(type_, progress_marker);
+ } else {
+ sync_pb::DataTypeProgressMarker merged_marker = progress_marker;
+ merged_marker.mutable_gc_directive()->CopyFrom(*cached_gc_directive_);
+ dir_->SetDownloadProgress(type_, merged_marker);
+ }
+}
+
+void DirectoryUpdateHandler::ExpireEntriesIfNeeded(
+ syncable::ModelNeutralWriteTransaction* trans,
+ const sync_pb::DataTypeProgressMarker& progress_marker) {
+ if (!cached_gc_directive_) {
+ sync_pb::DataTypeProgressMarker current_marker;
+ GetDownloadProgress(&current_marker);
+ if (current_marker.has_gc_directive()) {
+ cached_gc_directive_.reset(new sync_pb::GarbageCollectionDirective(
+ current_marker.gc_directive()));
+ }
+ }
+
+ if (!progress_marker.has_gc_directive())
+ return;
+
+ const sync_pb::GarbageCollectionDirective& new_gc_directive =
+ progress_marker.gc_directive();
+
+ if (new_gc_directive.has_version_watermark() &&
+ (!cached_gc_directive_ ||
+ cached_gc_directive_->version_watermark() <
+ new_gc_directive.version_watermark())) {
+ ExpireEntriesByVersion(dir_, trans, type_,
+ new_gc_directive.version_watermark());
}
- dir_->SetDownloadProgress(type_, progress_marker);
+
+ cached_gc_directive_.reset(
+ new sync_pb::GarbageCollectionDirective(new_gc_directive));
}
} // namespace syncer