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

Unified Diff: chrome/browser/chromeos/drive/sync_client.cc

Issue 68543002: drive: Support offline delete (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move to drive/other and mark as deleted Created 7 years, 1 month 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/chromeos/drive/sync_client.cc
diff --git a/chrome/browser/chromeos/drive/sync_client.cc b/chrome/browser/chromeos/drive/sync_client.cc
index 413bdcefa01b5fc67a22a12de88f342088047981..3f4c6c2a520ef2308ad5f12be3ac228ed52e60d0 100644
--- a/chrome/browser/chromeos/drive/sync_client.cc
+++ b/chrome/browser/chromeos/drive/sync_client.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/chromeos/drive/file_system/download_operation.h"
#include "chrome/browser/chromeos/drive/file_system/update_operation.h"
#include "chrome/browser/chromeos/drive/file_system_util.h"
+#include "chrome/browser/chromeos/drive/sync/remove_performer.h"
#include "chrome/browser/google_apis/task_util.h"
#include "content/public/browser/browser_thread.h"
@@ -42,24 +43,33 @@ const int kDelaySeconds = 5;
// The delay constant is used to delay retrying a sync task on server errors.
const int kLongDelaySeconds = 600;
-// Iterates cache entries and appends IDs to |to_fetch| if the file is pinned
-// but not fetched (not present locally), or to |to_upload| if the file is dirty
-// but not uploaded.
-void CollectBacklog(FileCache* cache,
+// Iterates entries and appends IDs to |to_fetch| if the file is pinned but not
+// fetched (not present locally), to |to_upload| if the file is dirty but not
+// uploaded, or to |to_remove| if the entry is locally deleted.
+void CollectBacklog(ResourceMetadata* metadata,
std::vector<std::string>* to_fetch,
- std::vector<std::string>* to_upload) {
+ std::vector<std::string>* to_upload,
+ std::vector<std::string>* to_remove) {
DCHECK(to_fetch);
DCHECK(to_upload);
+ DCHECK(to_remove);
- scoped_ptr<FileCache::Iterator> it = cache->GetIterator();
+ scoped_ptr<ResourceMetadata::Iterator> it = metadata->GetIterator();
for (; !it->IsAtEnd(); it->Advance()) {
- const FileCacheEntry& cache_entry = it->GetValue();
const std::string& local_id = it->GetID();
- if (cache_entry.is_pinned() && !cache_entry.is_present())
- to_fetch->push_back(local_id);
-
- if (cache_entry.is_dirty())
- to_upload->push_back(local_id);
+ const ResourceEntry& entry = it->GetValue();
+ if (entry.parent_local_id() == util::kDriveOtherDirLocalId &&
+ entry.deleted())
+ to_remove->push_back(local_id);
kinaba 2013/11/12 06:21:29 Probably we don't want to, say, fetch a pinned and
hashimoto 2013/11/25 10:13:58 Done.
+
+ FileCacheEntry cache_entry;
+ if (it->GetCacheEntry(&cache_entry)) {
+ if (cache_entry.is_pinned() && !cache_entry.is_present())
+ to_fetch->push_back(local_id);
+
+ if (cache_entry.is_dirty())
+ to_upload->push_back(local_id);
+ }
}
DCHECK(!it->HasError());
}
@@ -129,6 +139,9 @@ SyncClient::SyncClient(base::SequencedTaskRunner* blocking_task_runner,
scheduler,
metadata,
cache)),
+ remove_performer_(new RemovePerformer(blocking_task_runner,
+ scheduler,
+ metadata)),
delay_(base::TimeDelta::FromSeconds(kDelaySeconds)),
long_delay_(base::TimeDelta::FromSeconds(kLongDelaySeconds)),
weak_ptr_factory_(this) {
@@ -144,13 +157,15 @@ void SyncClient::StartProcessingBacklog() {
std::vector<std::string>* to_fetch = new std::vector<std::string>;
std::vector<std::string>* to_upload = new std::vector<std::string>;
+ std::vector<std::string>* to_remove = new std::vector<std::string>;
blocking_task_runner_->PostTaskAndReply(
FROM_HERE,
- base::Bind(&CollectBacklog, cache_, to_fetch, to_upload),
+ base::Bind(&CollectBacklog, metadata_, to_fetch, to_upload, to_remove),
base::Bind(&SyncClient::OnGetLocalIdsOfBacklog,
weak_ptr_factory_.GetWeakPtr(),
base::Owned(to_fetch),
- base::Owned(to_upload)));
+ base::Owned(to_upload),
+ base::Owned(to_remove)));
}
void SyncClient::StartCheckingExistingPinnedFiles() {
@@ -187,6 +202,16 @@ void SyncClient::AddUploadTask(const std::string& local_id) {
AddTaskToQueue(UPLOAD, local_id, delay_);
}
+void SyncClient::AddRemoveTask(const std::string& local_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ DVLOG(1) << "Removing " << local_id;
+ remove_performer_->Remove(local_id,
+ base::Bind(&SyncClient::OnRemoveComplete,
+ weak_ptr_factory_.GetWeakPtr(),
+ local_id));
+}
+
void SyncClient::AddTaskToQueue(SyncType type,
const std::string& local_id,
const base::TimeDelta& delay) {
@@ -259,7 +284,8 @@ void SyncClient::StartTask(SyncType type, const std::string& local_id) {
void SyncClient::OnGetLocalIdsOfBacklog(
const std::vector<std::string>* to_fetch,
- const std::vector<std::string>* to_upload) {
+ const std::vector<std::string>* to_upload,
+ const std::vector<std::string>* to_remove) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
// Give priority to upload tasks over fetch tasks, so that dirty files are
@@ -275,6 +301,12 @@ void SyncClient::OnGetLocalIdsOfBacklog(
DVLOG(1) << "Queuing to fetch: " << local_id;
AddTaskToQueue(FETCH, local_id, delay_);
}
+
+ for (size_t i = 0; i < to_remove->size(); ++i) {
+ const std::string& local_id = (*to_remove)[i];
+ DVLOG(1) << "Queuing to remove: " << local_id;
+ AddRemoveTask(local_id);
+ }
}
void SyncClient::AddFetchTasks(const std::vector<std::string>* local_ids) {
@@ -342,5 +374,28 @@ void SyncClient::OnUploadFileComplete(const std::string& local_id,
}
}
+void SyncClient::OnRemoveComplete(const std::string& local_id,
+ FileError error) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ if (error == FILE_ERROR_OK) {
+ DVLOG(1) << "Removed " << local_id;
+ } else {
+ switch (error) {
+ case FILE_ERROR_NO_CONNECTION:
+ // Re-queue the task so that we'll retry once the connection is back.
+ AddRemoveTask(local_id);
+ break;
+ case FILE_ERROR_SERVICE_UNAVAILABLE:
+ // Re-queue the task so that we'll retry once the service is back.
+ AddRemoveTask(local_id);
kinaba 2013/11/12 06:21:29 AddTaskToQueue posts the task after a long_delay_,
hashimoto 2013/11/25 10:13:58 Done.
+ break;
+ default:
+ LOG(WARNING) << "Failed to remove " << local_id << ": "
+ << FileErrorToString(error);
+ }
+ }
+}
+
} // namespace internal
} // namespace drive

Powered by Google App Engine
This is Rietveld 408576698