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

Side by Side Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 13986011: SyncFS: Introduce RemoteSyncOperationResolver for directory operation support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add RemoteSyncOperationResolver and unit tests Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/debug/trace_event.h" 12 #include "base/debug/trace_event.h"
13 #include "base/file_util.h" 13 #include "base/file_util.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/memory/weak_ptr.h" 15 #include "base/memory/weak_ptr.h"
16 #include "base/message_loop_proxy.h" 16 #include "base/message_loop_proxy.h"
17 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "chrome/browser/extensions/extension_service.h" 19 #include "chrome/browser/extensions/extension_service.h"
20 #include "chrome/browser/extensions/extension_system.h" 20 #include "chrome/browser/extensions/extension_system.h"
21 #include "chrome/browser/google_apis/drive_notification_manager.h" 21 #include "chrome/browser/google_apis/drive_notification_manager.h"
22 #include "chrome/browser/google_apis/drive_notification_manager_factory.h" 22 #include "chrome/browser/google_apis/drive_notification_manager_factory.h"
23 #include "chrome/browser/profiles/profile.h" 23 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/sync_file_system/conflict_resolution_policy.h" 24 #include "chrome/browser/sync_file_system/conflict_resolution_policy.h"
25 #include "chrome/browser/sync_file_system/drive_file_sync_client.h" 25 #include "chrome/browser/sync_file_system/drive_file_sync_client.h"
26 #include "chrome/browser/sync_file_system/drive_file_sync_util.h" 26 #include "chrome/browser/sync_file_system/drive_file_sync_util.h"
27 #include "chrome/browser/sync_file_system/drive_metadata_store.h" 27 #include "chrome/browser/sync_file_system/drive_metadata_store.h"
28 #include "chrome/browser/sync_file_system/file_status_observer.h" 28 #include "chrome/browser/sync_file_system/file_status_observer.h"
29 #include "chrome/browser/sync_file_system/remote_change_processor.h" 29 #include "chrome/browser/sync_file_system/remote_change_processor.h"
30 #include "chrome/browser/sync_file_system/remote_sync_operation_resolver.h"
30 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" 31 #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
31 #include "chrome/common/extensions/extension.h" 32 #include "chrome/common/extensions/extension.h"
32 #include "content/public/browser/browser_thread.h" 33 #include "content/public/browser/browser_thread.h"
33 #include "extensions/common/constants.h" 34 #include "extensions/common/constants.h"
34 #include "webkit/fileapi/file_system_url.h" 35 #include "webkit/fileapi/file_system_url.h"
35 #include "webkit/fileapi/syncable/sync_file_metadata.h" 36 #include "webkit/fileapi/syncable/sync_file_metadata.h"
36 #include "webkit/fileapi/syncable/sync_file_type.h" 37 #include "webkit/fileapi/syncable/sync_file_type.h"
37 #include "webkit/fileapi/syncable/syncable_file_system_util.h" 38 #include "webkit/fileapi/syncable/syncable_file_system_util.h"
38 39
39 using fileapi::FileSystemURL; 40 using fileapi::FileSystemURL;
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 1482
1482 bool missing_db_entry = (status != SYNC_STATUS_OK); 1483 bool missing_db_entry = (status != SYNC_STATUS_OK);
1483 if (missing_db_entry) { 1484 if (missing_db_entry) {
1484 param->drive_metadata.set_resource_id(param->remote_change.resource_id); 1485 param->drive_metadata.set_resource_id(param->remote_change.resource_id);
1485 param->drive_metadata.set_md5_checksum(std::string()); 1486 param->drive_metadata.set_md5_checksum(std::string());
1486 param->drive_metadata.set_conflicted(false); 1487 param->drive_metadata.set_conflicted(false);
1487 param->drive_metadata.set_to_be_fetched(false); 1488 param->drive_metadata.set_to_be_fetched(false);
1488 } 1489 }
1489 bool missing_local_file = (metadata.file_type == SYNC_FILE_TYPE_UNKNOWN); 1490 bool missing_local_file = (metadata.file_type == SYNC_FILE_TYPE_UNKNOWN);
1490 1491
1491 RemoteSyncOperationType operation = 1492 RemoteSyncOperationResolver::RemoteSyncOperationType operation =
1492 ResolveRemoteSyncOperationType(remote_file_change, param.get(), 1493 RemoteSyncOperationResolver::Resolve(remote_file_change,
1493 local_changes, missing_local_file); 1494 local_changes,
1495 param->local_metadata.file_type,
1496 param->drive_metadata.conflicted());
1494 1497
1495 DVLOG(1) << "ProcessRemoteChange for " << url.DebugString() 1498 DVLOG(1) << "ProcessRemoteChange for " << url.DebugString()
1496 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ") 1499 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ")
1497 << (missing_local_file ? " (missing local file)" : " ") 1500 << (missing_local_file ? " (missing local file)" : " ")
1498 << " remote_change: " << remote_file_change.DebugString() 1501 << " remote_change: " << remote_file_change.DebugString()
1499 << " ==> operation: " << operation; 1502 << " ==> operation: " << operation;
1500 1503
1501 switch (operation) { 1504 switch (operation) {
1502 case REMOTE_SYNC_OPERATION_ADD_FILE: 1505 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_ADD_FILE:
1503 param->sync_action = SYNC_ACTION_ADDED; 1506 param->sync_action = SYNC_ACTION_ADDED;
1504 DownloadForRemoteSync(param.Pass()); 1507 DownloadForRemoteSync(param.Pass());
1505 return; 1508 return;
1506 case REMOTE_SYNC_OPERATION_UPDATE_FILE: 1509 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_ADD_DIRECTORY:
1510 // TODO(nhiroki): support directory operations (http://crbug.com/161442).
1511 NOTIMPLEMENTED();
1512 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1513 return;
1514 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_UPDATE_FILE:
1507 param->sync_action = SYNC_ACTION_UPDATED; 1515 param->sync_action = SYNC_ACTION_UPDATED;
1508 DownloadForRemoteSync(param.Pass()); 1516 DownloadForRemoteSync(param.Pass());
1509 return; 1517 return;
1510 case REMOTE_SYNC_OPERATION_DELETE_FILE: { 1518 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_FILE: {
1511 param->sync_action = SYNC_ACTION_DELETED; 1519 param->sync_action = SYNC_ACTION_DELETED;
1512 const FileChange& file_change = remote_file_change; 1520 const FileChange& file_change = remote_file_change;
1513 remote_change_processor_->ApplyRemoteChange( 1521 remote_change_processor_->ApplyRemoteChange(
1514 file_change, base::FilePath(), url, 1522 file_change, base::FilePath(), url,
1515 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(), 1523 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(),
1516 base::Passed(&param))); 1524 base::Passed(&param)));
1517 return; 1525 return;
1518 } 1526 }
1519 case REMOTE_SYNC_OPERATION_NONE: 1527 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_DIRECTORY:
1528 // TODO(nhiroki): support directory operations (http://crbug.com/161442).
1529 NOTIMPLEMENTED();
1530 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1531 return;
1532 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_NONE:
1520 param->sync_action = SYNC_ACTION_NONE; 1533 param->sync_action = SYNC_ACTION_NONE;
1521 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); 1534 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK);
1522 return; 1535 return;
1523 case REMOTE_SYNC_OPERATION_CONFLICT: 1536 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_CONFLICT:
1524 HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK); 1537 HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK);
1525 return; 1538 return;
1526 case REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL: 1539 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL:
1527 ResolveConflictToLocalForRemoteSync(param.Pass()); 1540 ResolveConflictToLocalForRemoteSync(param.Pass());
1528 return; 1541 return;
1529 case REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE: { 1542 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE: {
1530 const FileSystemURL& url = param->remote_change.url; 1543 const FileSystemURL& url = param->remote_change.url;
1531 param->drive_metadata.set_conflicted(false); 1544 param->drive_metadata.set_conflicted(false);
1532 param->drive_metadata.set_to_be_fetched(true); 1545 param->drive_metadata.set_to_be_fetched(true);
1533 metadata_store_->UpdateEntry( 1546 metadata_store_->UpdateEntry(
1534 url, drive_metadata, base::Bind(&EmptyStatusCallback)); 1547 url, drive_metadata, base::Bind(&EmptyStatusCallback));
1535 param->sync_action = SYNC_ACTION_ADDED; 1548 param->sync_action = SYNC_ACTION_ADDED;
1536 DownloadForRemoteSync(param.Pass()); 1549 DownloadForRemoteSync(param.Pass());
1537 return; 1550 return;
1538 } 1551 }
1539 case REMOTE_SYNC_OPERATION_DELETE_METADATA: 1552 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_METADATA:
1540 param->sync_action = SYNC_ACTION_NONE; 1553 param->sync_action = SYNC_ACTION_NONE;
1541 if (missing_db_entry) 1554 if (missing_db_entry)
1542 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); 1555 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK);
1543 else 1556 else
1544 DeleteMetadataForRemoteSync(param.Pass()); 1557 DeleteMetadataForRemoteSync(param.Pass());
1545 return; 1558 return;
1546 case REMOTE_SYNC_OPERATION_FAIL: 1559 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_FAIL:
1547 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); 1560 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1548 return; 1561 return;
1549 } 1562 }
1550 NOTREACHED(); 1563 NOTREACHED();
1551 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); 1564 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1552 } 1565 }
1553 1566
1554 DriveFileSyncService::RemoteSyncOperationType
1555 DriveFileSyncService::ResolveRemoteSyncOperationType(
1556 const FileChange& remote_file_change,
1557 ProcessRemoteChangeParam* param,
1558 const FileChangeList& local_changes,
1559 bool missing_local_file) {
1560 if (param->drive_metadata.conflicted()) {
1561 switch (remote_file_change.change()) {
1562 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
1563 return missing_local_file ? REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE
1564 : REMOTE_SYNC_OPERATION_CONFLICT;
1565 case FileChange::FILE_CHANGE_DELETE:
1566 return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA
1567 : REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1568 }
1569 }
1570
1571 if (remote_file_change.IsAddOrUpdate()) {
1572 if (local_changes.empty())
1573 return missing_local_file ? REMOTE_SYNC_OPERATION_ADD_FILE
1574 : REMOTE_SYNC_OPERATION_UPDATE_FILE;
1575 switch (local_changes.list().back().change()) {
1576 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
1577 return REMOTE_SYNC_OPERATION_CONFLICT;
1578 case FileChange::FILE_CHANGE_DELETE:
1579 return REMOTE_SYNC_OPERATION_ADD_FILE;
1580 }
1581 }
1582
1583 DCHECK(remote_file_change.IsDelete());
1584 if (local_changes.empty())
1585 return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA
1586 : REMOTE_SYNC_OPERATION_DELETE_FILE;
1587 switch (local_changes.list().back().change()) {
1588 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
1589 return REMOTE_SYNC_OPERATION_NONE;
1590 case FileChange::FILE_CHANGE_DELETE:
1591 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
1592 }
1593 NOTREACHED();
1594 return REMOTE_SYNC_OPERATION_FAIL;
1595 }
1596
1597 void DriveFileSyncService::DidResolveConflictToLocalChange( 1567 void DriveFileSyncService::DidResolveConflictToLocalChange(
1598 scoped_ptr<ProcessRemoteChangeParam> param, 1568 scoped_ptr<ProcessRemoteChangeParam> param,
1599 SyncStatusCode status) { 1569 SyncStatusCode status) {
1600 if (status != SYNC_STATUS_OK) { 1570 if (status != SYNC_STATUS_OK) {
1601 DCHECK_NE(SYNC_STATUS_HAS_CONFLICT, status); 1571 DCHECK_NE(SYNC_STATUS_HAS_CONFLICT, status);
1602 AbortRemoteSync(param.Pass(), status); 1572 AbortRemoteSync(param.Pass(), status);
1603 return; 1573 return;
1604 } 1574 }
1605 1575
1606 const FileSystemURL& url = param->remote_change.url; 1576 const FileSystemURL& url = param->remote_change.url;
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
1947 return false; 1917 return false;
1948 1918
1949 // Drop any change if the change has unknown resource id. 1919 // Drop any change if the change has unknown resource id.
1950 if (!remote_resource_id.empty() && 1920 if (!remote_resource_id.empty() &&
1951 !local_resource_id.empty() && 1921 !local_resource_id.empty() &&
1952 remote_resource_id != local_resource_id) 1922 remote_resource_id != local_resource_id)
1953 return false; 1923 return false;
1954 1924
1955 FileChange file_change(CreateFileChange(is_deleted)); 1925 FileChange file_change(CreateFileChange(is_deleted));
1956 1926
1927 if (is_deleted) {
1928 // Determine a file type of the deleted change by local metadata.
1929 if (!remote_resource_id.empty() &&
1930 !local_resource_id.empty() &&
1931 remote_resource_id == local_resource_id) {
1932 DCHECK_EQ(DriveMetadata::RESOURCE_TYPE_FILE, metadata.type());
1933 file_change = FileChange(FileChange::FILE_CHANGE_DELETE,
1934 SYNC_FILE_TYPE_FILE);
1935 }
1936 }
1937
1957 if (is_deleted && has_db_entry) { 1938 if (is_deleted && has_db_entry) {
1958 metadata.set_resource_id(std::string()); 1939 metadata.set_resource_id(std::string());
1959 metadata_store_->UpdateEntry(url, metadata, 1940 metadata_store_->UpdateEntry(url, metadata,
1960 base::Bind(&EmptyStatusCallback)); 1941 base::Bind(&EmptyStatusCallback));
1961 } 1942 }
1962 1943
1963 // Do not return in this block. These changes should be done together. 1944 // Do not return in this block. These changes should be done together.
1964 { 1945 {
1965 if (overridden_queue_item != pending_changes_.end()) 1946 if (overridden_queue_item != pending_changes_.end())
1966 pending_changes_.erase(overridden_queue_item); 1947 pending_changes_.erase(overridden_queue_item);
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
2358 pending_batch_sync_origins_.insert(origin); 2339 pending_batch_sync_origins_.insert(origin);
2359 } 2340 }
2360 callback.Run(status, resource_id); 2341 callback.Run(status, resource_id);
2361 } 2342 }
2362 2343
2363 std::string DriveFileSyncService::sync_root_resource_id() { 2344 std::string DriveFileSyncService::sync_root_resource_id() {
2364 return metadata_store_->sync_root_directory(); 2345 return metadata_store_->sync_root_directory();
2365 } 2346 }
2366 2347
2367 } // namespace sync_file_system 2348 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698