| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/browser/dom_storage/dom_storage_area.h" | 5 #include "content/browser/dom_storage/dom_storage_area.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 // of other values being set, so changes are batched. | 34 // of other values being set, so changes are batched. |
| 35 const int kCommitDefaultDelaySecs = 5; | 35 const int kCommitDefaultDelaySecs = 5; |
| 36 | 36 |
| 37 // To avoid excessive IO we apply limits to the amount of data being written | 37 // To avoid excessive IO we apply limits to the amount of data being written |
| 38 // and the frequency of writes. The specific values used are somewhat arbitrary. | 38 // and the frequency of writes. The specific values used are somewhat arbitrary. |
| 39 const int kMaxBytesPerDay = kPerStorageAreaQuota * 2; | 39 const int kMaxBytesPerDay = kPerStorageAreaQuota * 2; |
| 40 const int kMaxCommitsPerHour = 6; | 40 const int kMaxCommitsPerHour = 6; |
| 41 | 41 |
| 42 } // namespace | 42 } // namespace |
| 43 | 43 |
| 44 bool DOMStorageArea::s_aggressive_flushing_enabled_ = false; |
| 45 |
| 44 DOMStorageArea::RateLimiter::RateLimiter(size_t desired_rate, | 46 DOMStorageArea::RateLimiter::RateLimiter(size_t desired_rate, |
| 45 base::TimeDelta time_quantum) | 47 base::TimeDelta time_quantum) |
| 46 : rate_(desired_rate), samples_(0), time_quantum_(time_quantum) { | 48 : rate_(desired_rate), samples_(0), time_quantum_(time_quantum) { |
| 47 DCHECK_GT(desired_rate, 0ul); | 49 DCHECK_GT(desired_rate, 0ul); |
| 48 } | 50 } |
| 49 | 51 |
| 50 base::TimeDelta DOMStorageArea::RateLimiter::ComputeTimeNeeded() const { | 52 base::TimeDelta DOMStorageArea::RateLimiter::ComputeTimeNeeded() const { |
| 51 return time_quantum_ * (samples_ / rate_); | 53 return time_quantum_ * (samples_ / rate_); |
| 52 } | 54 } |
| 53 | 55 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 82 } | 84 } |
| 83 | 85 |
| 84 // static | 86 // static |
| 85 GURL DOMStorageArea::OriginFromDatabaseFileName(const base::FilePath& name) { | 87 GURL DOMStorageArea::OriginFromDatabaseFileName(const base::FilePath& name) { |
| 86 DCHECK(name.MatchesExtension(kDatabaseFileExtension)); | 88 DCHECK(name.MatchesExtension(kDatabaseFileExtension)); |
| 87 std::string origin_id = | 89 std::string origin_id = |
| 88 name.BaseName().RemoveExtension().MaybeAsASCII(); | 90 name.BaseName().RemoveExtension().MaybeAsASCII(); |
| 89 return storage::GetOriginFromIdentifier(origin_id); | 91 return storage::GetOriginFromIdentifier(origin_id); |
| 90 } | 92 } |
| 91 | 93 |
| 94 void DOMStorageArea::EnableAggressiveCommitDelay() { |
| 95 s_aggressive_flushing_enabled_ = true; |
| 96 } |
| 97 |
| 92 DOMStorageArea::DOMStorageArea(const GURL& origin, | 98 DOMStorageArea::DOMStorageArea(const GURL& origin, |
| 93 const base::FilePath& directory, | 99 const base::FilePath& directory, |
| 94 DOMStorageTaskRunner* task_runner) | 100 DOMStorageTaskRunner* task_runner) |
| 95 : namespace_id_(kLocalStorageNamespaceId), | 101 : namespace_id_(kLocalStorageNamespaceId), |
| 96 origin_(origin), | 102 origin_(origin), |
| 97 directory_(directory), | 103 directory_(directory), |
| 98 task_runner_(task_runner), | 104 task_runner_(task_runner), |
| 99 map_(new DOMStorageMap(kPerStorageAreaQuota + | 105 map_(new DOMStorageMap(kPerStorageAreaQuota + |
| 100 kPerStorageAreaOverQuotaAllowance)), | 106 kPerStorageAreaOverQuotaAllowance)), |
| 101 is_initial_import_done_(true), | 107 is_initial_import_done_(true), |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 if (!commit_batches_in_flight_) { | 377 if (!commit_batches_in_flight_) { |
| 372 task_runner_->PostDelayedTask( | 378 task_runner_->PostDelayedTask( |
| 373 FROM_HERE, base::Bind(&DOMStorageArea::OnCommitTimer, this), | 379 FROM_HERE, base::Bind(&DOMStorageArea::OnCommitTimer, this), |
| 374 ComputeCommitDelay()); | 380 ComputeCommitDelay()); |
| 375 } | 381 } |
| 376 } | 382 } |
| 377 return commit_batch_.get(); | 383 return commit_batch_.get(); |
| 378 } | 384 } |
| 379 | 385 |
| 380 base::TimeDelta DOMStorageArea::ComputeCommitDelay() const { | 386 base::TimeDelta DOMStorageArea::ComputeCommitDelay() const { |
| 387 if (s_aggressive_flushing_enabled_) |
| 388 return base::TimeDelta::FromSeconds(1); |
| 389 |
| 381 base::TimeDelta elapsed_time = base::TimeTicks::Now() - start_time_; | 390 base::TimeDelta elapsed_time = base::TimeTicks::Now() - start_time_; |
| 382 base::TimeDelta delay = std::max( | 391 base::TimeDelta delay = std::max( |
| 383 base::TimeDelta::FromSeconds(kCommitDefaultDelaySecs), | 392 base::TimeDelta::FromSeconds(kCommitDefaultDelaySecs), |
| 384 std::max(commit_rate_limiter_.ComputeDelayNeeded(elapsed_time), | 393 std::max(commit_rate_limiter_.ComputeDelayNeeded(elapsed_time), |
| 385 data_rate_limiter_.ComputeDelayNeeded(elapsed_time))); | 394 data_rate_limiter_.ComputeDelayNeeded(elapsed_time))); |
| 386 UMA_HISTOGRAM_LONG_TIMES("LocalStorage.CommitDelay", delay); | 395 UMA_HISTOGRAM_LONG_TIMES("LocalStorage.CommitDelay", delay); |
| 387 return delay; | 396 return delay; |
| 388 } | 397 } |
| 389 | 398 |
| 390 void DOMStorageArea::OnCommitTimer() { | 399 void DOMStorageArea::OnCommitTimer() { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 commit_batch_->clear_all_first, | 465 commit_batch_->clear_all_first, |
| 457 commit_batch_->changed_values); | 466 commit_batch_->changed_values); |
| 458 DCHECK(success); | 467 DCHECK(success); |
| 459 } | 468 } |
| 460 commit_batch_.reset(); | 469 commit_batch_.reset(); |
| 461 backing_.reset(); | 470 backing_.reset(); |
| 462 session_storage_backing_ = NULL; | 471 session_storage_backing_ = NULL; |
| 463 } | 472 } |
| 464 | 473 |
| 465 } // namespace content | 474 } // namespace content |
| OLD | NEW |