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

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

Issue 15023022: Add to be fetched files instead of DriveMetadataStore.batch_sync_origins_ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tzik review #1 Created 7 years, 7 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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 }
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
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(std::make_pair(
554 origin, metadata_store_->disabled_origins().find(origin)->second));
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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
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.
705 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); 697 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback));
706 pending_batch_sync_origins_.insert(origin); 698 pending_batch_sync_origins_.insert(std::make_pair(
699 origin, metadata_store_->disabled_origins().find(origin)->second));
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_.find(origin)->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
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
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 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 return SYNC_STATUS_AUTHENTICATION_FAILED; 1945 return SYNC_STATUS_AUTHENTICATION_FAILED;
1941 return status; 1946 return status;
1942 } 1947 }
1943 1948
1944 void DriveFileSyncService::MaybeStartFetchChanges() { 1949 void DriveFileSyncService::MaybeStartFetchChanges() {
1945 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) 1950 if (GetCurrentState() == REMOTE_SERVICE_DISABLED)
1946 return; 1951 return;
1947 1952
1948 // If we have pending_batch_sync_origins, try starting the batch sync. 1953 // If we have pending_batch_sync_origins, try starting the batch sync.
1949 if (!pending_batch_sync_origins_.empty()) { 1954 if (!pending_batch_sync_origins_.empty()) {
1950 if (GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_) { 1955 if (GetCurrentState() != REMOTE_SERVICE_OK && !may_have_unfetched_changes_)
1951 task_manager_->ScheduleTaskIfIdle( 1956 return;
tzik 2013/05/17 05:29:36 This part changes the behavior: new code doesn't r
calvinlo 2013/05/17 08:02:20 Thanks for catching this. Sorry, I didn't notice t
1952 base::Bind(&DriveFileSyncService::StartBatchSync, AsWeakPtr())); 1957
1953 } 1958 task_manager_->ScheduleTaskIfIdle(
1954 return; 1959 base::Bind(&DriveFileSyncService::StartBatchSync, AsWeakPtr()));
1955 } 1960 }
1956 1961
1957 if (may_have_unfetched_changes_ && 1962 if (may_have_unfetched_changes_ &&
1958 !metadata_store_->incremental_sync_origins().empty()) { 1963 !metadata_store_->incremental_sync_origins().empty()) {
1959 task_manager_->ScheduleTaskIfIdle( 1964 task_manager_->ScheduleTaskIfIdle(
1960 base::Bind(&DriveFileSyncService::FetchChangesForIncrementalSync, 1965 base::Bind(&DriveFileSyncService::FetchChangesForIncrementalSync,
1961 AsWeakPtr())); 1966 AsWeakPtr()));
1962 } 1967 }
1963 } 1968 }
1964 1969
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
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));
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698