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

Side by Side Diff: chrome/browser/chromeos/drive/change_list_loader.cc

Issue 13922007: Merge 192714 "drive: Update directory changestamp after "fast fe..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1453/src/
Patch Set: Created 7 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/chromeos/drive/change_list_loader.h" 5 #include "chrome/browser/chromeos/drive/change_list_loader.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 const FileOperationCallback& callback, 350 const FileOperationCallback& callback,
351 google_apis::GDataErrorCode status, 351 google_apis::GDataErrorCode status,
352 scoped_ptr<google_apis::AboutResource> about_resource) { 352 scoped_ptr<google_apis::AboutResource> about_resource) {
353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
354 DCHECK(!callback.is_null()); 354 DCHECK(!callback.is_null());
355 355
356 int64 remote_changestamp = 0; 356 int64 remote_changestamp = 0;
357 if (util::GDataToDriveFileError(status) == DRIVE_FILE_OK) { 357 if (util::GDataToDriveFileError(status) == DRIVE_FILE_OK) {
358 DCHECK(about_resource); 358 DCHECK(about_resource);
359 remote_changestamp = about_resource->largest_change_id(); 359 remote_changestamp = about_resource->largest_change_id();
360 last_known_remote_changestamp_ = remote_changestamp;
360 } 361 }
361 362
362 const DirectoryFetchInfo directory_fetch_info(directory_resource_id, 363 const DirectoryFetchInfo directory_fetch_info(directory_resource_id,
363 remote_changestamp); 364 remote_changestamp);
364 DoLoadDirectoryFromServer(directory_fetch_info, callback); 365 DoLoadDirectoryFromServer(directory_fetch_info, callback);
365 } 366 }
366 367
367 void ChangeListLoader::DoLoadDirectoryFromServer( 368 void ChangeListLoader::DoLoadDirectoryFromServer(
368 const DirectoryFetchInfo& directory_fetch_info, 369 const DirectoryFetchInfo& directory_fetch_info,
369 const FileOperationCallback& callback) { 370 const FileOperationCallback& callback) {
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 // If the directory of interest is already scheduled to be fetched, add the 734 // If the directory of interest is already scheduled to be fetched, add the
734 // callback to the pending list and return. 735 // callback to the pending list and return.
735 LoadCallbackMap::iterator it = pending_load_callback_.find(resource_id); 736 LoadCallbackMap::iterator it = pending_load_callback_.find(resource_id);
736 if (it != pending_load_callback_.end()) { 737 if (it != pending_load_callback_.end()) {
737 it->second.push_back(callback); 738 it->second.push_back(callback);
738 return; 739 return;
739 } 740 }
740 741
741 // If the directory's changestamp is up-to-date, just schedule to run the 742 // If the directory's changestamp is up-to-date, just schedule to run the
742 // callback, as there is no need to fetch the directory. 743 // callback, as there is no need to fetch the directory.
743 if (directory_fetch_info.changestamp() >= last_known_remote_changestamp_) { 744 // Note that |last_known_remote_changestamp_| is 0 when it is not received
745 // yet. In that case we conservatively assume that we need to fetch.
746 if (last_known_remote_changestamp_ > 0 &&
747 directory_fetch_info.changestamp() >= last_known_remote_changestamp_) {
744 base::MessageLoopProxy::current()->PostTask( 748 base::MessageLoopProxy::current()->PostTask(
745 FROM_HERE, 749 FROM_HERE,
746 base::Bind(callback, DRIVE_FILE_OK)); 750 base::Bind(callback, DRIVE_FILE_OK));
747 return; 751 return;
748 } 752 }
749 753
750 // The directory should be fetched. Add a dummy task to so ScheduleRun() 754 // The directory should be fetched. Add a dummy task to so ScheduleRun()
751 // can check that the directory is being fetched. 755 // can check that the directory is being fetched.
752 pending_load_callback_[resource_id].push_back( 756 pending_load_callback_[resource_id].push_back(
753 base::Bind(&util::EmptyFileOperationCallback)); 757 base::Bind(&util::EmptyFileOperationCallback));
758
759 // Start fetching the directory content, and mark it with the changestamp
760 // |last_known_remote_changestamp_|. To be precise, instead we need to call
761 // GetAboutResource() to get the latest changestamp. However,
762 // - It is costly to do GetAboutResource HTTP request every time.
763 // - The chance using an old value is small; it only happens when LoadIfNeeded
764 // is called during one GetAboutResource roundtrip time of a feed fetching.
765 // - Even if the value is old, it just marks the directory as older. It may
766 // trigger one future unnecessary re-fetch, but it'll never lose data, etc.
767 DirectoryFetchInfo new_directory_fetch_info(
768 directory_fetch_info.resource_id(),
769 std::max(directory_fetch_info.changestamp(),
770 last_known_remote_changestamp_));
754 DoLoadDirectoryFromServer( 771 DoLoadDirectoryFromServer(
755 directory_fetch_info, 772 new_directory_fetch_info,
756 base::Bind(&ChangeListLoader::OnDirectoryLoadComplete, 773 base::Bind(&ChangeListLoader::OnDirectoryLoadComplete,
757 weak_ptr_factory_.GetWeakPtr(), 774 weak_ptr_factory_.GetWeakPtr(),
758 directory_fetch_info, 775 directory_fetch_info,
759 callback)); 776 callback));
760 } 777 }
761 778
762 void ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed( 779 void ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed(
763 bool should_notify_changed_directories, 780 bool should_notify_changed_directories,
764 const base::Closure& update_finished_callback) { 781 const base::Closure& update_finished_callback) {
765 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 782 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 for (size_t i = 0; i < callbacks.size(); ++i) { 873 for (size_t i = 0; i < callbacks.size(); ++i) {
857 base::MessageLoopProxy::current()->PostTask( 874 base::MessageLoopProxy::current()->PostTask(
858 FROM_HERE, 875 FROM_HERE,
859 base::Bind(callbacks[i], error)); 876 base::Bind(callbacks[i], error));
860 } 877 }
861 pending_load_callback_.erase(it); 878 pending_load_callback_.erase(it);
862 } 879 }
863 } 880 }
864 881
865 } // namespace drive 882 } // namespace drive
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698