| Index: webkit/browser/appcache/appcache_service.cc
|
| diff --git a/webkit/browser/appcache/appcache_service.cc b/webkit/browser/appcache/appcache_service.cc
|
| index e951ad018a23e7cb85ef0dc56702f5268c0e6569..575355a599fd8b116dca91a531314a6f22544747 100644
|
| --- a/webkit/browser/appcache/appcache_service.cc
|
| +++ b/webkit/browser/appcache/appcache_service.cc
|
| @@ -425,7 +425,6 @@ void AppCacheService::CheckResponseHelper::OnReadDataComplete(int result) {
|
| delete this;
|
| }
|
|
|
| -
|
| // AppCacheStorageReference ------
|
|
|
| AppCacheStorageReference::AppCacheStorageReference(
|
| @@ -439,8 +438,7 @@ AppCacheService::AppCacheService(quota::QuotaManagerProxy* quota_manager_proxy)
|
| : appcache_policy_(NULL), quota_client_(NULL), handler_factory_(NULL),
|
| quota_manager_proxy_(quota_manager_proxy),
|
| request_context_(NULL),
|
| - force_keep_session_state_(false),
|
| - was_reinitialized_(false) {
|
| + force_keep_session_state_(false) {
|
| if (quota_manager_proxy_.get()) {
|
| quota_client_ = new AppCacheQuotaClient(this);
|
| quota_manager_proxy_->RegisterClient(quota_client_);
|
| @@ -473,13 +471,36 @@ void AppCacheService::Initialize(const base::FilePath& cache_directory,
|
| storage_.reset(storage);
|
| }
|
|
|
| -void AppCacheService::Reinitialize() {
|
| - AppCacheHistograms::CountReinitAttempt(was_reinitialized_);
|
| -
|
| - // To avoid thrashing, we only do this once.
|
| - if (was_reinitialized_)
|
| +void AppCacheService::ScheduleReinitialize() {
|
| + if (reinit_timer_.IsRunning())
|
| return;
|
| - was_reinitialized_ = true;
|
| +
|
| + // Reinitialization only happens when corruption has been noticed.
|
| + // We don't want to thrash the disk but we also don't want to
|
| + // leave the appcache disabled for an indefinite period of time. Some
|
| + // users never shutdown the browser.
|
| +
|
| + const base::TimeDelta kZeroDelta;
|
| + const base::TimeDelta kOneHour(base::TimeDelta::FromHours(1));
|
| + const base::TimeDelta k30Seconds(base::TimeDelta::FromSeconds(30));
|
| +
|
| + // If the system managed to stay up for long enough, reset the
|
| + // delay so a new failure won't incur a long wait to get going again.
|
| + base::TimeDelta up_time = base::Time::Now() - last_reinit_time_;
|
| + if (next_reinit_delay_ != kZeroDelta && up_time > kOneHour)
|
| + next_reinit_delay_ = kZeroDelta;
|
| +
|
| + reinit_timer_.Start(FROM_HERE, next_reinit_delay_,
|
| + this, &AppCacheService::Reinitialize);
|
| +
|
| + // Adjust the delay for next time.
|
| + base::TimeDelta increment = std::max(k30Seconds, next_reinit_delay_);
|
| + next_reinit_delay_ = std::min(next_reinit_delay_ + increment, kOneHour);
|
| +}
|
| +
|
| +void AppCacheService::Reinitialize() {
|
| + AppCacheHistograms::CountReinitAttempt(!last_reinit_time_.is_null());
|
| + last_reinit_time_ = base::Time::Now();
|
|
|
| // Inform observers of about this and give them a chance to
|
| // defer deletion of the old storage object.
|
|
|