Chromium Code Reviews| Index: content/browser/appcache/appcache_storage_impl.cc |
| diff --git a/content/browser/appcache/appcache_storage_impl.cc b/content/browser/appcache/appcache_storage_impl.cc |
| index 5df1d3ebdd15055a11c3b757d14a9070cdbf5f14..24a96504511a7b978c0ed3f821e90804c2eeb3ec 100644 |
| --- a/content/browser/appcache/appcache_storage_impl.cc |
| +++ b/content/browser/appcache/appcache_storage_impl.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/files/file_util.h" |
| #include "base/logging.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/profiler/scoped_tracker.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string_util.h" |
| @@ -285,6 +286,8 @@ class AppCacheStorageImpl::InitTask : public DatabaseTask { |
| }; |
| void AppCacheStorageImpl::InitTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::InitTask")); |
| // If there is no sql database, ensure there is no disk cache either. |
| if (!db_file_path_.empty() && |
| !base::PathExists(db_file_path_) && |
| @@ -310,12 +313,12 @@ void AppCacheStorageImpl::InitTask::RunCompleted() { |
| if (!storage_->is_disabled()) { |
| storage_->usage_map_.swap(usage_map_); |
| - const base::TimeDelta kDelay = base::TimeDelta::FromMinutes(5); |
| + const base::TimeDelta k5Minutes = base::TimeDelta::FromMinutes(5); |
|
cmumford
2015/02/17 19:26:39
My preference would be to have a name that describ
michaeln
2015/02/17 19:46:26
Done.
|
| base::MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| base::Bind(&AppCacheStorageImpl::DelayedStartDeletingUnusedResponses, |
| storage_->weak_factory_.GetWeakPtr()), |
| - kDelay); |
| + k5Minutes); |
| } |
| if (storage_->service()->quota_client()) |
| @@ -357,6 +360,8 @@ class AppCacheStorageImpl::GetAllInfoTask : public DatabaseTask { |
| }; |
| void AppCacheStorageImpl::GetAllInfoTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::GetAllInfoTask")); |
| std::set<GURL> origins; |
| database_->FindOriginsWithGroups(&origins); |
| for (std::set<GURL>::const_iterator origin = origins.begin(); |
| @@ -512,14 +517,16 @@ class AppCacheStorageImpl::CacheLoadTask : public StoreOrLoadTask { |
| }; |
| void AppCacheStorageImpl::CacheLoadTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::CacheLoadTask")); |
| success_ = |
| database_->FindCache(cache_id_, &cache_record_) && |
| database_->FindGroup(cache_record_.group_id, &group_record_) && |
| FindRelatedCacheRecords(cache_id_); |
| if (success_) |
| - database_->UpdateGroupLastAccessTime(group_record_.group_id, |
| - base::Time::Now()); |
| + database_->LazyUpdateLastAccessTime(group_record_.group_id, |
| + base::Time::Now()); |
| } |
| void AppCacheStorageImpl::CacheLoadTask::RunCompleted() { |
| @@ -527,6 +534,7 @@ void AppCacheStorageImpl::CacheLoadTask::RunCompleted() { |
| scoped_refptr<AppCache> cache; |
| scoped_refptr<AppCacheGroup> group; |
| if (success_ && !storage_->is_disabled()) { |
| + storage_->LazilyCommitLastAccessTimes(); |
| DCHECK(cache_record_.cache_id == cache_id_); |
| CreateCacheAndGroupFromRecords(&cache, &group); |
| } |
| @@ -554,14 +562,16 @@ class AppCacheStorageImpl::GroupLoadTask : public StoreOrLoadTask { |
| }; |
| void AppCacheStorageImpl::GroupLoadTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::GroupLoadTask")); |
| success_ = |
| database_->FindGroupForManifestUrl(manifest_url_, &group_record_) && |
| database_->FindCacheForGroup(group_record_.group_id, &cache_record_) && |
| FindRelatedCacheRecords(cache_record_.cache_id); |
| if (success_) |
| - database_->UpdateGroupLastAccessTime(group_record_.group_id, |
| - base::Time::Now()); |
| + database_->LazyUpdateLastAccessTime(group_record_.group_id, |
| + base::Time::Now()); |
| } |
| void AppCacheStorageImpl::GroupLoadTask::RunCompleted() { |
| @@ -570,6 +580,7 @@ void AppCacheStorageImpl::GroupLoadTask::RunCompleted() { |
| scoped_refptr<AppCache> cache; |
| if (!storage_->is_disabled()) { |
| if (success_) { |
| + storage_->LazilyCommitLastAccessTimes(); |
| DCHECK(group_record_.manifest_url == manifest_url_); |
| CreateCacheAndGroupFromRecords(&cache, &group); |
| } else { |
| @@ -668,6 +679,9 @@ void AppCacheStorageImpl::StoreGroupAndCacheTask::OnQuotaCallback( |
| } |
| void AppCacheStorageImpl::StoreGroupAndCacheTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::StoreGroupAndCacheTask")); |
| DCHECK(!success_); |
| sql::Connection* connection = database_->db_connection(); |
| if (!connection) |
| @@ -690,8 +704,8 @@ void AppCacheStorageImpl::StoreGroupAndCacheTask::Run() { |
| DCHECK(group_record_.manifest_url == existing_group.manifest_url); |
| DCHECK(group_record_.origin == existing_group.origin); |
| - database_->UpdateGroupLastAccessTime(group_record_.group_id, |
| - base::Time::Now()); |
| + database_->UpdateLastAccessTime(group_record_.group_id, |
| + base::Time::Now()); |
| AppCacheDatabase::CacheRecord cache; |
| if (database_->FindCacheForGroup(group_record_.group_id, &cache)) { |
| @@ -931,6 +945,9 @@ class AppCacheStorageImpl::FindMainResponseTask : public DatabaseTask { |
| }; |
| void AppCacheStorageImpl::FindMainResponseTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::FindMainResponseTask")); |
| // NOTE: The heuristics around choosing amoungst multiple candidates |
| // is underspecified, and just plain not fully understood. This needs |
| // to be refined. |
| @@ -1114,6 +1131,9 @@ class AppCacheStorageImpl::MarkEntryAsForeignTask : public DatabaseTask { |
| }; |
| void AppCacheStorageImpl::MarkEntryAsForeignTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::MarkEntryAsForeignTask")); |
| database_->AddEntryFlags(entry_url_, cache_id_, AppCacheEntry::FOREIGN); |
| } |
| @@ -1162,6 +1182,9 @@ AppCacheStorageImpl::MakeGroupObsoleteTask::MakeGroupObsoleteTask( |
| new_origin_usage_(-1) {} |
| void AppCacheStorageImpl::MakeGroupObsoleteTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::MakeGroupObsoleteTask")); |
| DCHECK(!success_); |
| sql::Connection* connection = database_->db_connection(); |
| if (!connection) |
| @@ -1233,6 +1256,9 @@ class AppCacheStorageImpl::GetDeletableResponseIdsTask : public DatabaseTask { |
| }; |
| void AppCacheStorageImpl::GetDeletableResponseIdsTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::GetDeletableResponseIdsTask")); |
| const int kSqlLimit = 1000; |
| database_->GetDeletableResponseIds(&response_ids_, max_rowid_, kSqlLimit); |
| // TODO(michaeln): retrieve group_ids too |
| @@ -1261,6 +1287,9 @@ class AppCacheStorageImpl::InsertDeletableResponseIdsTask |
| }; |
| void AppCacheStorageImpl::InsertDeletableResponseIdsTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::InsertDeletableResponseIdsTask")); |
| database_->InsertDeletableResponseIds(response_ids_); |
| // TODO(michaeln): store group_ids too |
| } |
| @@ -1283,15 +1312,18 @@ class AppCacheStorageImpl::DeleteDeletableResponseIdsTask |
| }; |
| void AppCacheStorageImpl::DeleteDeletableResponseIdsTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::DeleteDeletableResponseIdsTask")); |
| database_->DeleteDeletableResponseIds(response_ids_); |
| } |
| -// UpdateGroupLastAccessTimeTask ------- |
| +// LazyUpdateLastAccessTimeTask ------- |
| -class AppCacheStorageImpl::UpdateGroupLastAccessTimeTask |
| +class AppCacheStorageImpl::LazyUpdateLastAccessTimeTask |
| : public DatabaseTask { |
| public: |
| - UpdateGroupLastAccessTimeTask( |
| + LazyUpdateLastAccessTimeTask( |
| AppCacheStorageImpl* storage, AppCacheGroup* group, base::Time time) |
| : DatabaseTask(storage), group_id_(group->group_id()), |
| last_access_time_(time) { |
| @@ -1300,19 +1332,43 @@ class AppCacheStorageImpl::UpdateGroupLastAccessTimeTask |
| // DatabaseTask: |
| void Run() override; |
| + void RunCompleted() override; |
| protected: |
| - ~UpdateGroupLastAccessTimeTask() override {} |
| + ~LazyUpdateLastAccessTimeTask() override {} |
| private: |
| int64 group_id_; |
| base::Time last_access_time_; |
| }; |
| -void AppCacheStorageImpl::UpdateGroupLastAccessTimeTask::Run() { |
| - database_->UpdateGroupLastAccessTime(group_id_, last_access_time_); |
| +void AppCacheStorageImpl::LazyUpdateLastAccessTimeTask::Run() { |
| + tracked_objects::ScopedTracker tracking_profile( |
| + FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| + "AppCacheStorageImpl::UpdateGroupLastAccessTimeTask")); |
| + database_->LazyUpdateLastAccessTime(group_id_, last_access_time_); |
| +} |
| + |
| +void AppCacheStorageImpl::LazyUpdateLastAccessTimeTask::RunCompleted() { |
| + storage_->LazilyCommitLastAccessTimes(); |
| } |
| +// CommitLastAccessTimesTask ------- |
| + |
| +class AppCacheStorageImpl::CommitLastAccessTimesTask |
| + : public DatabaseTask { |
| + public: |
| + CommitLastAccessTimesTask(AppCacheStorageImpl* storage) |
| + : DatabaseTask(storage) {} |
| + |
| + // DatabaseTask: |
| + void Run() override { |
| + database_->CommitLazyLastAccessTimes(); |
| + } |
| + |
| + protected: |
| + ~CommitLastAccessTimesTask() override {} |
| +}; |
| // AppCacheStorageImpl --------------------------------------------------- |
| @@ -1400,7 +1456,7 @@ void AppCacheStorageImpl::LoadCache(int64 id, Delegate* delegate) { |
| delegate->OnCacheLoaded(cache, id); |
| if (cache->owning_group()) { |
| scoped_refptr<DatabaseTask> update_task( |
| - new UpdateGroupLastAccessTimeTask( |
| + new LazyUpdateLastAccessTimeTask( |
| this, cache->owning_group(), base::Time::Now())); |
| update_task->Schedule(); |
| } |
| @@ -1429,7 +1485,7 @@ void AppCacheStorageImpl::LoadOrCreateGroup( |
| if (group) { |
| delegate->OnGroupLoaded(group, manifest_url); |
| scoped_refptr<DatabaseTask> update_task( |
| - new UpdateGroupLastAccessTimeTask( |
| + new LazyUpdateLastAccessTimeTask( |
| this, group, base::Time::Now())); |
| update_task->Schedule(); |
| return; |
| @@ -1691,12 +1747,12 @@ void AppCacheStorageImpl::StartDeletingResponses( |
| void AppCacheStorageImpl::ScheduleDeleteOneResponse() { |
| DCHECK(!is_response_deletion_scheduled_); |
| - const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(10); |
| + const base::TimeDelta k10Millis = base::TimeDelta::FromMilliseconds(10); |
| base::MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| base::Bind(&AppCacheStorageImpl::DeleteOneResponse, |
| weak_factory_.GetWeakPtr()), |
| - kDelay); |
| + k10Millis); |
| is_response_deletion_scheduled_ = true; |
| } |
| @@ -1863,4 +1919,21 @@ void AppCacheStorageImpl::CallScheduleReinitialize() { |
| // note: 'this' may be deleted at this point. |
| } |
| +void AppCacheStorageImpl::LazilyCommitLastAccessTimes() { |
| + if (lazy_commit_timer_.IsRunning()) |
| + return; |
| + const int k10Minutes = 10; |
| + lazy_commit_timer_.Start( |
| + FROM_HERE, base::TimeDelta::FromMinutes(k10Minutes), |
| + base::Bind(&AppCacheStorageImpl::OnCommitLastAccessTimes, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void AppCacheStorageImpl::OnCommitLastAccessTimes() { |
| + lazy_commit_timer_.Stop(); |
| + if (is_disabled()) |
| + return; |
| + scoped_refptr<DatabaseTask> task(new CommitLastAccessTimesTask(this)); |
| + task->Schedule(); |
| +} |
|
cmumford
2015/02/17 19:26:39
Space
michaeln
2015/02/17 19:46:26
Done.
|
| } // namespace content |