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 |