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

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: 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
(...skipping 1485 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ") 1496 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ")
1497 << (missing_local_file ? " (missing local file)" : " ") 1497 << (missing_local_file ? " (missing local file)" : " ")
1498 << " remote_change: " << remote_file_change.DebugString() 1498 << " remote_change: " << remote_file_change.DebugString()
1499 << " ==> operation: " << operation; 1499 << " ==> operation: " << operation;
1500 1500
1501 switch (operation) { 1501 switch (operation) {
1502 case REMOTE_SYNC_OPERATION_ADD_FILE: 1502 case REMOTE_SYNC_OPERATION_ADD_FILE:
1503 param->sync_action = SYNC_ACTION_ADDED; 1503 param->sync_action = SYNC_ACTION_ADDED;
1504 DownloadForRemoteSync(param.Pass()); 1504 DownloadForRemoteSync(param.Pass());
1505 return; 1505 return;
1506 case REMOTE_SYNC_OPERATION_ADD_DIRECTORY:
1507 // TODO(nhiroki): support directory operations (http://crbug.com/161442).
1508 NOTIMPLEMENTED();
1509 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1510 return;
1506 case REMOTE_SYNC_OPERATION_UPDATE_FILE: 1511 case REMOTE_SYNC_OPERATION_UPDATE_FILE:
1507 param->sync_action = SYNC_ACTION_UPDATED; 1512 param->sync_action = SYNC_ACTION_UPDATED;
1508 DownloadForRemoteSync(param.Pass()); 1513 DownloadForRemoteSync(param.Pass());
1509 return; 1514 return;
1510 case REMOTE_SYNC_OPERATION_DELETE_FILE: { 1515 case REMOTE_SYNC_OPERATION_DELETE_FILE: {
1511 param->sync_action = SYNC_ACTION_DELETED; 1516 param->sync_action = SYNC_ACTION_DELETED;
1512 const FileChange& file_change = remote_file_change; 1517 const FileChange& file_change = remote_file_change;
1513 remote_change_processor_->ApplyRemoteChange( 1518 remote_change_processor_->ApplyRemoteChange(
1514 file_change, base::FilePath(), url, 1519 file_change, base::FilePath(), url,
1515 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(), 1520 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(),
1516 base::Passed(&param))); 1521 base::Passed(&param)));
1517 return; 1522 return;
1518 } 1523 }
1524 case REMOTE_SYNC_OPERATION_DELETE_DIRECTORY:
1525 // TODO(nhiroki): support directory operations (http://crbug.com/161442).
1526 NOTIMPLEMENTED();
1527 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1528 return;
1519 case REMOTE_SYNC_OPERATION_NONE: 1529 case REMOTE_SYNC_OPERATION_NONE:
1520 param->sync_action = SYNC_ACTION_NONE; 1530 param->sync_action = SYNC_ACTION_NONE;
1521 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); 1531 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK);
1522 return; 1532 return;
1523 case REMOTE_SYNC_OPERATION_CONFLICT: 1533 case REMOTE_SYNC_OPERATION_CONFLICT:
1524 HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK); 1534 HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK);
1525 return; 1535 return;
1526 case REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL: 1536 case REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL:
1527 ResolveConflictToLocalForRemoteSync(param.Pass()); 1537 ResolveConflictToLocalForRemoteSync(param.Pass());
1528 return; 1538 return;
(...skipping 20 matching lines...) Expand all
1549 } 1559 }
1550 NOTREACHED(); 1560 NOTREACHED();
1551 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); 1561 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
1552 } 1562 }
1553 1563
1554 DriveFileSyncService::RemoteSyncOperationType 1564 DriveFileSyncService::RemoteSyncOperationType
1555 DriveFileSyncService::ResolveRemoteSyncOperationType( 1565 DriveFileSyncService::ResolveRemoteSyncOperationType(
1556 const FileChange& remote_file_change, 1566 const FileChange& remote_file_change,
1557 ProcessRemoteChangeParam* param, 1567 ProcessRemoteChangeParam* param,
1558 const FileChangeList& local_changes, 1568 const FileChangeList& local_changes,
1559 bool missing_local_file) { 1569 bool missing_local_file) {
kinuko 2013/04/24 02:32:32 It looks this doesn't need entire ProcessRemoteCha
kinuko 2013/04/24 02:42:29 If this takes too much your time it'd be still nic
nhiroki 2013/04/24 13:29:05 Done.
1560 if (param->drive_metadata.conflicted()) { 1570 SyncFileType local_file_type = param->local_metadata.file_type;
1561 switch (remote_file_change.change()) { 1571
1562 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: 1572 if (remote_file_change.IsAddOrUpdateFile()) {
1563 return missing_local_file ? REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE 1573 if (param->drive_metadata.conflicted()) {
1564 : REMOTE_SYNC_OPERATION_CONFLICT; 1574 //
1565 case FileChange::FILE_CHANGE_DELETE: 1575 // (LocalFile) + (LocalChange) -> (OperationType)
1566 return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA 1576 // None + Delete -> RESOLVE_TO_REMOTE
1567 : REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; 1577 // File + None/AddOrUpdateFile -> CONFLICT
1568 } 1578 // Dir + None/AddDir -> RESOLVE_TO_LOCAL
1569 } 1579 //
1570 1580 switch (local_file_type) {
1571 if (remote_file_change.IsAddOrUpdate()) { 1581 case SYNC_FILE_TYPE_UNKNOWN:
1572 if (local_changes.empty()) 1582 DCHECK(!local_changes.empty() &&
1573 return missing_local_file ? REMOTE_SYNC_OPERATION_ADD_FILE 1583 local_changes.list().back().IsDelete());
1574 : REMOTE_SYNC_OPERATION_UPDATE_FILE; 1584 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
1575 switch (local_changes.list().back().change()) { 1585 case SYNC_FILE_TYPE_FILE:
1576 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: 1586 DCHECK(local_changes.empty() ||
1587 local_changes.list().back().IsAddOrUpdateFile());
1588 return REMOTE_SYNC_OPERATION_CONFLICT;
1589 case SYNC_FILE_TYPE_DIRECTORY:
1590 DCHECK(local_changes.empty() ||
1591 local_changes.list().back().IsAddDirectory());
1592 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1593 }
1594 }
1595
1596 //
1597 // (LocalFile) + (LocalChange) -> (OperationType)
1598 // None + None/Delete -> ADD_FILE
1599 // File + None -> UPDATE_FILE
1600 // File + AddOrUpdateFile -> CONFLICT
1601 // Dir + None/AddDir -> RESOLVE_TO_LOCAL
1602 //
1603 switch (local_file_type) {
1604 case SYNC_FILE_TYPE_UNKNOWN:
1605 DCHECK(local_changes.empty() || local_changes.list().back().IsDelete());
1606 return REMOTE_SYNC_OPERATION_ADD_FILE;
1607 case SYNC_FILE_TYPE_FILE:
1608 if (local_changes.empty())
1609 return REMOTE_SYNC_OPERATION_UPDATE_FILE;
1610 DCHECK(local_changes.list().back().IsAddOrUpdateFile());
1577 return REMOTE_SYNC_OPERATION_CONFLICT; 1611 return REMOTE_SYNC_OPERATION_CONFLICT;
1578 case FileChange::FILE_CHANGE_DELETE: 1612 case SYNC_FILE_TYPE_DIRECTORY:
1579 return REMOTE_SYNC_OPERATION_ADD_FILE; 1613 DCHECK(local_changes.empty() ||
1580 } 1614 local_changes.list().back().IsAddDirectory());
1581 } 1615 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1582 1616 }
1583 DCHECK(remote_file_change.IsDelete()); 1617 }
1584 if (local_changes.empty()) 1618
1585 return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA 1619 if (remote_file_change.IsDeleteFile()) {
1586 : REMOTE_SYNC_OPERATION_DELETE_FILE; 1620 if (param->drive_metadata.conflicted()) {
1587 switch (local_changes.list().back().change()) { 1621 //
1588 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: 1622 // (LocalFile) + (LocalChange) -> (OperationType)
1589 return REMOTE_SYNC_OPERATION_NONE; 1623 // None + * -> DELETE_METADATA
1590 case FileChange::FILE_CHANGE_DELETE: 1624 // File + None/AddOrUpdateFile -> RESOLVE_TO_LOCAL
1591 return REMOTE_SYNC_OPERATION_DELETE_METADATA; 1625 // Dir + None/AddDir -> RESOLVE_TO_LOCAL
1592 } 1626 //
1593 NOTREACHED(); 1627 switch (local_file_type) {
1594 return REMOTE_SYNC_OPERATION_FAIL; 1628 case SYNC_FILE_TYPE_UNKNOWN:
1629 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
1630 case SYNC_FILE_TYPE_FILE:
1631 DCHECK(local_changes.empty() ||
1632 local_changes.list().back().IsAddOrUpdateFile());
1633 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1634 case SYNC_FILE_TYPE_DIRECTORY:
1635 DCHECK(local_changes.empty() ||
1636 local_changes.list().back().IsAddDirectory());
1637 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1638 }
1639 }
1640
1641 //
1642 // (LocalFile) + (LocalChange) -> (OperationType)
1643 // None + * -> DELETE_METADATA
1644 // File + None -> DELETE_FILE
1645 // File + AddOrUpdateFile -> NONE
1646 // Dir + None/AddDirectory -> NONE
1647 //
1648 switch (local_file_type) {
1649 case SYNC_FILE_TYPE_UNKNOWN:
1650 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
1651 case SYNC_FILE_TYPE_FILE:
1652 if (local_changes.empty())
1653 return REMOTE_SYNC_OPERATION_DELETE_FILE;
1654 DCHECK(local_changes.list().back().IsAddOrUpdateFile());
1655 return REMOTE_SYNC_OPERATION_NONE;
1656 case SYNC_FILE_TYPE_DIRECTORY:
1657 DCHECK(local_changes.empty() ||
1658 local_changes.list().back().IsAddDirectory());
1659 return REMOTE_SYNC_OPERATION_NONE;
1660 }
1661 }
1662
1663 if (remote_file_change.IsAddDirectory()) {
1664 if (param->drive_metadata.conflicted()) {
1665 //
1666 // (LocalFile) + (LocalChange) -> (OperationType)
1667 // None + Delete -> RESOLVE_TO_REMOTE
1668 // File + None/AddOrUpdateFile -> RESOLVE_TO_REMOTE
1669 // Dir + AddDir -> RESOLVE_TO_LOCAL
1670 //
1671 switch (local_file_type) {
1672 case SYNC_FILE_TYPE_UNKNOWN:
1673 if (!local_changes.empty() && local_changes.list().back().IsDelete())
1674 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
1675 break;
1676 case SYNC_FILE_TYPE_FILE:
1677 if (local_changes.empty())
1678 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
1679 if (local_changes.list().back().IsAddDirectory())
1680 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
1681 break;
1682 case SYNC_FILE_TYPE_DIRECTORY:
1683 if (!local_changes.empty() &&
1684 local_changes.list().back().IsAddDirectory())
1685 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1686 break;
1687 }
1688 NOTREACHED();
1689 return REMOTE_SYNC_OPERATION_FAIL;
1690 }
1691
1692 //
1693 // (LocalFile) + (LocalChange) -> (OperationType)
1694 // None + None -> ADD_DIR
1695 // None + Delete -> RESOLVE_TO_REMOTE
1696 // File + None/AddOrUpdateFile -> RESOLVE_TO_REMOTE
1697 // Dir + None/AddDir -> NONE
1698 //
1699 switch (local_file_type) {
1700 case SYNC_FILE_TYPE_UNKNOWN:
1701 if (local_changes.empty())
1702 return REMOTE_SYNC_OPERATION_ADD_DIRECTORY;
1703 DCHECK(local_changes.list().back().IsDelete());
1704 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
1705 case SYNC_FILE_TYPE_FILE:
1706 DCHECK(local_changes.empty() ||
1707 local_changes.list().back().IsAddOrUpdateFile());
1708 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
1709 case SYNC_FILE_TYPE_DIRECTORY:
1710 DCHECK(local_changes.empty() ||
1711 local_changes.list().back().IsAddDirectory());
1712 return REMOTE_SYNC_OPERATION_NONE;
1713 }
1714 NOTREACHED();
1715 return REMOTE_SYNC_OPERATION_FAIL;
1716 }
1717
1718 if (remote_file_change.IsDeleteDirectory()) {
1719 if (param->drive_metadata.conflicted()) {
1720 //
1721 // (LocalFile) + (LocalChange) -> (OperationType)
1722 // None + * -> DELETE_METADATA
1723 // File + None/AddOrUpdateFile -> RESOLVE_TO_LOCAL
1724 // Dir + None -> DELETE_DIRECTORY
1725 // Dir + AddDir -> RESOLVE_TO_LOCAL
1726 //
1727 switch (local_file_type) {
1728 case SYNC_FILE_TYPE_UNKNOWN:
1729 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
1730 case SYNC_FILE_TYPE_FILE:
1731 DCHECK(local_changes.empty() ||
1732 local_changes.list().back().IsAddOrUpdateFile());
1733 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1734 case SYNC_FILE_TYPE_DIRECTORY:
1735 DCHECK(local_changes.empty() ||
1736 local_changes.list().back().IsAddDirectory());
1737 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1738 }
1739 }
1740
1741 //
1742 // (LocalFile) + (LocalChange) -> (OperationType)
1743 // None + None/Delete -> NONE
1744 // File + None/AddOrUpdateFile -> RESOLVE_TO_LOCAL
1745 // Dir + None -> DELETE_DIRECTORY
1746 // Dir + AddDir -> RESOLVE_TO_LOCAL
1747 //
1748 switch (local_file_type) {
1749 case SYNC_FILE_TYPE_UNKNOWN:
1750 DCHECK(local_changes.empty() ||
1751 local_changes.list().back().IsDelete());
1752 return REMOTE_SYNC_OPERATION_NONE;
1753 case SYNC_FILE_TYPE_FILE:
1754 DCHECK(local_changes.empty() ||
1755 local_changes.list().back().IsAddOrUpdateFile());
1756 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1757 case SYNC_FILE_TYPE_DIRECTORY:
1758 if (local_changes.empty())
1759 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY;
1760 DCHECK(local_changes.list().back().IsAddDirectory());
1761 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
1762 }
1763 }
1764
1765 DCHECK(remote_file_change.IsTypeUnknown());
1766 return REMOTE_SYNC_OPERATION_NONE;
1595 } 1767 }
1596 1768
1597 void DriveFileSyncService::DidResolveConflictToLocalChange( 1769 void DriveFileSyncService::DidResolveConflictToLocalChange(
1598 scoped_ptr<ProcessRemoteChangeParam> param, 1770 scoped_ptr<ProcessRemoteChangeParam> param,
1599 SyncStatusCode status) { 1771 SyncStatusCode status) {
1600 if (status != SYNC_STATUS_OK) { 1772 if (status != SYNC_STATUS_OK) {
1601 DCHECK_NE(SYNC_STATUS_HAS_CONFLICT, status); 1773 DCHECK_NE(SYNC_STATUS_HAS_CONFLICT, status);
1602 AbortRemoteSync(param.Pass(), status); 1774 AbortRemoteSync(param.Pass(), status);
1603 return; 1775 return;
1604 } 1776 }
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
1947 return false; 2119 return false;
1948 2120
1949 // Drop any change if the change has unknown resource id. 2121 // Drop any change if the change has unknown resource id.
1950 if (!remote_resource_id.empty() && 2122 if (!remote_resource_id.empty() &&
1951 !local_resource_id.empty() && 2123 !local_resource_id.empty() &&
1952 remote_resource_id != local_resource_id) 2124 remote_resource_id != local_resource_id)
1953 return false; 2125 return false;
1954 2126
1955 FileChange file_change(CreateFileChange(is_deleted)); 2127 FileChange file_change(CreateFileChange(is_deleted));
1956 2128
2129 if (is_deleted) {
2130 // Determine a file type of the deleted change by local metadata.
2131 if (!remote_resource_id.empty() &&
2132 !local_resource_id.empty() &&
2133 remote_resource_id == local_resource_id) {
2134 DCHECK_EQ(DriveMetadata::RESOURCE_TYPE_FILE, metadata.type());
2135 file_change = FileChange(FileChange::FILE_CHANGE_DELETE,
2136 SYNC_FILE_TYPE_FILE);
2137 }
2138 }
2139
1957 if (is_deleted && has_db_entry) { 2140 if (is_deleted && has_db_entry) {
1958 metadata.set_resource_id(std::string()); 2141 metadata.set_resource_id(std::string());
1959 metadata_store_->UpdateEntry(url, metadata, 2142 metadata_store_->UpdateEntry(url, metadata,
1960 base::Bind(&EmptyStatusCallback)); 2143 base::Bind(&EmptyStatusCallback));
1961 } 2144 }
1962 2145
1963 // Do not return in this block. These changes should be done together. 2146 // Do not return in this block. These changes should be done together.
1964 { 2147 {
1965 if (overridden_queue_item != pending_changes_.end()) 2148 if (overridden_queue_item != pending_changes_.end())
1966 pending_changes_.erase(overridden_queue_item); 2149 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); 2541 pending_batch_sync_origins_.insert(origin);
2359 } 2542 }
2360 callback.Run(status, resource_id); 2543 callback.Run(status, resource_id);
2361 } 2544 }
2362 2545
2363 std::string DriveFileSyncService::sync_root_resource_id() { 2546 std::string DriveFileSyncService::sync_root_resource_id() {
2364 return metadata_store_->sync_root_directory(); 2547 return metadata_store_->sync_root_directory();
2365 } 2548 }
2366 2549
2367 } // namespace sync_file_system 2550 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698