summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-05 03:29:36 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-05 03:29:36 +0000
commit0881e23c7a4ae07155f8f252811faf5f755c7c16 (patch)
treef08ad79d4727a1387b3fe1e69dbb6d71f9fa9af8 /webkit
parentdf34fd442223824a410930edc3e2bc3652f4ba67 (diff)
downloadchromium_src-0881e23c7a4ae07155f8f252811faf5f755c7c16.zip
chromium_src-0881e23c7a4ae07155f8f252811faf5f755c7c16.tar.gz
chromium_src-0881e23c7a4ae07155f8f252811faf5f755c7c16.tar.bz2
Cap the quota to preserve some system space even for unlimited apps/extensions
Currently this patch always preserve 1G space. This is a quick fix and does not reflect the actual disk size. Also fixed the quota for unlimited apps to take the current usage into consideration. (Note: this will need PSA) BUG=178976 TEST=QuotaManagerTest.GetUsage_MultipleClients TEST=manual Review URL: https://codereview.chromium.org/12383017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@186067 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/quota/quota_manager.cc49
-rw-r--r--webkit/quota/quota_manager.h2
-rw-r--r--webkit/quota/quota_manager_unittest.cc8
3 files changed, 46 insertions, 13 deletions
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc
index 9c79ed7..779e5530 100644
--- a/webkit/quota/quota_manager.cc
+++ b/webkit/quota/quota_manager.cc
@@ -168,6 +168,13 @@ const int QuotaManager::kPerHostTemporaryPortion = 5; // 20%
const char QuotaManager::kDatabaseName[] = "QuotaManager";
+// Preserve kMinimumPreserveForSystem disk space for system book-keeping
+// when returning the quota to unlimited apps/extensions.
+// TODO(kinuko): This should be like 10% of the actual disk space.
+// For now we simply use a constant as getting the disk size needs
+// platform-dependent code. (http://crbug.com/178976)
+const int64 QuotaManager::kMinimumPreserveForSystem = 1024 * kMBytes;
+
const int QuotaManager::kThresholdOfErrorsToBeBlacklisted = 3;
const int QuotaManager::kEvictionIntervalInMilliSeconds =
@@ -178,6 +185,20 @@ const int QuotaManager::kEvictionIntervalInMilliSeconds =
// and by multiple apps.
int64 QuotaManager::kSyncableStorageDefaultHostQuota = 500 * kMBytes;
+int64 CalculateQuotaForUnlimitedInstalledApp(
+ int64 available_disk_space, int64 usage) {
+ if (available_disk_space < QuotaManager::kMinimumPreserveForSystem) {
+ // No more space; cap the quota to the current usage.
+ return usage;
+ }
+
+ available_disk_space -= QuotaManager::kMinimumPreserveForSystem;
+ if (available_disk_space < kint64max - usage)
+ return available_disk_space + usage;
+
+ return kint64max;
+}
+
// Callback translators.
void CallGetUsageAndQuotaCallback(
const QuotaManager::GetUsageAndQuotaCallback& callback,
@@ -185,19 +206,27 @@ void CallGetUsageAndQuotaCallback(
bool is_installed_app,
QuotaStatusCode status,
const QuotaAndUsage& quota_and_usage) {
- int64 usage;
- int64 quota;
+ // Regular limited case.
+ if (!unlimited) {
+ callback.Run(status, quota_and_usage.usage, quota_and_usage.quota);
+ return;
+ }
- if (unlimited) {
- usage = quota_and_usage.unlimited_usage;
- quota = is_installed_app ? quota_and_usage.available_disk_space :
- QuotaManager::kNoLimit;
- } else {
- usage = quota_and_usage.usage;
- quota = quota_and_usage.quota;
+ int64 usage = quota_and_usage.unlimited_usage;
+
+ // Unlimited case: for non-installed apps just return unlimited quota.
+ // TODO(kinuko): We should probably always return the capped disk space
+ // for internal quota clients (while we still would not want to expose
+ // the actual usage to webapps). http://crbug.com/179040
+ if (!is_installed_app) {
+ callback.Run(status, usage, QuotaManager::kNoLimit);
+ return;
}
- callback.Run(status, usage, quota);
+ // For installed unlimited apps.
+ callback.Run(status, usage,
+ CalculateQuotaForUnlimitedInstalledApp(
+ quota_and_usage.available_disk_space, usage));
}
void CallQuotaCallback(
diff --git a/webkit/quota/quota_manager.h b/webkit/quota/quota_manager.h
index d79f188..d24b12a 100644
--- a/webkit/quota/quota_manager.h
+++ b/webkit/quota/quota_manager.h
@@ -201,6 +201,8 @@ class WEBKIT_STORAGE_EXPORT QuotaManager
static const char kDatabaseName[];
+ static const int64 kMinimumPreserveForSystem;
+
static const int kThresholdOfErrorsToBeBlacklisted;
static const int kEvictionIntervalInMilliSeconds;
diff --git a/webkit/quota/quota_manager_unittest.cc b/webkit/quota/quota_manager_unittest.cc
index fd65ef5..ccbc826 100644
--- a/webkit/quota/quota_manager_unittest.cc
+++ b/webkit/quota/quota_manager_unittest.cc
@@ -36,7 +36,7 @@ const int kAllClients = QuotaClient::kAllClientsMask;
// Returns a deterministic value for the amount of available disk space.
int64 GetAvailableDiskSpaceForTest(const base::FilePath&) {
- return 13377331;
+ return 13377331 + QuotaManager::kMinimumPreserveForSystem;
}
class QuotaManagerTest : public testing::Test {
@@ -649,13 +649,15 @@ TEST_F(QuotaManagerTest, GetUsage_MultipleClients) {
MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kQuotaStatusOk, status());
EXPECT_EQ(1, usage());
- EXPECT_EQ(available_space(), quota());
+ EXPECT_EQ(available_space() - QuotaManager::kMinimumPreserveForSystem,
+ quota() - usage());
GetUsageAndQuota(GURL("http://installed/"), kPerm);
MessageLoop::current()->RunUntilIdle();
EXPECT_EQ(kQuotaStatusOk, status());
EXPECT_EQ(1, usage());
- EXPECT_EQ(available_space(), quota());
+ EXPECT_EQ(available_space() - QuotaManager::kMinimumPreserveForSystem,
+ quota() - usage());
GetGlobalUsage(kTemp);
MessageLoop::current()->RunUntilIdle();