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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 428 callback.Run(status); | 428 callback.Run(status); |
| 429 return; | 429 return; |
| 430 } | 430 } |
| 431 | 431 |
| 432 DCHECK(pending_batch_sync_origins_.empty()); | 432 DCHECK(pending_batch_sync_origins_.empty()); |
| 433 | 433 |
| 434 UpdateRegisteredOrigins(); | 434 UpdateRegisteredOrigins(); |
| 435 | 435 |
| 436 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 436 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
| 437 | 437 |
| 438 // Mark all the batch sync origins as 'pending' so that we can start | |
| 439 // batch sync when we're ready. | |
| 440 for (std::map<GURL, std::string>::const_iterator itr = | |
| 441 metadata_store_->batch_sync_origins().begin(); | |
| 442 itr != metadata_store_->batch_sync_origins().end(); | |
| 443 ++itr) { | |
| 444 pending_batch_sync_origins_.insert(itr->first); | |
| 445 } | |
|
kinuko
2013/05/20 02:42:08
Drive-by question (probaby to tzik): when are we a
calvinlo
2013/05/20 03:53:14
I'm not sure I understand your question. If you're
kinuko
2013/05/20 04:06:22
I think I'm asking about the latter case, and my p
tzik
2013/05/20 04:27:59
Right, if a origin is already registered as a Batc
calvinlo
2013/05/20 04:31:54
It should get added back at line 753. Line 752 sho
kinuko
2013/05/20 04:41:47
For a fresh install it should work, but Chrome can
| |
| 446 | |
| 447 DriveMetadataStore::URLAndDriveMetadataList to_be_fetched_files; | 438 DriveMetadataStore::URLAndDriveMetadataList to_be_fetched_files; |
| 448 status = metadata_store_->GetToBeFetchedFiles(&to_be_fetched_files); | 439 status = metadata_store_->GetToBeFetchedFiles(&to_be_fetched_files); |
| 449 DCHECK_EQ(SYNC_STATUS_OK, status); | 440 DCHECK_EQ(SYNC_STATUS_OK, status); |
| 450 typedef DriveMetadataStore::URLAndDriveMetadataList::const_iterator iterator; | 441 typedef DriveMetadataStore::URLAndDriveMetadataList::const_iterator iterator; |
| 451 for (iterator itr = to_be_fetched_files.begin(); | 442 for (iterator itr = to_be_fetched_files.begin(); |
| 452 itr != to_be_fetched_files.end(); ++itr) { | 443 itr != to_be_fetched_files.end(); ++itr) { |
| 453 const FileSystemURL& url = itr->first; | 444 const FileSystemURL& url = itr->first; |
| 454 const DriveMetadata& metadata = itr->second; | 445 const DriveMetadata& metadata = itr->second; |
| 455 const std::string& resource_id = metadata.resource_id(); | 446 const std::string& resource_id = metadata.resource_id(); |
| 456 | 447 |
| 457 SyncFileType file_type = SYNC_FILE_TYPE_FILE; | 448 SyncFileType file_type = SYNC_FILE_TYPE_FILE; |
| 458 if (metadata.type() == DriveMetadata::RESOURCE_TYPE_FOLDER) | 449 if (metadata.type() == DriveMetadata::RESOURCE_TYPE_FOLDER) |
| 459 file_type = SYNC_FILE_TYPE_DIRECTORY; | 450 file_type = SYNC_FILE_TYPE_DIRECTORY; |
| 460 AppendFetchChange(url.origin(), url.path(), resource_id, file_type); | 451 AppendFetchChange(url.origin(), url.path(), resource_id, file_type); |
|
tzik
2013/05/20 04:27:59
Could you add a check to ensure the origin() is in
calvinlo
2013/05/20 13:48:58
Done.
| |
| 461 } | 452 } |
| 462 | 453 |
| 463 if (!sync_root_resource_id().empty()) | 454 if (!sync_root_resource_id().empty()) |
| 464 api_util_->EnsureSyncRootIsNotInMyDrive(sync_root_resource_id()); | 455 api_util_->EnsureSyncRootIsNotInMyDrive(sync_root_resource_id()); |
| 465 | 456 |
| 466 callback.Run(status); | 457 callback.Run(status); |
| 467 may_have_unfetched_changes_ = true; | 458 may_have_unfetched_changes_ = true; |
| 468 | 459 |
| 469 google_apis::DriveNotificationManager* drive_notification_manager = | 460 google_apis::DriveNotificationManager* drive_notification_manager = |
| 470 google_apis::DriveNotificationManagerFactory::GetForProfile(profile_); | 461 google_apis::DriveNotificationManagerFactory::GetForProfile(profile_); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 | 543 |
| 553 void DriveFileSyncService::DoEnableOriginForTrackingChanges( | 544 void DriveFileSyncService::DoEnableOriginForTrackingChanges( |
| 554 const GURL& origin, | 545 const GURL& origin, |
| 555 const SyncStatusCallback& callback) { | 546 const SyncStatusCallback& callback) { |
| 556 if (!metadata_store_->IsOriginDisabled(origin)) { | 547 if (!metadata_store_->IsOriginDisabled(origin)) { |
| 557 callback.Run(SYNC_STATUS_OK); | 548 callback.Run(SYNC_STATUS_OK); |
| 558 return; | 549 return; |
| 559 } | 550 } |
| 560 | 551 |
| 561 metadata_store_->EnableOrigin(origin, callback); | 552 metadata_store_->EnableOrigin(origin, callback); |
| 562 pending_batch_sync_origins_.insert(origin); | 553 pending_batch_sync_origins_.insert( |
| 554 *metadata_store_->disabled_origins().find(origin)); | |
| 563 } | 555 } |
| 564 | 556 |
| 565 void DriveFileSyncService::DoDisableOriginForTrackingChanges( | 557 void DriveFileSyncService::DoDisableOriginForTrackingChanges( |
| 566 const GURL& origin, | 558 const GURL& origin, |
| 567 const SyncStatusCallback& callback) { | 559 const SyncStatusCallback& callback) { |
| 568 if (!metadata_store_->IsBatchSyncOrigin(origin) && | 560 if (!metadata_store_->IsBatchSyncOrigin(origin) && |
| 569 !metadata_store_->IsIncrementalSyncOrigin(origin)) { | 561 !metadata_store_->IsIncrementalSyncOrigin(origin)) { |
| 570 callback.Run(SYNC_STATUS_OK); | 562 callback.Run(SYNC_STATUS_OK); |
| 571 return; | 563 return; |
| 572 } | 564 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 695 // Extension has been uninstalled. | 687 // Extension has been uninstalled. |
| 696 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); | 688 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 697 } else if ((metadata_store_->IsBatchSyncOrigin(origin) || | 689 } else if ((metadata_store_->IsBatchSyncOrigin(origin) || |
| 698 metadata_store_->IsIncrementalSyncOrigin(origin)) && | 690 metadata_store_->IsIncrementalSyncOrigin(origin)) && |
| 699 !extension_service->IsExtensionEnabled(extension_id)) { | 691 !extension_service->IsExtensionEnabled(extension_id)) { |
| 700 // Extension has been disabled. | 692 // Extension has been disabled. |
| 701 metadata_store_->DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 693 metadata_store_->DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 702 } else if (metadata_store_->IsOriginDisabled(origin) && | 694 } else if (metadata_store_->IsOriginDisabled(origin) && |
| 703 extension_service->IsExtensionEnabled(extension_id)) { | 695 extension_service->IsExtensionEnabled(extension_id)) { |
| 704 // Extension has been re-enabled. | 696 // Extension has been re-enabled. |
| 697 pending_batch_sync_origins_.insert( | |
| 698 *metadata_store_->disabled_origins().find(origin)); | |
| 705 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 699 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 706 pending_batch_sync_origins_.insert(origin); | |
| 707 } | 700 } |
| 708 } | 701 } |
| 709 } | 702 } |
| 710 | 703 |
| 711 void DriveFileSyncService::StartBatchSync( | 704 void DriveFileSyncService::StartBatchSync( |
| 712 const SyncStatusCallback& callback) { | 705 const SyncStatusCallback& callback) { |
| 713 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); | 706 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); |
| 707 DCHECK(!pending_batch_sync_origins_.empty()); | |
| 714 | 708 |
| 715 if (pending_batch_sync_origins_.empty()) { | 709 GURL origin = pending_batch_sync_origins_.begin()->first; |
| 716 callback.Run(SYNC_STATUS_OK); | 710 std::string resource_id = pending_batch_sync_origins_.begin()->second; |
| 717 return; | 711 DCHECK(!resource_id.empty()); |
| 718 } | |
| 719 | |
| 720 GURL origin = *pending_batch_sync_origins_.begin(); | |
| 721 pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin()); | 712 pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin()); |
| 722 std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin); | |
| 723 DCHECK(!resource_id.empty()); | |
| 724 | 713 |
| 725 DCHECK(!metadata_store_->IsOriginDisabled(origin)); | 714 DCHECK(!metadata_store_->IsOriginDisabled(origin)); |
| 726 | 715 |
| 727 DVLOG(1) << "Start batch sync for:" << origin.spec(); | 716 DVLOG(1) << "Start batch sync for:" << origin.spec(); |
| 728 | 717 |
| 729 api_util_->GetLargestChangeStamp( | 718 api_util_->GetLargestChangeStamp( |
| 730 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, | 719 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, |
| 731 AsWeakPtr(), | 720 AsWeakPtr(), |
| 732 callback, | 721 callback, |
| 733 origin, | 722 origin, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 751 AsWeakPtr(), origin, callback)); | 740 AsWeakPtr(), origin, callback)); |
| 752 return; | 741 return; |
| 753 } | 742 } |
| 754 | 743 |
| 755 if (status != SYNC_STATUS_OK) { | 744 if (status != SYNC_STATUS_OK) { |
| 756 callback.Run(status); | 745 callback.Run(status); |
| 757 return; | 746 return; |
| 758 } | 747 } |
| 759 | 748 |
| 760 // Add this origin to batch sync origin if it hasn't been already. | 749 // Add this origin to batch sync origin if it hasn't been already. |
| 750 // TODO(calvinlo): Added files to file metadata mapping, this can be removed | |
| 751 // next when batch_sync_origins is removed from DriveMetadataStore. | |
| 761 if (!metadata_store_->IsKnownOrigin(origin)) { | 752 if (!metadata_store_->IsKnownOrigin(origin)) { |
| 762 metadata_store_->AddBatchSyncOrigin(origin, resource_id); | 753 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 763 pending_batch_sync_origins_.insert(origin); | |
| 764 } | 754 } |
| 765 | 755 |
| 766 callback.Run(SYNC_STATUS_OK); | 756 callback.Run(SYNC_STATUS_OK); |
| 767 } | 757 } |
| 768 | 758 |
| 769 void DriveFileSyncService::DidUninstallOrigin( | 759 void DriveFileSyncService::DidUninstallOrigin( |
| 770 const GURL& origin, | 760 const GURL& origin, |
| 771 const SyncStatusCallback& callback, | 761 const SyncStatusCallback& callback, |
| 772 google_apis::GDataErrorCode error) { | 762 google_apis::GDataErrorCode error) { |
| 773 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 763 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 774 if (status != SYNC_STATUS_OK) { | 764 if (status != SYNC_STATUS_OK) { |
| 775 callback.Run(status); | 765 callback.Run(status); |
| 776 return; | 766 return; |
| 777 } | 767 } |
| 778 | 768 |
| 779 // Origin directory has been removed so it's now safe to remove the origin | 769 // Origin directory has been removed so it's now safe to remove the origin |
| 780 // from the metadata store. | 770 // from the metadata store. |
| 781 DoUnregisterOriginForTrackingChanges(origin, callback); | 771 DoUnregisterOriginForTrackingChanges(origin, callback); |
| 782 } | 772 } |
| 783 | 773 |
| 784 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( | 774 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( |
| 785 const SyncStatusCallback& callback, | 775 const SyncStatusCallback& callback, |
| 786 const GURL& origin, | 776 const GURL& origin, |
| 787 const std::string& resource_id, | 777 const std::string& resource_id, |
| 788 google_apis::GDataErrorCode error, | 778 google_apis::GDataErrorCode error, |
| 789 int64 largest_changestamp) { | 779 int64 largest_changestamp) { |
| 790 if (error != google_apis::HTTP_SUCCESS) { | 780 if (error != google_apis::HTTP_SUCCESS) { |
| 791 pending_batch_sync_origins_.insert(origin); | 781 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 792 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); | 782 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
| 793 return; | 783 return; |
| 794 } | 784 } |
| 795 | 785 |
| 796 if (metadata_store_->incremental_sync_origins().empty()) { | 786 if (metadata_store_->incremental_sync_origins().empty()) { |
| 797 largest_fetched_changestamp_ = largest_changestamp; | 787 largest_fetched_changestamp_ = largest_changestamp; |
| 798 metadata_store_->SetLargestChangeStamp( | 788 metadata_store_->SetLargestChangeStamp( |
| 799 largest_changestamp, | 789 largest_changestamp, |
| 800 base::Bind(&EmptyStatusCallback)); | 790 base::Bind(&EmptyStatusCallback)); |
| 801 } | 791 } |
| 802 | 792 |
| 803 api_util_->ListFiles( | 793 api_util_->ListFiles( |
| 804 resource_id, | 794 resource_id, |
| 805 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 795 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
| 806 AsWeakPtr(), | 796 AsWeakPtr(), |
| 807 callback, | 797 callback, |
| 808 origin, | 798 origin, |
| 799 resource_id, | |
| 809 largest_changestamp)); | 800 largest_changestamp)); |
| 810 } | 801 } |
| 811 | 802 |
| 812 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( | 803 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( |
| 813 const SyncStatusCallback& callback, | 804 const SyncStatusCallback& callback, |
| 814 const GURL& origin, | 805 const GURL& origin, |
| 806 const std::string& resource_id, | |
| 815 int64 largest_changestamp, | 807 int64 largest_changestamp, |
| 816 google_apis::GDataErrorCode error, | 808 google_apis::GDataErrorCode error, |
| 817 scoped_ptr<google_apis::ResourceList> feed) { | 809 scoped_ptr<google_apis::ResourceList> feed) { |
| 818 if (error != google_apis::HTTP_SUCCESS) { | 810 if (error != google_apis::HTTP_SUCCESS) { |
| 819 pending_batch_sync_origins_.insert(origin); | 811 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 820 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); | 812 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
| 821 return; | 813 return; |
| 822 } | 814 } |
| 823 | 815 |
| 824 typedef ScopedVector<google_apis::ResourceEntry>::const_iterator iterator; | 816 typedef ScopedVector<google_apis::ResourceEntry>::const_iterator iterator; |
| 825 for (iterator itr = feed->entries().begin(); | 817 for (iterator itr = feed->entries().begin(); |
| 826 itr != feed->entries().end(); ++itr) { | 818 itr != feed->entries().end(); ++itr) { |
| 827 AppendRemoteChange(origin, **itr, largest_changestamp, | 819 const google_apis::ResourceEntry& entry = **itr; |
| 820 AppendRemoteChange(origin, entry, largest_changestamp, | |
| 828 RemoteChangeHandler::REMOTE_SYNC_TYPE_BATCH); | 821 RemoteChangeHandler::REMOTE_SYNC_TYPE_BATCH); |
| 822 | |
| 823 // Save to be fetched file to DB for restore in case of crash. | |
| 824 DriveMetadata metadata; | |
| 825 metadata.set_resource_id(entry.resource_id()); | |
| 826 metadata.set_md5_checksum(entry.file_md5()); | |
| 827 metadata.set_conflicted(false); | |
| 828 metadata.set_to_be_fetched(true); | |
| 829 | |
| 830 base::FilePath path = TitleToPath(entry.title()); | |
| 831 fileapi::FileSystemURL url(CreateSyncableFileSystemURL( | |
| 832 origin, kServiceName, path)); | |
| 833 metadata_store_->UpdateEntry(url, metadata, | |
| 834 base::Bind(&EmptyStatusCallback)); | |
| 829 } | 835 } |
| 830 | 836 |
|
tzik
2013/05/20 04:27:59
If Chrome crashed around here, the database will t
calvinlo
2013/05/20 13:48:58
Done.
| |
| 831 GURL next_feed_url; | 837 GURL next_feed_url; |
| 832 if (feed->GetNextFeedURL(&next_feed_url)) { | 838 if (feed->GetNextFeedURL(&next_feed_url)) { |
| 833 api_util_->ContinueListing( | 839 api_util_->ContinueListing( |
| 834 next_feed_url, | 840 next_feed_url, |
| 835 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 841 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
| 836 AsWeakPtr(), | 842 AsWeakPtr(), |
| 837 callback, | 843 callback, |
| 838 origin, | 844 origin, |
| 845 resource_id, | |
| 839 largest_changestamp)); | 846 largest_changestamp)); |
| 840 return; | 847 return; |
| 841 } | 848 } |
| 842 | 849 |
| 843 // Move |origin| to the incremental sync origin set if the origin has no file. | 850 // TODO(calvinlo): Eliminate batch_sync_origins so |
| 844 if (metadata_store_->IsBatchSyncOrigin(origin) && | 851 // MoveBatchSyncOriginToIncremental() happens directly. |
| 845 !remote_change_handler_.HasChangesForOrigin(origin)) { | 852 metadata_store_->AddBatchSyncOrigin(origin, resource_id); |
| 846 metadata_store_->MoveBatchSyncOriginToIncremental(origin); | 853 metadata_store_->MoveBatchSyncOriginToIncremental(origin); |
| 847 } | |
| 848 | |
| 849 may_have_unfetched_changes_ = true; | 854 may_have_unfetched_changes_ = true; |
| 850 callback.Run(SYNC_STATUS_OK); | 855 callback.Run(SYNC_STATUS_OK); |
| 851 } | 856 } |
| 852 | 857 |
| 853 void DriveFileSyncService::ApplyLocalChangeInternal( | 858 void DriveFileSyncService::ApplyLocalChangeInternal( |
| 854 scoped_ptr<ApplyLocalChangeParam> param, | 859 scoped_ptr<ApplyLocalChangeParam> param, |
| 855 SyncStatusCode status, | 860 SyncStatusCode status, |
| 856 const std::string& origin_resource_id) { | 861 const std::string& origin_resource_id) { |
| 857 if (status != SYNC_STATUS_OK) { | 862 if (status != SYNC_STATUS_OK) { |
| 858 param->callback.Run(status); | 863 param->callback.Run(status); |
| (...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2179 void DriveFileSyncService::DidEnsureOriginRoot( | 2184 void DriveFileSyncService::DidEnsureOriginRoot( |
| 2180 const GURL& origin, | 2185 const GURL& origin, |
| 2181 const ResourceIdCallback& callback, | 2186 const ResourceIdCallback& callback, |
| 2182 google_apis::GDataErrorCode error, | 2187 google_apis::GDataErrorCode error, |
| 2183 const std::string& resource_id) { | 2188 const std::string& resource_id) { |
| 2184 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 2189 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 2185 if (status == SYNC_STATUS_OK && | 2190 if (status == SYNC_STATUS_OK && |
| 2186 metadata_store_->IsKnownOrigin(origin)) { | 2191 metadata_store_->IsKnownOrigin(origin)) { |
| 2187 metadata_store_->SetOriginRootDirectory(origin, resource_id); | 2192 metadata_store_->SetOriginRootDirectory(origin, resource_id); |
| 2188 if (metadata_store_->IsBatchSyncOrigin(origin)) | 2193 if (metadata_store_->IsBatchSyncOrigin(origin)) |
| 2189 pending_batch_sync_origins_.insert(origin); | 2194 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
|
kinuko
2013/05/20 03:42:22
To me it looks we only (re-)add existing batch syn
| |
| 2190 } | 2195 } |
| 2191 callback.Run(status, resource_id); | 2196 callback.Run(status, resource_id); |
| 2192 } | 2197 } |
| 2193 | 2198 |
| 2194 std::string DriveFileSyncService::sync_root_resource_id() { | 2199 std::string DriveFileSyncService::sync_root_resource_id() { |
| 2195 return metadata_store_->sync_root_directory(); | 2200 return metadata_store_->sync_root_directory(); |
| 2196 } | 2201 } |
| 2197 | 2202 |
| 2198 } // namespace sync_file_system | 2203 } // namespace sync_file_system |
| OLD | NEW |