diff options
author | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-01 00:39:05 +0000 |
---|---|---|
committer | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-01 00:39:05 +0000 |
commit | 74001d2d9297c41dd15834cb59e90064f1c158df (patch) | |
tree | ad8d5e6f60c6a07b19c003906154010d696c12b4 /sync/engine/directory_update_handler.cc | |
parent | 6a84742a22f1cc167599e97c61303abb64e7fd91 (diff) | |
download | chromium_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.cc | 54 |
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(¤t_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 |