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

Side by Side Diff: storage/browser/quota/quota_manager.cc

Issue 1354543002: Exclude in-use origins from storage evictions for all QuotaEvictionPolicies. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@hook_it_up_gooood
Patch Set: rebase Created 5 years, 3 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
OLDNEW
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 "storage/browser/quota/quota_manager.h" 5 #include "storage/browser/quota/quota_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 QuotaDatabase* database) { 134 QuotaDatabase* database) {
135 DCHECK(database); 135 DCHECK(database);
136 database->GetQuotaConfigValue(QuotaDatabase::kTemporaryQuotaOverrideKey, 136 database->GetQuotaConfigValue(QuotaDatabase::kTemporaryQuotaOverrideKey,
137 temporary_quota_override); 137 temporary_quota_override);
138 database->GetQuotaConfigValue(QuotaDatabase::kDesiredAvailableSpaceKey, 138 database->GetQuotaConfigValue(QuotaDatabase::kDesiredAvailableSpaceKey,
139 desired_available_space); 139 desired_available_space);
140 return true; 140 return true;
141 } 141 }
142 142
143 bool GetLRUOriginOnDBThread(StorageType type, 143 bool GetLRUOriginOnDBThread(StorageType type,
144 std::set<GURL>* exceptions, 144 const std::set<GURL>& exceptions,
145 SpecialStoragePolicy* policy, 145 SpecialStoragePolicy* policy,
146 GURL* url, 146 GURL* url,
147 QuotaDatabase* database) { 147 QuotaDatabase* database) {
148 DCHECK(database); 148 DCHECK(database);
149 database->GetLRUOrigin(type, *exceptions, policy, url); 149 database->GetLRUOrigin(type, exceptions, policy, url);
150 return true; 150 return true;
151 } 151 }
152 152
153 bool DeleteOriginInfoOnDBThread(const GURL& origin, 153 bool DeleteOriginInfoOnDBThread(const GURL& origin,
154 StorageType type, 154 StorageType type,
155 QuotaDatabase* database) { 155 QuotaDatabase* database) {
156 DCHECK(database); 156 DCHECK(database);
157 return database->DeleteOriginInfo(origin, type); 157 return database->DeleteOriginInfo(origin, type);
158 } 158 }
159 159
(...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 LazyInitialize(); 1451 LazyInitialize();
1452 is_getting_eviction_origin_ = true; 1452 is_getting_eviction_origin_ = true;
1453 1453
1454 GetOriginCallback did_get_origin_callback = 1454 GetOriginCallback did_get_origin_callback =
1455 base::Bind(&QuotaManager::DidGetEvictionOrigin, 1455 base::Bind(&QuotaManager::DidGetEvictionOrigin,
1456 weak_factory_.GetWeakPtr(), callback); 1456 weak_factory_.GetWeakPtr(), callback);
1457 1457
1458 auto eviction_policy = eviction_policy_map_.find(type); 1458 auto eviction_policy = eviction_policy_map_.find(type);
1459 if (eviction_policy != eviction_policy_map_.end()) { 1459 if (eviction_policy != eviction_policy_map_.end()) {
1460 eviction_policy->second->GetEvictionOrigin(special_storage_policy_, 1460 eviction_policy->second->GetEvictionOrigin(special_storage_policy_,
1461 GetEvictionOriginExceptions(),
1461 did_get_origin_callback); 1462 did_get_origin_callback);
1462 } 1463 }
1463 1464
1464 // TODO(calamity): convert LRU origin retrieval into a QuotaEvictionPolicy. 1465 // TODO(calamity): convert LRU origin retrieval into a QuotaEvictionPolicy.
1465 GetLRUOrigin(type, did_get_origin_callback); 1466 GetLRUOrigin(type, did_get_origin_callback);
1466 } 1467 }
1467 1468
1469 std::set<GURL> QuotaManager::GetEvictionOriginExceptions() {
1470 std::set<GURL> exceptions;
1471 for (const auto& p : origins_in_use_) {
1472 if (p.second > 0)
1473 exceptions.insert(p.first);
1474 }
1475
1476 for (const auto& p : origins_in_error_) {
1477 if (p.second > QuotaManager::kThresholdOfErrorsToBeBlacklisted)
1478 exceptions.insert(p.first);
1479 }
raymes 2015/09/22 07:16:10 I'm confused a bit by this stuff - but I see you'v
calamity 2015/09/23 01:55:21 Good question. Okay, so, access_notified_origins_
1480
1481 return exceptions;
1482 }
1483
1468 void QuotaManager::DidGetEvictionOrigin(const GetOriginCallback& callback, 1484 void QuotaManager::DidGetEvictionOrigin(const GetOriginCallback& callback,
1469 const GURL& origin) { 1485 const GURL& origin) {
1470 callback.Run(origin); 1486 // Make sure the returned origin is (still) not in the origin_in_use_ set
1487 // and has not been accessed since we posted the task.
1488 if (origins_in_use_.find(origin) != origins_in_use_.end() ||
1489 access_notified_origins_.find(origin) != access_notified_origins_.end()) {
1490 callback.Run(GURL());
1491 } else {
1492 callback.Run(origin);
1493 }
1494 access_notified_origins_.clear();
1471 1495
1472 is_getting_eviction_origin_ = false; 1496 is_getting_eviction_origin_ = false;
1473 } 1497 }
1474 1498
1475 void QuotaManager::EvictOriginData(const GURL& origin, 1499 void QuotaManager::EvictOriginData(const GURL& origin,
1476 StorageType type, 1500 StorageType type,
1477 const EvictOriginDataCallback& callback) { 1501 const EvictOriginDataCallback& callback) {
1478 DCHECK(io_thread_->BelongsToCurrentThread()); 1502 DCHECK(io_thread_->BelongsToCurrentThread());
1479 DCHECK_EQ(type, kStorageTypeTemporary); 1503 DCHECK_EQ(type, kStorageTypeTemporary);
1480 1504
(...skipping 25 matching lines...) Expand all
1506 LazyInitialize(); 1530 LazyInitialize();
1507 // This must not be called while there's an in-flight task. 1531 // This must not be called while there's an in-flight task.
1508 DCHECK(lru_origin_callback_.is_null()); 1532 DCHECK(lru_origin_callback_.is_null());
1509 lru_origin_callback_ = callback; 1533 lru_origin_callback_ = callback;
1510 if (db_disabled_) { 1534 if (db_disabled_) {
1511 lru_origin_callback_.Run(GURL()); 1535 lru_origin_callback_.Run(GURL());
1512 lru_origin_callback_.Reset(); 1536 lru_origin_callback_.Reset();
1513 return; 1537 return;
1514 } 1538 }
1515 1539
1516 // TODO(calamity): make all QuotaEvictionPolicies aware of these exceptions.
1517 std::set<GURL>* exceptions = new std::set<GURL>;
1518 for (std::map<GURL, int>::const_iterator p = origins_in_use_.begin();
1519 p != origins_in_use_.end();
1520 ++p) {
1521 if (p->second > 0)
1522 exceptions->insert(p->first);
1523 }
1524 for (std::map<GURL, int>::const_iterator p = origins_in_error_.begin();
1525 p != origins_in_error_.end();
1526 ++p) {
1527 if (p->second > QuotaManager::kThresholdOfErrorsToBeBlacklisted)
1528 exceptions->insert(p->first);
1529 }
1530
1531 GURL* url = new GURL; 1540 GURL* url = new GURL;
1532 PostTaskAndReplyWithResultForDBThread( 1541 PostTaskAndReplyWithResultForDBThread(
1533 FROM_HERE, 1542 FROM_HERE,
1534 base::Bind(&GetLRUOriginOnDBThread, 1543 base::Bind(&GetLRUOriginOnDBThread, type, GetEvictionOriginExceptions(),
1535 type, 1544 special_storage_policy_, base::Unretained(url)),
1536 base::Owned(exceptions), 1545 base::Bind(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(),
1537 special_storage_policy_,
1538 base::Unretained(url)),
1539 base::Bind(&QuotaManager::DidGetLRUOrigin,
1540 weak_factory_.GetWeakPtr(),
1541 base::Owned(url))); 1546 base::Owned(url)));
1542 } 1547 }
1543 1548
1544 void QuotaManager::DidSetTemporaryGlobalOverrideQuota( 1549 void QuotaManager::DidSetTemporaryGlobalOverrideQuota(
1545 const QuotaCallback& callback, 1550 const QuotaCallback& callback,
1546 const int64* new_quota, 1551 const int64* new_quota,
1547 bool success) { 1552 bool success) {
1548 QuotaStatusCode status = kQuotaErrorInvalidAccess; 1553 QuotaStatusCode status = kQuotaErrorInvalidAccess;
1549 DidDatabaseWork(success); 1554 DidDatabaseWork(success);
1550 if (success) { 1555 if (success) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 1593
1589 db_initialization_callbacks_.Run(); 1594 db_initialization_callbacks_.Run();
1590 GetTemporaryGlobalQuota( 1595 GetTemporaryGlobalQuota(
1591 base::Bind(&QuotaManager::DidGetInitialTemporaryGlobalQuota, 1596 base::Bind(&QuotaManager::DidGetInitialTemporaryGlobalQuota,
1592 weak_factory_.GetWeakPtr())); 1597 weak_factory_.GetWeakPtr()));
1593 } 1598 }
1594 1599
1595 void QuotaManager::DidGetLRUOrigin(const GURL* origin, 1600 void QuotaManager::DidGetLRUOrigin(const GURL* origin,
1596 bool success) { 1601 bool success) {
1597 DidDatabaseWork(success); 1602 DidDatabaseWork(success);
1598 // Make sure the returned origin is (still) not in the origin_in_use_ set 1603
1599 // and has not been accessed since we posted the task. 1604 lru_origin_callback_.Run(*origin);
1600 if (origins_in_use_.find(*origin) != origins_in_use_.end() ||
1601 access_notified_origins_.find(*origin) != access_notified_origins_.end())
1602 lru_origin_callback_.Run(GURL());
1603 else
1604 lru_origin_callback_.Run(*origin);
1605 access_notified_origins_.clear();
1606 lru_origin_callback_.Reset(); 1605 lru_origin_callback_.Reset();
1607 } 1606 }
1608 1607
1609 void QuotaManager::DidGetInitialTemporaryGlobalQuota( 1608 void QuotaManager::DidGetInitialTemporaryGlobalQuota(
1610 QuotaStatusCode status, int64 quota_unused) { 1609 QuotaStatusCode status, int64 quota_unused) {
1611 if (eviction_disabled_) 1610 if (eviction_disabled_)
1612 return; 1611 return;
1613 1612
1614 std::set<GURL>* origins = new std::set<GURL>; 1613 std::set<GURL>* origins = new std::set<GURL>;
1615 temporary_usage_tracker_->GetCachedOrigins(origins); 1614 temporary_usage_tracker_->GetCachedOrigins(origins);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1653 // |database_|, therefore we can be sure that database_ is alive when this 1652 // |database_|, therefore we can be sure that database_ is alive when this
1654 // task runs. 1653 // task runs.
1655 base::PostTaskAndReplyWithResult( 1654 base::PostTaskAndReplyWithResult(
1656 db_thread_.get(), 1655 db_thread_.get(),
1657 from_here, 1656 from_here,
1658 base::Bind(task, base::Unretained(database_.get())), 1657 base::Bind(task, base::Unretained(database_.get())),
1659 reply); 1658 reply);
1660 } 1659 }
1661 1660
1662 } // namespace storage 1661 } // namespace storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698