Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4629)

Unified Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 12210109: Call batch/incremental fetch with more strict conditions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test fixes Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync_file_system/drive_file_sync_service.cc
diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.cc b/chrome/browser/sync_file_system/drive_file_sync_service.cc
index 4cc92c34133a2a684a982bb45f6f45c4c9dc17d2..397d0ad9aa3613a16e87d4bdc10927769bb7e358 100644
--- a/chrome/browser/sync_file_system/drive_file_sync_service.cc
+++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc
@@ -76,10 +76,6 @@ void DeleteTemporaryFile(const base::FilePath& file_path) {
void EmptyStatusCallback(fileapi::SyncStatusCode code) {}
-void MarkFetchingChangesCompleted(bool* is_fetching_changes) {
- *is_fetching_changes = false;
-}
-
void DidRemoveOrigin(const GURL& origin, fileapi::SyncStatusCode status) {
// TODO(calvinlo): Disable syncing if status not ok (http://crbug.com/171611).
DCHECK_EQ(fileapi::SYNC_STATUS_OK, status);
@@ -111,9 +107,6 @@ class DriveFileSyncService::TaskToken {
location_ = location;
task_type_ = TASK_TYPE_NONE;
description_.clear();
- if (!completion_callback_.is_null())
- completion_callback_.Run();
- completion_callback_.Reset();
}
void UpdateTask(const tracked_objects::Location& location,
@@ -132,14 +125,6 @@ class DriveFileSyncService::TaskToken {
const std::string& description() const { return description_; }
std::string done_description() const { return description_ + " done"; }
- void set_completion_callback(const base::Closure& callback) {
- completion_callback_ = callback;
- }
-
- const base::Closure& completion_callback() {
- return completion_callback_;
- }
-
~TaskToken() {
// All task on DriveFileSyncService must hold TaskToken instance to ensure
// no other tasks are running. Also, as soon as a task finishes to work,
@@ -158,7 +143,6 @@ class DriveFileSyncService::TaskToken {
tracked_objects::Location location_;
TaskType task_type_;
std::string description_;
- base::Closure completion_callback_;
DISALLOW_COPY_AND_ASSIGN(TaskToken);
};
@@ -187,7 +171,8 @@ void DriveFileSyncService::OnIncomingInvalidation(
kDriveInvalidationObjectId);
DCHECK_EQ(1U, invalidation_map.count(object_id));
- FetchChangesForIncrementalSync();
+ may_have_unfetched_changes_ = true;
+ MaybeStartFetchChanges();
}
struct DriveFileSyncService::ProcessRemoteChangeParam {
@@ -288,7 +273,7 @@ DriveFileSyncService::DriveFileSyncService(Profile* profile)
push_notification_registered_(false),
push_notification_enabled_(false),
polling_delay_seconds_(kMinimumPollingDelaySeconds),
- is_fetching_changes_(false),
+ may_have_unfetched_changes_(true),
weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
temporary_file_dir_ =
profile->GetPath().Append(kSyncFileSystemDir).Append(kTempDirName);
@@ -416,6 +401,7 @@ void DriveFileSyncService::UnregisterOriginForTrackingChanges(
pending_changes_.erase(itr->second.position_in_queue);
origin_to_changes_map_.erase(found);
}
+ pending_batch_sync_origins_.erase(origin);
metadata_store_->RemoveOrigin(origin, base::Bind(
&DriveFileSyncService::DidRemoveOriginOnMetadataStore,
@@ -677,7 +663,9 @@ void DriveFileSyncService::OnAuthenticated() {
Observer, service_observers_,
OnRemoteServiceStateUpdated(GetCurrentState(), "Authenticated"));
UpdatePollingDelay(kMinimumPollingDelaySeconds);
- SchedulePolling();
+
+ may_have_unfetched_changes_ = true;
+ MaybeStartFetchChanges();
}
void DriveFileSyncService::OnNetworkConnected() {
@@ -691,7 +679,9 @@ void DriveFileSyncService::OnNetworkConnected() {
Observer, service_observers_,
OnRemoteServiceStateUpdated(GetCurrentState(), "Network connected"));
UpdatePollingDelay(kMinimumPollingDelaySeconds);
- SchedulePolling();
+
+ may_have_unfetched_changes_ = true;
+ MaybeStartFetchChanges();
}
// Called by CreateForTesting.
@@ -708,7 +698,7 @@ DriveFileSyncService::DriveFileSyncService(
push_notification_registered_(false),
push_notification_enabled_(false),
polling_delay_seconds_(-1),
- is_fetching_changes_(false),
+ may_have_unfetched_changes_(false),
weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
DCHECK(profile);
temporary_file_dir_ = base_dir.Append(kTempDirName);
@@ -745,7 +735,6 @@ void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
token_ = token.Pass();
TRACE_EVENT_ASYNC_END0("Sync FileSystem", "GetToken", this);
-
if (token_->task_type() != TASK_TYPE_NONE) {
DVLOG(2) << "NotifyTaskDone: " << token_->description()
<< ": finished with status=" << status
@@ -768,9 +757,6 @@ void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
}
}
- if (!token_->completion_callback().is_null())
- token_->completion_callback().Run();
-
token_->ResetTask(FROM_HERE);
if (!pending_tasks_.empty()) {
base::Closure closure = pending_tasks_.front();
@@ -779,21 +765,12 @@ void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
return;
}
- SchedulePolling();
-
- if (GetCurrentState() != REMOTE_SERVICE_OK &&
- GetCurrentState() != REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)
+ if (GetCurrentState() == REMOTE_SERVICE_DISABLED)
return;
- // If the state has become OK or TEMPORARY_UNAVAILABLE and we have any
- // pending batch sync origins, restart batch sync for them.
- if (!pending_batch_sync_origins_.empty()) {
- GURL origin = *pending_batch_sync_origins_.begin();
- pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin());
- std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin);
- StartBatchSyncForOrigin(origin, resource_id);
- return;
- }
+ MaybeStartFetchChanges();
+
+ SchedulePolling();
// Notify observer of the update of |pending_changes_|.
FOR_EACH_OBSERVER(Observer, service_observers_,
@@ -975,14 +952,16 @@ void DriveFileSyncService::StartBatchSyncForOrigin(
const std::string& resource_id) {
scoped_ptr<TaskToken> token(
GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp"));
- if (!token) {
- pending_batch_sync_origins_.insert(origin);
- return;
- }
+ DCHECK(token);
+ DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_);
+
+ DVLOG(1) << "Start batch sync for:" << origin.spec();
sync_client_->GetLargestChangeStamp(
base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync,
AsWeakPtr(), base::Passed(&token), origin, resource_id));
+
+ may_have_unfetched_changes_ = false;
}
void DriveFileSyncService::DidGetDirectoryForOrigin(
@@ -1072,6 +1051,14 @@ void DriveFileSyncService::DidGetDirectoryContentForBatchSync(
metadata_store_->MoveBatchSyncOriginToIncremental(origin);
}
+ // If this was the last batch sync origin and push_notification is enabled
+ // (indicates that we may have longer polling cycle), trigger the first
+ // incremental sync on next task cycle.
+ if (pending_batch_sync_origins_.empty() &&
+ push_notification_enabled_) {
+ may_have_unfetched_changes_ = true;
+ }
+
NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
}
@@ -1837,43 +1824,42 @@ bool DriveFileSyncService::GetPendingChangeForFileSystemURL(
return true;
}
-void DriveFileSyncService::FetchChangesForIncrementalSync() {
- scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DRIVE,
- "Fetching remote change list"));
- // If we got |token| successfully, |is_fetching_changes_| should be false.
- // |is_fetching_changes_| is true only when the FetchChanges sequence is
- // running or is in |pending_queue_|. In both case, the token is owned by
- // the FetchChanges sequence.
- DCHECK(!token || !is_fetching_changes_);
-
- if (!sync_enabled_ ||
- is_fetching_changes_ ||
- !pending_batch_sync_origins_.empty() ||
- metadata_store_->incremental_sync_origins().empty() ||
- !pending_changes_.empty()) {
- if (token) {
- token->ResetTask(FROM_HERE);
- NotifyTaskDone(last_operation_status_, token.Pass());
- }
+void DriveFileSyncService::MaybeStartFetchChanges() {
+ if (!token_ || GetCurrentState() == REMOTE_SERVICE_DISABLED) {
+ // If another task is already running or the service is disabled
+ // just return here.
+ // Note that token_ should be already non-null if this is called
+ // from NotifyTaskDone().
return;
}
- is_fetching_changes_ = true;
-
- if (!token) {
- pending_tasks_.push_back(base::Bind(
- &DriveFileSyncService::FetchChangesForIncrementalSync, AsWeakPtr()));
+ // If we have pending_batch_sync_origins, try starting the batch sync.
+ if (!pending_batch_sync_origins_.empty()) {
+ if (GetCurrentState() == REMOTE_SERVICE_OK ||
+ may_have_unfetched_changes_) {
+ GURL origin = *pending_batch_sync_origins_.begin();
+ pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin());
+ std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin);
+ StartBatchSyncForOrigin(origin, resource_id);
+ }
return;
}
- token->set_completion_callback(
- base::Bind(&MarkFetchingChangesCompleted, &is_fetching_changes_));
-
- if (metadata_store_->incremental_sync_origins().empty()) {
- token->ResetTask(FROM_HERE);
- NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
- return;
+ if (may_have_unfetched_changes_ &&
+ !metadata_store_->incremental_sync_origins().empty() &&
+ pending_changes_.empty()) {
+ FetchChangesForIncrementalSync();
}
+}
+
+void DriveFileSyncService::FetchChangesForIncrementalSync() {
+ scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DRIVE,
+ "Fetching remote change list"));
+ DCHECK(token);
+ DCHECK(may_have_unfetched_changes_);
+ DCHECK(pending_batch_sync_origins_.empty());
+ DCHECK(!metadata_store_->incremental_sync_origins().empty());
+ DCHECK(pending_changes_.empty());
DVLOG(1) << "FetchChangesForIncrementalSync (start_changestamp:"
<< (largest_fetched_changestamp_ + 1) << ")";
@@ -1882,6 +1868,8 @@ void DriveFileSyncService::FetchChangesForIncrementalSync() {
largest_fetched_changestamp_ + 1,
base::Bind(&DriveFileSyncService::DidFetchChangesForIncrementalSync,
AsWeakPtr(), base::Passed(&token), false));
+
+ may_have_unfetched_changes_ = false;
}
void DriveFileSyncService::DidFetchChangesForIncrementalSync(
@@ -1985,11 +1973,8 @@ void DriveFileSyncService::RegisterDriveNotifications() {
void DriveFileSyncService::SchedulePolling() {
if (polling_timer_.IsRunning() ||
- polling_delay_seconds_ < 0)
- return;
-
- if (state_ != REMOTE_SERVICE_OK &&
- state_ != REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)
+ polling_delay_seconds_ < 0 ||
+ GetCurrentState() == REMOTE_SERVICE_DISABLED)
return;
DVLOG(1) << "Polling scheduled"
@@ -1997,8 +1982,12 @@ void DriveFileSyncService::SchedulePolling() {
polling_timer_.Start(
FROM_HERE, base::TimeDelta::FromSeconds(polling_delay_seconds_),
- base::Bind(&DriveFileSyncService::FetchChangesForIncrementalSync,
- AsWeakPtr()));
+ base::Bind(&DriveFileSyncService::OnPollingTimerFired, AsWeakPtr()));
+}
+
+void DriveFileSyncService::OnPollingTimerFired() {
+ may_have_unfetched_changes_ = true;
+ MaybeStartFetchChanges();
}
void DriveFileSyncService::UpdatePollingDelay(int64 new_delay_sec) {

Powered by Google App Engine
This is Rietveld 408576698