diff options
author | achuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-16 05:31:51 +0000 |
---|---|---|
committer | achuith@chromium.org <achuith@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-16 05:31:51 +0000 |
commit | fbbddb41c2365add19335b9d1d25900ae80e54c7 (patch) | |
tree | e723bd1db5c76dc86925fa4703134bbd0007a56f | |
parent | 7b8852c25003b07434ba027122ff2d3bb3c325f3 (diff) | |
download | chromium_src-fbbddb41c2365add19335b9d1d25900ae80e54c7.zip chromium_src-fbbddb41c2365add19335b9d1d25900ae80e54c7.tar.gz chromium_src-fbbddb41c2365add19335b9d1d25900ae80e54c7.tar.bz2 |
Make largest_changestamp setter/getter asynchronous.
BUG=147299
TEST=unit tests
Review URL: https://chromiumcodereview.appspot.com/11876002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177091 0039d316-1c4b-4281-b951-d872f2087c98
11 files changed, 150 insertions, 25 deletions
diff --git a/chrome/browser/chromeos/drive/drive_feed_loader.cc b/chrome/browser/chromeos/drive/drive_feed_loader.cc index 8c73be6..b428eee 100644 --- a/chrome/browser/chromeos/drive/drive_feed_loader.cc +++ b/chrome/browser/chromeos/drive/drive_feed_loader.cc @@ -256,9 +256,6 @@ void DriveFeedLoader::ReloadFromServerIfNeeded( const FileOperationCallback& callback) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!callback.is_null()); - DVLOG(1) << "ReloadFromServerIfNeeded local_changestamp=" - << resource_metadata_->largest_changestamp() - << ", loaded=" << resource_metadata_->loaded(); // Sets the refreshing flag, so that the caller does not send refresh requests // in parallel (see DriveFileSystem::CheckForUpdates). Corresponding @@ -291,9 +288,7 @@ void DriveFeedLoader::OnGetAccountMetadata( DCHECK(!callback.is_null()); DCHECK(refreshing_); - int64 local_changestamp = resource_metadata_->largest_changestamp(); int64 remote_changestamp = 0; - // When account metadata successfully fetched, parse the latest changestamp. if (util::GDataToDriveFileError(status) == DRIVE_FILE_OK) { DCHECK(account_metadata); @@ -301,6 +296,21 @@ void DriveFeedLoader::OnGetAccountMetadata( remote_changestamp = account_metadata->largest_changestamp(); } + resource_metadata_->GetLargestChangestamp( + base::Bind(&DriveFeedLoader::CompareChangestampsAndLoadIfNeeded, + weak_ptr_factory_.GetWeakPtr(), + callback, + remote_changestamp)); +} + +void DriveFeedLoader::CompareChangestampsAndLoadIfNeeded( + const FileOperationCallback& callback, + int64 remote_changestamp, + int64 local_changestamp) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + DCHECK(refreshing_); + if (remote_changestamp > 0 && local_changestamp >= remote_changestamp) { if (local_changestamp > remote_changestamp) { LOG(WARNING) << "Cached client feed is fresher than server, client = " diff --git a/chrome/browser/chromeos/drive/drive_feed_loader.h b/chrome/browser/chromeos/drive/drive_feed_loader.h index 95d986a..9292f07 100644 --- a/chrome/browser/chromeos/drive/drive_feed_loader.h +++ b/chrome/browser/chromeos/drive/drive_feed_loader.h @@ -119,6 +119,14 @@ class DriveFeedLoader { google_apis::GDataErrorCode status, scoped_ptr<google_apis::AccountMetadataFeed> account_metadata); + // Callback for DriveResourceMetadata::GetLargestChangestamp. + // Compares |remote_changestamp| and |local_changestamp| and triggers + // LoadFromServer if necessary. + void CompareChangestampsAndLoadIfNeeded( + const FileOperationCallback& callback, + int64 remote_changestamp, + int64 local_changestamp); + // Callback for handling response from |DriveAPIService::GetApplicationInfo|. // If the application list is successfully parsed, passes the list to // Drive webapps registry. diff --git a/chrome/browser/chromeos/drive/drive_feed_processor.cc b/chrome/browser/chromeos/drive/drive_feed_processor.cc index b2c2915..22746ea 100644 --- a/chrome/browser/chromeos/drive/drive_feed_processor.cc +++ b/chrome/browser/chromeos/drive/drive_feed_processor.cc @@ -17,6 +17,21 @@ using content::BrowserThread; namespace drive { +namespace { + +// Callback for DriveResourceMetadata::SetLargestChangestamp. +// Runs |on_complete_callback|. |on_complete_callback| must not be null. +void RunOnCompleteCallback(const base::Closure& on_complete_callback, + DriveFileError error) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!on_complete_callback.is_null()); + DCHECK_EQ(DRIVE_FILE_OK, error); + + on_complete_callback.Run(); +} + +} // namespace + class DriveFeedProcessor::FeedToEntryProtoMapUMAStats { public: FeedToEntryProtoMapUMAStats() @@ -382,11 +397,11 @@ void DriveFeedProcessor::OnUpdateRootUploadUrl( void DriveFeedProcessor::OnComplete() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(!on_complete_callback_.is_null()); resource_metadata_->set_loaded(true); - resource_metadata_->set_largest_changestamp(largest_changestamp_); - on_complete_callback_.Run(); + resource_metadata_->SetLargestChangestamp( + largest_changestamp_, + base::Bind(&RunOnCompleteCallback, on_complete_callback_)); } void DriveFeedProcessor::Clear() { diff --git a/chrome/browser/chromeos/drive/drive_file_system.cc b/chrome/browser/chromeos/drive/drive_file_system.cc index 4e4b6d4..a7953da 100644 --- a/chrome/browser/chromeos/drive/drive_file_system.cc +++ b/chrome/browser/chromeos/drive/drive_file_system.cc @@ -153,6 +153,19 @@ void RunGetEntryInfoWithFilePathCallback( callback.Run(error, path, entry_proto.Pass()); } +// Callback for DriveResourceMetadata::GetLargestChangestamp. +// |callback| must not be null. +void OnGetLargestChangestamp( + DriveFileSystemMetadata metadata, // Will be modified. + const GetFilesystemMetadataCallback& callback, + int64 largest_changestamp) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + + metadata.largest_changestamp = largest_changestamp; + callback.Run(metadata); +} + } // namespace // DriveFileSystem::FindFirstMissingParentDirectoryParams implementation. @@ -1781,9 +1794,12 @@ void DriveFileSystem::AddUploadedFileToCache( params.callback); } -DriveFileSystemMetadata DriveFileSystem::GetMetadata() const { +void DriveFileSystem::GetMetadata( + const GetFilesystemMetadataCallback& callback) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + DriveFileSystemMetadata metadata; - metadata.largest_changestamp = resource_metadata_->largest_changestamp(); metadata.loaded = resource_metadata_->loaded(); metadata.refreshing = feed_loader_->refreshing(); @@ -1793,7 +1809,8 @@ DriveFileSystemMetadata DriveFileSystem::GetMetadata() const { metadata.last_update_check_time = last_update_check_time_; metadata.last_update_check_error = last_update_check_error_; - return metadata; + resource_metadata_->GetLargestChangestamp( + base::Bind(&OnGetLargestChangestamp, metadata, callback)); } void DriveFileSystem::OnDisableDriveHostedFilesChanged() { diff --git a/chrome/browser/chromeos/drive/drive_file_system.h b/chrome/browser/chromeos/drive/drive_file_system.h index 6aa48c0..987931f 100644 --- a/chrome/browser/chromeos/drive/drive_file_system.h +++ b/chrome/browser/chromeos/drive/drive_file_system.h @@ -134,7 +134,8 @@ class DriveFileSystem : public DriveFileSystemInterface, scoped_ptr<google_apis::ResourceEntry> doc_entry, const FilePath& file_content_path, const FileOperationCallback& callback) OVERRIDE; - virtual DriveFileSystemMetadata GetMetadata() const OVERRIDE; + virtual void GetMetadata( + const GetFilesystemMetadataCallback& callback) OVERRIDE; virtual void Reload() OVERRIDE; // file_system::OperationObserver overrides. diff --git a/chrome/browser/chromeos/drive/drive_file_system_interface.h b/chrome/browser/chromeos/drive/drive_file_system_interface.h index 1d494ff..0a34a81 100644 --- a/chrome/browser/chromeos/drive/drive_file_system_interface.h +++ b/chrome/browser/chromeos/drive/drive_file_system_interface.h @@ -72,6 +72,10 @@ typedef base::Callback<void(DriveFileError error, int64 bytes_total, int64 bytes_used)> GetAvailableSpaceCallback; +// Used to get drive filesystem metadata. +typedef base::Callback<void(const DriveFileSystemMetadata&)> + GetFilesystemMetadataCallback; + // Drive file system abstraction layer. // The interface is defined to make DriveFileSystem mockable. class DriveFileSystemInterface { @@ -341,8 +345,9 @@ class DriveFileSystemInterface { const FileOperationCallback& callback) = 0; // Returns miscellaneous metadata of the file system like the largest - // timestamp. Used in chrome:drive-internals. - virtual DriveFileSystemMetadata GetMetadata() const = 0; + // timestamp. Used in chrome:drive-internals. |callback| must not be null. + virtual void GetMetadata( + const GetFilesystemMetadataCallback& callback) = 0; // Reloads the file system feeds from the server. virtual void Reload() = 0; diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata.cc b/chrome/browser/chromeos/drive/drive_resource_metadata.cc index c5ca213..2fbc048 100644 --- a/chrome/browser/chromeos/drive/drive_resource_metadata.cc +++ b/chrome/browser/chromeos/drive/drive_resource_metadata.cc @@ -230,6 +230,20 @@ void DriveResourceMetadata::ClearRoot() { root_.reset(); } +void DriveResourceMetadata::GetLargestChangestamp( + const GetChangestampCallback& callback) { + base::MessageLoopProxy::current()->PostTask( + FROM_HERE, base::Bind(callback, largest_changestamp_)); +} + +void DriveResourceMetadata::SetLargestChangestamp( + int64 value, + const FileOperationCallback& callback) { + largest_changestamp_ = value; + base::MessageLoopProxy::current()->PostTask( + FROM_HERE, base::Bind(callback, DRIVE_FILE_OK)); +} + void DriveResourceMetadata::AddEntryToDirectory( const FilePath& directory_path, scoped_ptr<google_apis::ResourceEntry> entry, diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata.h b/chrome/browser/chromeos/drive/drive_resource_metadata.h index 052c45d..3ee5cad 100644 --- a/chrome/browser/chromeos/drive/drive_resource_metadata.h +++ b/chrome/browser/chromeos/drive/drive_resource_metadata.h @@ -90,6 +90,8 @@ typedef base::Callback<void(DriveFileError error, typedef base::Callback<void(const std::set<FilePath>&)> GetChildDirectoriesCallback; +typedef base::Callback<void(int64)> GetChangestampCallback; + // This is a part of EntryInfoPairResult. struct EntryInfoResult { EntryInfoResult(); @@ -132,15 +134,16 @@ class DriveResourceMetadata { size_t serialized_size() const { return serialized_size_; } void set_serialized_size(size_t size) { serialized_size_ = size; } - // Largest change timestamp that was the source of content for the current - // state of the root directory. - int64 largest_changestamp() const { return largest_changestamp_; } - void set_largest_changestamp(int64 value) { largest_changestamp_ = value; } - // True if the file system feed is loaded from the cache or from the server. bool loaded() const { return loaded_; } void set_loaded(bool loaded) { loaded_ = loaded; } + // Largest change timestamp that was the source of content for the current + // state of the root directory. + void GetLargestChangestamp(const GetChangestampCallback& callback); + void SetLargestChangestamp(int64 value, + const FileOperationCallback& callback); + // Add |entry| to directory with path |directory_path| and invoke the // callback asynchronously. // |callback| must not be null. diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc b/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc index 3459c1e..5ccce25 100644 --- a/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc +++ b/chrome/browser/chromeos/drive/drive_resource_metadata_unittest.cc @@ -34,12 +34,19 @@ void CopyResultsFromInitFromDBCallback(DriveFileError* expected_error, *expected_error = actual_error; } +// Copies result from GetChildDirectoriesCallback. void CopyResultFromGetChildDirectoriesCallback( std::set<FilePath>* out_child_directories, const std::set<FilePath>& in_child_directories) { *out_child_directories = in_child_directories; } +// Copies result from GetChangestampCallback. +void CopyResultFromGetChangestampCallback( + int64* out_changestamp, int64 in_changestamp) { + *out_changestamp = in_changestamp; +} + } // namespace class DriveResourceMetadataTest : public testing::Test { @@ -180,6 +187,26 @@ TEST_F(DriveResourceMetadataTest, VersionCheck) { ASSERT_FALSE(resource_metadata.ParseFromString(serialized_proto)); } +TEST_F(DriveResourceMetadataTest, LargestChangestamp) { + DriveResourceMetadata resource_metadata; + + int64 in_changestamp = 123456; + DriveFileError error = DRIVE_FILE_ERROR_FAILED; + resource_metadata.SetLargestChangestamp( + in_changestamp, + base::Bind(&test_util::CopyErrorCodeFromFileOperationCallback, + &error)); + google_apis::test_util::RunBlockingPoolTask(); + EXPECT_EQ(DRIVE_FILE_OK, error); + + int64 out_changestamp = 0; + resource_metadata.GetLargestChangestamp( + base::Bind(&CopyResultFromGetChangestampCallback, + &out_changestamp)); + google_apis::test_util::RunBlockingPoolTask(); + DCHECK_EQ(in_changestamp, out_changestamp); +} + TEST_F(DriveResourceMetadataTest, GetEntryByResourceId_RootDirectory) { DriveResourceMetadata resource_metadata; diff --git a/chrome/browser/chromeos/drive/mock_drive_file_system.h b/chrome/browser/chromeos/drive/mock_drive_file_system.h index 44a3800..2f116eb 100644 --- a/chrome/browser/chromeos/drive/mock_drive_file_system.h +++ b/chrome/browser/chromeos/drive/mock_drive_file_system.h @@ -97,7 +97,8 @@ class MockDriveFileSystem : public DriveFileSystemInterface { const FilePath& file_content_path, const FileOperationCallback& callback) OVERRIDE { } - MOCK_CONST_METHOD0(GetMetadata, DriveFileSystemMetadata()); + MOCK_METHOD1(GetMetadata, + void(const GetFilesystemMetadataCallback& callback)); MOCK_METHOD0(Reload, void()); }; diff --git a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc index ce44f40..508dcee 100644 --- a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc +++ b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc @@ -235,6 +235,14 @@ class DriveInternalsWebUIHandler : public content::WebUIMessageHandler { google_apis::GDataErrorCode status, scoped_ptr<google_apis::AccountMetadataFeed> account_metadata); + // Callback for DriveFilesystem::GetMetadata for local update. + void OnGetFilesystemMetadataForLocal( + const drive::DriveFileSystemMetadata& metadata); + + // Callback for DriveFilesystem::GetMetadata for local update. + void OnGetFilesystemMetadataForDeltaUpdate( + const drive::DriveFileSystemMetadata& metadata); + // Called when the page requests periodic update. void OnPeriodicUpdate(const base::ListValue* args); @@ -401,11 +409,18 @@ void DriveInternalsWebUIHandler::UpdateAccountMetadataSection( void DriveInternalsWebUIHandler::UpdateLocalMetadataSection( google_apis::DriveServiceInterface* drive_service) { - DCHECK(drive_service); + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + GetSystemService()->file_system()->GetMetadata( + base::Bind(&DriveInternalsWebUIHandler::OnGetFilesystemMetadataForLocal, + weak_ptr_factory_.GetWeakPtr())); +} + +void DriveInternalsWebUIHandler::OnGetFilesystemMetadataForLocal( + const drive::DriveFileSystemMetadata& metadata) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); base::DictionaryValue local_metadata; - const drive::DriveFileSystemMetadata metadata = - GetSystemService()->file_system()->GetMetadata(); local_metadata.SetDouble("account-largest-changestamp-local", metadata.largest_changestamp); local_metadata.SetBoolean("account-metadata-loaded", metadata.loaded); @@ -414,8 +429,17 @@ void DriveInternalsWebUIHandler::UpdateLocalMetadataSection( } void DriveInternalsWebUIHandler::UpdateDeltaUpdateStatusSection() { - const drive::DriveFileSystemMetadata metadata = - GetSystemService()->file_system()->GetMetadata(); + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + GetSystemService()->file_system()->GetMetadata( + base::Bind( + &DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate, + weak_ptr_factory_.GetWeakPtr())); +} + +void DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate( + const drive::DriveFileSystemMetadata& metadata) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); base::DictionaryValue delta_update_status; delta_update_status.SetBoolean("push-notification-enabled", |