| Index: storage/browser/quota/quota_manager.h
|
| diff --git a/storage/browser/quota/quota_manager.h b/storage/browser/quota/quota_manager.h
|
| index ded960e2b367d9743c382989fd3459882420922c..a1ef11d2a55fbdeb64aa37463f469d6fa92ef775 100644
|
| --- a/storage/browser/quota/quota_manager.h
|
| +++ b/storage/browser/quota/quota_manager.h
|
| @@ -21,17 +21,17 @@
|
| #include "base/macros.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/weak_ptr.h"
|
| -#include "base/optional.h"
|
| #include "base/sequenced_task_runner_helpers.h"
|
| #include "storage/browser/quota/quota_callbacks.h"
|
| #include "storage/browser/quota/quota_client.h"
|
| #include "storage/browser/quota/quota_database.h"
|
| -#include "storage/browser/quota/quota_settings.h"
|
| #include "storage/browser/quota/quota_task.h"
|
| #include "storage/browser/quota/special_storage_policy.h"
|
| #include "storage/browser/quota/storage_observer.h"
|
| #include "storage/browser/storage_browser_export.h"
|
|
|
| +class SiteEngagementEvictionPolicyWithQuotaManagerTest;
|
| +
|
| namespace base {
|
| class FilePath;
|
| class SequencedTaskRunner;
|
| @@ -60,21 +60,44 @@ class UsageTracker;
|
|
|
| struct QuotaManagerDeleter;
|
|
|
| +struct STORAGE_EXPORT UsageAndQuota {
|
| + int64_t usage;
|
| + int64_t global_limited_usage;
|
| + int64_t quota;
|
| + int64_t available_disk_space;
|
| +
|
| + UsageAndQuota();
|
| + UsageAndQuota(int64_t usage,
|
| + int64_t global_limited_usage,
|
| + int64_t quota,
|
| + int64_t available_disk_space);
|
| +};
|
| +
|
| +// TODO(calamity): Use this in the temporary storage eviction path.
|
| +// An interface for deciding which origin's storage should be evicted when the
|
| +// quota is exceeded.
|
| +class STORAGE_EXPORT QuotaEvictionPolicy {
|
| + public:
|
| + virtual ~QuotaEvictionPolicy() {}
|
| +
|
| + // Returns the next origin to evict. It might return an empty GURL when there
|
| + // are no evictable origins.
|
| + virtual void GetEvictionOrigin(
|
| + const scoped_refptr<SpecialStoragePolicy>& special_storage_policy,
|
| + const std::set<GURL>& exceptions,
|
| + const std::map<GURL, int64_t>& usage_map,
|
| + int64_t global_quota,
|
| + const GetOriginCallback& callback) = 0;
|
| +};
|
| +
|
| // An interface called by QuotaTemporaryStorageEvictor.
|
| class STORAGE_EXPORT QuotaEvictionHandler {
|
| public:
|
| - using EvictionRoundInfoCallback =
|
| - base::Callback<void(QuotaStatusCode status,
|
| - const QuotaSettings& settings,
|
| - int64_t available_space,
|
| - int64_t total_space,
|
| - int64_t global_usage,
|
| - bool global_usage_is_complete)>;
|
| -
|
| - // Called at the beginning of an eviction round to gather the info about
|
| - // the current settings, capacity, and usage.
|
| - virtual void GetEvictionRoundInfo(
|
| - const EvictionRoundInfoCallback& callback) = 0;
|
| + using EvictOriginDataCallback = StatusCallback;
|
| + using UsageAndQuotaCallback = base::Callback<
|
| + void(QuotaStatusCode status, const UsageAndQuota& usage_and_quota)>;
|
| + using VolumeInfoCallback = base::Callback<
|
| + void(bool success, uint64_t available_space, uint64_t total_space)>;
|
|
|
| // Returns next origin to evict. It might return an empty GURL when there are
|
| // no evictable origins.
|
| @@ -83,10 +106,14 @@ class STORAGE_EXPORT QuotaEvictionHandler {
|
| int64_t global_quota,
|
| const GetOriginCallback& callback) = 0;
|
|
|
| - // Called to evict an origin.
|
| - virtual void EvictOriginData(const GURL& origin,
|
| - StorageType type,
|
| - const StatusCallback& callback) = 0;
|
| + virtual void EvictOriginData(
|
| + const GURL& origin,
|
| + StorageType type,
|
| + const EvictOriginDataCallback& callback) = 0;
|
| +
|
| + virtual void AsyncGetVolumeInfo(const VolumeInfoCallback& callback) = 0;
|
| + virtual void GetUsageAndQuotaForEviction(
|
| + const UsageAndQuotaCallback& callback) = 0;
|
|
|
| protected:
|
| virtual ~QuotaEvictionHandler() {}
|
| @@ -108,10 +135,11 @@ class STORAGE_EXPORT QuotaManager
|
| public QuotaEvictionHandler,
|
| public base::RefCountedThreadSafe<QuotaManager, QuotaManagerDeleter> {
|
| public:
|
| - typedef base::Callback<
|
| - void(QuotaStatusCode, int64_t /* usage */, int64_t /* quota */)>
|
| - UsageAndQuotaCallback;
|
| + typedef base::Callback<void(QuotaStatusCode,
|
| + int64_t /* usage */,
|
| + int64_t /* quota */)> GetUsageAndQuotaCallback;
|
|
|
| + static const int64_t kIncognitoDefaultQuotaLimit;
|
| static const int64_t kNoLimit;
|
|
|
| QuotaManager(
|
| @@ -119,11 +147,7 @@ class STORAGE_EXPORT QuotaManager
|
| const base::FilePath& profile_path,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& io_thread,
|
| const scoped_refptr<base::SequencedTaskRunner>& db_thread,
|
| - const scoped_refptr<SpecialStoragePolicy>& special_storage_policy,
|
| - const GetQuotaSettingsFunc& get_settings_function);
|
| -
|
| - const QuotaSettings& settings() const { return settings_; }
|
| - void SetQuotaSettings(const QuotaSettings& settings);
|
| + const scoped_refptr<SpecialStoragePolicy>& special_storage_policy);
|
|
|
| // Returns a proxy object that can be used on any thread.
|
| QuotaManagerProxy* proxy() { return proxy_.get(); }
|
| @@ -136,7 +160,7 @@ class STORAGE_EXPORT QuotaManager
|
| virtual void GetUsageAndQuotaForWebApps(
|
| const GURL& origin,
|
| StorageType type,
|
| - const UsageAndQuotaCallback& callback);
|
| + const GetUsageAndQuotaCallback& callback);
|
|
|
| // Called by StorageClients.
|
| // This method is declared as virtual to allow test code to override it.
|
| @@ -144,9 +168,10 @@ class STORAGE_EXPORT QuotaManager
|
| // For UnlimitedStorage origins, this version skips usage and quota handling
|
| // to avoid extra query cost.
|
| // Do not call this method for apps/user-facing code.
|
| - virtual void GetUsageAndQuota(const GURL& origin,
|
| - StorageType type,
|
| - const UsageAndQuotaCallback& callback);
|
| + virtual void GetUsageAndQuota(
|
| + const GURL& origin,
|
| + StorageType type,
|
| + const GetUsageAndQuotaCallback& callback);
|
|
|
| // Called by clients via proxy.
|
| // Client storage should call this method when storage is accessed.
|
| @@ -177,6 +202,10 @@ class STORAGE_EXPORT QuotaManager
|
| StorageType type,
|
| bool enabled);
|
|
|
| + // Set the eviction policy to use when choosing an origin to evict.
|
| + void SetTemporaryStorageEvictionPolicy(
|
| + std::unique_ptr<QuotaEvictionPolicy> policy);
|
| +
|
| // DeleteOriginData and DeleteHostData (surprisingly enough) delete data of a
|
| // particular StorageType associated with either a specific origin or set of
|
| // origins. Each method additionally requires a |quota_client_mask| which
|
| @@ -194,6 +223,13 @@ class STORAGE_EXPORT QuotaManager
|
| const StatusCallback& callback);
|
|
|
| // Called by UI and internal modules.
|
| + void GetAvailableSpace(const AvailableSpaceCallback& callback);
|
| + void GetTemporaryGlobalQuota(const QuotaCallback& callback);
|
| +
|
| + // Ok to call with NULL callback.
|
| + void SetTemporaryGlobalOverrideQuota(int64_t new_quota,
|
| + const QuotaCallback& callback);
|
| +
|
| void GetPersistentHostQuota(const std::string& host,
|
| const QuotaCallback& callback);
|
| void SetPersistentHostQuota(const std::string& host,
|
| @@ -212,6 +248,11 @@ class STORAGE_EXPORT QuotaManager
|
|
|
| bool IsStorageUnlimited(const GURL& origin, StorageType type) const;
|
|
|
| + bool CanQueryDiskSize(const GURL& origin) const {
|
| + return special_storage_policy_.get() &&
|
| + special_storage_policy_->CanQueryDiskSize(origin);
|
| + }
|
| +
|
| virtual void GetOriginsModifiedSince(StorageType type,
|
| base::Time modified_since,
|
| const GetOriginsCallback& callback);
|
| @@ -225,17 +266,26 @@ class STORAGE_EXPORT QuotaManager
|
| void RemoveStorageObserverForFilter(StorageObserver* observer,
|
| const StorageObserver::Filter& filter);
|
|
|
| + // Determines the portion of the temp pool that can be
|
| + // utilized by a single host (ie. 5 for 20%).
|
| + static const int kPerHostTemporaryPortion;
|
| +
|
| static const int64_t kPerHostPersistentQuotaLimit;
|
| +
|
| static const char kDatabaseName[];
|
| +
|
| static const int kThresholdOfErrorsToBeBlacklisted;
|
| +
|
| static const int kEvictionIntervalInMilliSeconds;
|
| +
|
| static const char kTimeBetweenRepeatedOriginEvictionsHistogram[];
|
| static const char kEvictedOriginAccessedCountHistogram[];
|
| static const char kEvictedOriginTimeSinceAccessHistogram[];
|
|
|
| - // Kept non-const so that test code can change the value.
|
| + // These are kept non-const so that test code can change the value.
|
| // TODO(kinuko): Make this a real const value and add a proper way to set
|
| // the quota for syncable storage. (http://crbug.com/155488)
|
| + static int64_t kMinimumPreserveForSystem;
|
| static int64_t kSyncableStorageDefaultHostQuota;
|
|
|
| protected:
|
| @@ -252,12 +302,13 @@ class STORAGE_EXPORT QuotaManager
|
| friend class QuotaManagerProxy;
|
| friend class QuotaTemporaryStorageEvictor;
|
| friend struct QuotaManagerDeleter;
|
| + friend class ::SiteEngagementEvictionPolicyWithQuotaManagerTest;
|
|
|
| - class EvictionRoundInfoHelper;
|
| - class UsageAndQuotaHelper;
|
| class GetUsageInfoTask;
|
| +
|
| class OriginDataDeleter;
|
| class HostDataDeleter;
|
| +
|
| class GetModifiedSinceHelper;
|
| class DumpQuotaTableHelper;
|
| class DumpOriginInfoTableHelper;
|
| @@ -267,13 +318,10 @@ class STORAGE_EXPORT QuotaManager
|
| typedef std::vector<QuotaTableEntry> QuotaTableEntries;
|
| typedef std::vector<OriginInfoTableEntry> OriginInfoTableEntries;
|
|
|
| - using QuotaSettingsCallback = base::Callback<void(const QuotaSettings&)>;
|
| -
|
| // Function pointer type used to store the function which returns
|
| // information about the volume containing the given FilePath.
|
| - // The value returned is std::pair<total_space, available_space>.
|
| - using GetVolumeInfoFn =
|
| - std::pair<int64_t, int64_t> (*)(const base::FilePath&);
|
| + using GetVolumeInfoFn = bool(*)(const base::FilePath&,
|
| + uint64_t* available, uint64_t* total);
|
|
|
| typedef base::Callback<void(const QuotaTableEntries&)>
|
| DumpQuotaTableCallback;
|
| @@ -281,36 +329,28 @@ class STORAGE_EXPORT QuotaManager
|
| DumpOriginInfoTableCallback;
|
|
|
| typedef CallbackQueue<base::Closure> ClosureQueue;
|
| + typedef CallbackQueue<AvailableSpaceCallback, QuotaStatusCode, int64_t>
|
| + AvailableSpaceCallbackQueue;
|
| typedef CallbackQueueMap<QuotaCallback, std::string, QuotaStatusCode, int64_t>
|
| HostQuotaCallbackMap;
|
| - using QuotaSettingsCallbackQueue =
|
| - CallbackQueue<QuotaSettingsCallback, const QuotaSettings&>;
|
| -
|
| - // The values returned total_space, available_space.
|
| - using StorageCapacityCallback = base::Callback<void(int64_t, int64_t)>;
|
| - using StorageCapacityCallbackQueue =
|
| - CallbackQueue<StorageCapacityCallback, int64_t, int64_t>;
|
|
|
| struct EvictionContext {
|
| EvictionContext();
|
| - ~EvictionContext();
|
| + virtual ~EvictionContext();
|
| GURL evicted_origin;
|
| StorageType evicted_type;
|
| - StatusCallback evict_origin_data_callback;
|
| +
|
| + EvictOriginDataCallback evict_origin_data_callback;
|
| };
|
|
|
| + typedef QuotaEvictionHandler::UsageAndQuotaCallback
|
| + UsageAndQuotaDispatcherCallback;
|
| +
|
| // This initialization method is lazily called on the IO thread
|
| // when the first quota manager API is called.
|
| // Initialize must be called after all quota clients are added to the
|
| // manager by RegisterStorage.
|
| void LazyInitialize();
|
| - void FinishLazyInitialize(bool is_database_bootstraped);
|
| - void BootstrapDatabaseForEviction(
|
| - const GetOriginCallback& did_get_origin_callback,
|
| - int64_t unused_usage,
|
| - int64_t unused_unlimited_usage);
|
| - void DidBootstrapDatabase(const GetOriginCallback& did_get_origin_callback,
|
| - bool success);
|
|
|
| // Called by clients via proxy.
|
| // Registers a quota client to the manager.
|
| @@ -372,11 +412,20 @@ class STORAGE_EXPORT QuotaManager
|
| const GetOriginCallback& callback) override;
|
| void EvictOriginData(const GURL& origin,
|
| StorageType type,
|
| - const StatusCallback& callback) override;
|
| - void GetEvictionRoundInfo(const EvictionRoundInfoCallback& callback) override;
|
| + const EvictOriginDataCallback& callback) override;
|
| + void GetUsageAndQuotaForEviction(
|
| + const UsageAndQuotaCallback& callback) override;
|
| + void AsyncGetVolumeInfo(const VolumeInfoCallback& callback) override;
|
| +
|
| + void DidGetVolumeInfo(
|
| + const VolumeInfoCallback& callback,
|
| + uint64_t* available_space, uint64_t* total_space, bool success);
|
|
|
| void GetLRUOrigin(StorageType type, const GetOriginCallback& callback);
|
|
|
| + void DidSetTemporaryGlobalOverrideQuota(const QuotaCallback& callback,
|
| + const int64_t* new_quota,
|
| + bool success);
|
| void DidGetPersistentHostQuota(const std::string& host,
|
| const int64_t* quota,
|
| bool success);
|
| @@ -384,16 +433,16 @@ class STORAGE_EXPORT QuotaManager
|
| const QuotaCallback& callback,
|
| const int64_t* new_quota,
|
| bool success);
|
| + void DidInitialize(int64_t* temporary_quota_override,
|
| + int64_t* desired_available_space,
|
| + bool success);
|
| void DidGetLRUOrigin(const GURL* origin,
|
| bool success);
|
| - void GetQuotaSettings(const QuotaSettingsCallback& callback);
|
| - void DidGetSettings(base::TimeTicks start_ticks,
|
| - base::Optional<QuotaSettings> settings);
|
| - void GetStorageCapacity(const StorageCapacityCallback& callback);
|
| - void ContinueIncognitoGetStorageCapacity(const QuotaSettings& settings);
|
| - void DidGetStorageCapacity(
|
| - const std::pair<int64_t, int64_t>& total_and_available);
|
| -
|
| + void DidGetInitialTemporaryGlobalQuota(base::TimeTicks start_ticks,
|
| + QuotaStatusCode status,
|
| + int64_t quota_unused);
|
| + void DidInitializeTemporaryOriginsInfo(bool success);
|
| + void DidGetAvailableSpace(int64_t space);
|
| void DidDatabaseWork(bool success);
|
|
|
| void DeleteOnCorrectThread() const;
|
| @@ -403,10 +452,12 @@ class STORAGE_EXPORT QuotaManager
|
| const base::Callback<bool(QuotaDatabase*)>& task,
|
| const base::Callback<void(bool)>& reply);
|
|
|
| - static std::pair<int64_t, int64_t> CallGetVolumeInfo(
|
| - GetVolumeInfoFn get_volume_info_fn,
|
| - const base::FilePath& path);
|
| - static std::pair<int64_t, int64_t> GetVolumeInfo(const base::FilePath& path);
|
| + static int64_t CallGetAmountOfFreeDiskSpace(
|
| + GetVolumeInfoFn get_vol_info_fn,
|
| + const base::FilePath& profile_path);
|
| + static bool GetVolumeInfo(const base::FilePath& path,
|
| + uint64_t* available_space,
|
| + uint64_t* total_size);
|
|
|
| const bool is_incognito_;
|
| const base::FilePath profile_path_;
|
| @@ -417,14 +468,6 @@ class STORAGE_EXPORT QuotaManager
|
| scoped_refptr<base::SingleThreadTaskRunner> io_thread_;
|
| scoped_refptr<base::SequencedTaskRunner> db_thread_;
|
| mutable std::unique_ptr<QuotaDatabase> database_;
|
| - bool is_database_bootstrapped_ = false;
|
| -
|
| - GetQuotaSettingsFunc get_settings_function_;
|
| - scoped_refptr<base::TaskRunner> get_settings_task_runner_;
|
| - QuotaSettings settings_;
|
| - base::TimeTicks settings_timestamp_;
|
| - QuotaSettingsCallbackQueue settings_callbacks_;
|
| - StorageCapacityCallbackQueue storage_capacity_callbacks_;
|
|
|
| GetOriginCallback lru_origin_callback_;
|
| std::set<GURL> access_notified_origins_;
|
| @@ -439,10 +482,17 @@ class STORAGE_EXPORT QuotaManager
|
|
|
| std::unique_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_;
|
| EvictionContext eviction_context_;
|
| + std::unique_ptr<QuotaEvictionPolicy> temporary_storage_eviction_policy_;
|
| bool is_getting_eviction_origin_;
|
|
|
| + ClosureQueue db_initialization_callbacks_;
|
| + AvailableSpaceCallbackQueue available_space_callbacks_;
|
| HostQuotaCallbackMap persistent_host_quota_callbacks_;
|
|
|
| + bool temporary_quota_initialized_;
|
| + int64_t temporary_quota_override_;
|
| + int64_t desired_available_space_;
|
| +
|
| // Map from origin to count.
|
| std::map<GURL, int> origins_in_use_;
|
| // Map from origin to error count.
|
|
|