| Index: chrome/browser/performance_monitor/database.h
|
| diff --git a/chrome/browser/performance_monitor/database.h b/chrome/browser/performance_monitor/database.h
|
| deleted file mode 100644
|
| index 87082cd7b9edd33c734e4eb58f2236cfa88c4cea..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/performance_monitor/database.h
|
| +++ /dev/null
|
| @@ -1,323 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef CHROME_BROWSER_PERFORMANCE_MONITOR_DATABASE_H_
|
| -#define CHROME_BROWSER_PERFORMANCE_MONITOR_DATABASE_H_
|
| -
|
| -#include <set>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/files/file_path.h"
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/memory/linked_ptr.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/time/time.h"
|
| -#include "chrome/browser/performance_monitor/constants.h"
|
| -#include "chrome/browser/performance_monitor/event.h"
|
| -#include "chrome/browser/performance_monitor/metric.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/db.h"
|
| -
|
| -namespace performance_monitor {
|
| -
|
| -struct TimeRange {
|
| - TimeRange();
|
| - TimeRange(base::Time start_time, base::Time end_time);
|
| - ~TimeRange();
|
| -
|
| - base::Time start;
|
| - base::Time end;
|
| -};
|
| -
|
| -class KeyBuilder;
|
| -class DatabaseTestHelper;
|
| -
|
| -// The class supporting all performance monitor storage. This class wraps
|
| -// multiple leveldb::DB objects. All methods must be called from a background
|
| -// thread. Callers should use BrowserThread::PostBlockingPoolSequencedTask using
|
| -// performance_monitor::kDBSequenceToken as the sequence token.
|
| -//
|
| -// Different schemas are used for the different leveldb::DB's based off of the
|
| -// structure of the data and the common ways that it will need to be accessed.
|
| -// The following specifies the schema of each type of leveldb::DB. Delimiters
|
| -// are denoted with a '-'.
|
| -//
|
| -// State DB:
|
| -// Stores information about the configuration or 'state' of the browser. Things
|
| -// like browser version go in here.
|
| -// Key: Unique Identifier
|
| -// Value: State Value
|
| -//
|
| -// Active Interval DB:
|
| -// Stores information about when there is data in the database. When the
|
| -// database is constructed, the time is noted as the start of the active
|
| -// interval. Then, every write operation the current time is marked as the end
|
| -// of the current active interval. If the database has no write operations for
|
| -// a certain amount of time, then the database is considered inactive for that
|
| -// time period and a new start time is noted. Having the key be the beginning
|
| -// of the active interval allows for efficient upserts to the current active
|
| -// interval. If the end of the active interval was in the key, then every update
|
| -// to the active interval would have to remove a key and insert a new one.
|
| -// Key: Beginning of ActiveInterval
|
| -// Value: End of ActiveInterval
|
| -//
|
| -// Event DB:
|
| -// Stores all events. A time and type is enough to uniquely identify an event.
|
| -// Using the time that the event took place as the beginning of the key allows
|
| -// us to efficiently answer the question: "What are all the events that took
|
| -// place in this time range?".
|
| -// Key: Time - Type
|
| -// Value: Event in JSON
|
| -//
|
| -// Recent DB:
|
| -// Stores the most recent metric statistics to go into the database. There is
|
| -// only ever one entry per (metric, activity) pair. |recent_map_| keeps an
|
| -// in-memory version of this database with a mapping from a concatenation of
|
| -// metric and activity to the key used in the recent db. |recent_map_| allows us
|
| -// to quickly find the key that must be replaced in the recent db. This
|
| -// database becomes useful when it is necessary to find all the active metrics
|
| -// within a timerange. Without it, all the metric databases would need to be
|
| -// searched to see if that metric is active.
|
| -// Key: Time - Metric - Activity
|
| -// Value: Statistic
|
| -//
|
| -// Max Value DB:
|
| -// Stores the max metric statistics that have been inserted into the database.
|
| -// There is only ever one entry per (metric, activity) pair. |max_value_map_|
|
| -// keeps an in-memory version of this database with a mapping from a
|
| -// concatenation of metric and activity to the max metric.
|
| -// Key: Metric - Activity
|
| -// Value: Statistic
|
| -//
|
| -// Metric DB:
|
| -// Stores the statistics for different metrics. Having the time before the
|
| -// activity ensures that the search space can only be as large as the time
|
| -// interval.
|
| -// Key: Metric - Time - Activity
|
| -// Value: Statistic
|
| -class Database {
|
| - public:
|
| - typedef std::set<EventType> EventTypeSet;
|
| - typedef std::vector<linked_ptr<Event> > EventVector;
|
| - typedef std::set<MetricType> MetricTypeSet;
|
| - typedef std::vector<Metric> MetricVector;
|
| - typedef std::map<std::string, linked_ptr<MetricVector> > MetricVectorMap;
|
| -
|
| - static const char kDatabaseSequenceToken[];
|
| -
|
| - // The class that the database will use to infer time. Abstracting out the
|
| - // time mechanism allows for easy testing and mock data insetion.
|
| - class Clock {
|
| - public:
|
| - Clock() {}
|
| - virtual ~Clock() {}
|
| - virtual base::Time GetTime() = 0;
|
| - };
|
| -
|
| - virtual ~Database();
|
| -
|
| - static scoped_ptr<Database> Create(base::FilePath path);
|
| -
|
| - // A "state" value is anything that can only have one value at a time, and
|
| - // usually describes the state of the browser eg. version.
|
| - bool AddStateValue(const std::string& key, const std::string& value);
|
| -
|
| - std::string GetStateValue(const std::string& key);
|
| -
|
| - // Add an event to the database.
|
| - bool AddEvent(const Event& event);
|
| -
|
| - // Retrieve the events from the database. These methods populate the provided
|
| - // vector, and will search on the given criteria.
|
| - EventVector GetEvents(EventType type,
|
| - const base::Time& start,
|
| - const base::Time& end);
|
| -
|
| - EventVector GetEvents(const base::Time& start, const base::Time& end) {
|
| - return GetEvents(EVENT_UNDEFINED, start, end);
|
| - }
|
| -
|
| - EventVector GetEvents(EventType type) {
|
| - return GetEvents(type, base::Time(), clock_->GetTime());
|
| - }
|
| -
|
| - EventVector GetEvents() {
|
| - return GetEvents(EVENT_UNDEFINED, base::Time(), clock_->GetTime());
|
| - }
|
| -
|
| - EventTypeSet GetEventTypes(const base::Time& start, const base::Time& end);
|
| -
|
| - EventTypeSet GetEventTypes() {
|
| - return GetEventTypes(base::Time(), clock_->GetTime());
|
| - }
|
| -
|
| - // Add a metric instance to the database.
|
| - bool AddMetric(const std::string& activity, const Metric& metric);
|
| -
|
| - bool AddMetric(const Metric& metric) {
|
| - return AddMetric(kProcessChromeAggregate, metric);
|
| - }
|
| -
|
| - // Get the metrics that are active for the given process between |start|
|
| - // (inclusive) and |end| (exclusive).
|
| - MetricTypeSet GetActiveMetrics(const base::Time& start,
|
| - const base::Time& end);
|
| -
|
| - // Get the activities that are active for the given metric after |start|.
|
| - std::set<std::string> GetActiveActivities(MetricType metric_type,
|
| - const base::Time& start);
|
| -
|
| - // Get the max value for the given metric in the db.
|
| - double GetMaxStatsForActivityAndMetric(const std::string& activity,
|
| - MetricType metric_type);
|
| - double GetMaxStatsForActivityAndMetric(MetricType metric_type) {
|
| - return GetMaxStatsForActivityAndMetric(kProcessChromeAggregate,
|
| - metric_type);
|
| - }
|
| -
|
| - // Populate info with the most recent activity. Return false if populate
|
| - // was unsuccessful.
|
| - bool GetRecentStatsForActivityAndMetric(const std::string& activity,
|
| - MetricType metric_type,
|
| - Metric* metric);
|
| -
|
| - bool GetRecentStatsForActivityAndMetric(MetricType metric_type,
|
| - Metric* metric) {
|
| - return GetRecentStatsForActivityAndMetric(kProcessChromeAggregate,
|
| - metric_type,
|
| - metric);
|
| - }
|
| -
|
| - // Query given |metric_type| and |activity|.
|
| - scoped_ptr<MetricVector> GetStatsForActivityAndMetric(
|
| - const std::string& activity,
|
| - MetricType metric_type,
|
| - const base::Time& start,
|
| - const base::Time& end);
|
| -
|
| - scoped_ptr<MetricVector> GetStatsForActivityAndMetric(
|
| - MetricType metric_type, const base::Time& start, const base::Time& end) {
|
| - return GetStatsForActivityAndMetric(kProcessChromeAggregate, metric_type,
|
| - start, end);
|
| - }
|
| -
|
| - scoped_ptr<MetricVector> GetStatsForActivityAndMetric(
|
| - const std::string& activity, MetricType metric_type) {
|
| - return GetStatsForActivityAndMetric(activity, metric_type, base::Time(),
|
| - clock_->GetTime());
|
| - }
|
| -
|
| - scoped_ptr<MetricVector> GetStatsForActivityAndMetric(
|
| - MetricType metric_type) {
|
| - return GetStatsForActivityAndMetric(kProcessChromeAggregate, metric_type,
|
| - base::Time(), clock_->GetTime());
|
| - }
|
| -
|
| - // Query given |metric_type|. The returned map is keyed by activity.
|
| - MetricVectorMap GetStatsForMetricByActivity(MetricType metric_type,
|
| - const base::Time& start,
|
| - const base::Time& end);
|
| -
|
| - MetricVectorMap GetStatsForMetricByActivity(MetricType metric_type) {
|
| - return GetStatsForMetricByActivity(
|
| - metric_type, base::Time(), clock_->GetTime());
|
| - }
|
| -
|
| - // Returns the active time intervals that overlap with the time interval
|
| - // defined by |start| and |end|.
|
| - std::vector<TimeRange> GetActiveIntervals(const base::Time& start,
|
| - const base::Time& end);
|
| -
|
| - base::FilePath path() const { return path_; }
|
| -
|
| - void set_clock(scoped_ptr<Clock> clock) {
|
| - clock_ = clock.Pass();
|
| - }
|
| -
|
| - private:
|
| - friend class DatabaseTestHelper;
|
| -
|
| - typedef std::map<std::string, std::string> RecentMap;
|
| - typedef std::map<std::string, double> MaxValueMap;
|
| -
|
| - // By default, the database uses a clock that simply returns the current time.
|
| - class SystemClock : public Clock {
|
| - public:
|
| - SystemClock() {}
|
| - virtual ~SystemClock() {}
|
| - virtual base::Time GetTime() OVERRIDE;
|
| - };
|
| -
|
| - explicit Database(const base::FilePath& path);
|
| -
|
| - bool InitDBs();
|
| -
|
| - // Attempts to open a database, and tries to fix it if it is corrupt or
|
| - // damaged (if |fix_if_damaged| is true). Returns a scoped_ptr to the
|
| - // database on success, or NULL on failure.
|
| - scoped_ptr<leveldb::DB> SafelyOpenDatabase(
|
| - const leveldb::Options& options,
|
| - const std::string& path,
|
| - bool fix_if_damaged);
|
| -
|
| - bool Close();
|
| -
|
| - // Load recent info from the db into recent_map_.
|
| - void LoadRecents();
|
| - // Load max values from the db into the max_value_map_.
|
| - void LoadMaxValues();
|
| -
|
| - // Mark the database as being active for the current time.
|
| - void UpdateActiveInterval();
|
| - // Updates the max_value_map_ and max_value_db_ if the value is greater than
|
| - // the current max value for the given activity and metric.
|
| - bool UpdateMaxValue(const std::string& activity,
|
| - MetricType metric,
|
| - const std::string& value);
|
| -
|
| - scoped_ptr<KeyBuilder> key_builder_;
|
| -
|
| - // A mapping of id,metric to the last inserted key for those parameters
|
| - // is maintained to prevent having to search through the recent db every
|
| - // insert.
|
| - RecentMap recent_map_;
|
| -
|
| - MaxValueMap max_value_map_;
|
| -
|
| - // The directory where all the databases will reside.
|
| - base::FilePath path_;
|
| -
|
| - // The key for the beginning of the active interval.
|
| - std::string start_time_key_;
|
| -
|
| - // The last time the database had a transaction.
|
| - base::Time last_update_time_;
|
| -
|
| - scoped_ptr<Clock> clock_;
|
| -
|
| - scoped_ptr<leveldb::DB> recent_db_;
|
| -
|
| - scoped_ptr<leveldb::DB> max_value_db_;
|
| -
|
| - scoped_ptr<leveldb::DB> state_db_;
|
| -
|
| - scoped_ptr<leveldb::DB> active_interval_db_;
|
| -
|
| - scoped_ptr<leveldb::DB> metric_db_;
|
| -
|
| - scoped_ptr<leveldb::DB> event_db_;
|
| -
|
| - leveldb::ReadOptions read_options_;
|
| - leveldb::WriteOptions write_options_;
|
| -
|
| - // Indicates whether or not the database successfully initialized. If false,
|
| - // the Create() call will return NULL.
|
| - bool valid_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Database);
|
| -};
|
| -
|
| -} // namespace performance_monitor
|
| -
|
| -#endif // CHROME_BROWSER_PERFORMANCE_MONITOR_DATABASE_H_
|
|
|