Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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(¶m))); | 1521 base::Passed(¶m))); |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |