diff options
Diffstat (limited to 'chrome/browser/net/passive_log_collector.h')
-rw-r--r-- | chrome/browser/net/passive_log_collector.h | 540 |
1 files changed, 0 insertions, 540 deletions
diff --git a/chrome/browser/net/passive_log_collector.h b/chrome/browser/net/passive_log_collector.h deleted file mode 100644 index 701c5c3..0000000 --- a/chrome/browser/net/passive_log_collector.h +++ /dev/null @@ -1,540 +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_NET_PASSIVE_LOG_COLLECTOR_H_ -#define CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ -#pragma once - -#include <deque> -#include <string> -#include <vector> - -#include "base/gtest_prod_util.h" -#include "base/hash_tables.h" -#include "base/memory/ref_counted.h" -#include "base/time.h" -#include "chrome/browser/net/chrome_net_log.h" -#include "net/base/net_log.h" - -// PassiveLogCollector watches the NetLog event stream, and saves the network -// events for recent requests, in a circular buffer. -// -// This is done so that when a network problem is encountered (performance -// problem, or error), about:net-internals can be opened shortly after the -// problem and it will contain a trace for the problem request. -// -// (This is in contrast to the "active logging" which captures every single -// network event, but requires capturing to have been enabled *prior* to -// encountering the problem. Active capturing is enabled as long as -// about:net-internals is open). -// -// The data captured by PassiveLogCollector is grouped by NetLog::Source, into -// a SourceInfo structure. These in turn are grouped by NetLog::SourceType, and -// owned by a SourceTracker instance for the specific source type. -// -// The PassiveLogCollector is owned by the ChromeNetLog itself, and is not -// thread safe. The ChromeNetLog is responsible for calling it in a thread safe -// manner. -class PassiveLogCollector : public ChromeNetLog::ThreadSafeObserverImpl { - public: - typedef std::vector<net::NetLog::Source> SourceDependencyList; - - struct SourceInfo { - SourceInfo(); - ~SourceInfo(); - - // Returns the URL that corresponds with this source. This is - // only meaningful for certain source types (URL_REQUEST, SOCKET_STREAM). - // For the rest, it will return an empty string. - std::string GetURL() const; - - uint32 source_id; - ChromeNetLog::EntryList entries; - size_t num_entries_truncated; - - // List of other sources which contain information relevant to this - // source (for example, a url request might depend on the log items - // for a connect job and for a socket that were bound to it.) - SourceDependencyList dependencies; - - // Holds the count of how many other sources have added this as a - // dependent source. When it is 0, it means noone has referenced it so it - // can be deleted normally. - int reference_count; - - // |is_alive| is set to false once the source has been added to the - // tracker's graveyard (it may still be kept around due to a non-zero - // reference_count, but it is still considered "dead"). - bool is_alive; - }; - - typedef std::vector<SourceInfo> SourceInfoList; - - // Interface for consuming a NetLog entry. - class SourceTrackerInterface { - public: - virtual ~SourceTrackerInterface() {} - - virtual void OnAddEntry(const ChromeNetLog::Entry& entry) = 0; - - // Clears all the passively logged data from this tracker. - virtual void Clear() = 0; - - // Appends all the captured entries to |out|. The ordering is undefined. - virtual void AppendAllEntries(ChromeNetLog::EntryList* out) const = 0; - }; - - // This source tracker is intended for TYPE_NONE. All entries go into a - // circular buffer, and there is no concept of live/dead requests. - class GlobalSourceTracker : public SourceTrackerInterface { - public: - GlobalSourceTracker(); - virtual ~GlobalSourceTracker(); - - // SourceTrackerInterface implementation: - virtual void OnAddEntry(const ChromeNetLog::Entry& entry) OVERRIDE; - virtual void Clear() OVERRIDE; - virtual void AppendAllEntries(ChromeNetLog::EntryList* out) const OVERRIDE; - - private: - typedef std::deque<ChromeNetLog::Entry> CircularEntryList; - CircularEntryList entries_; - DISALLOW_COPY_AND_ASSIGN(GlobalSourceTracker); - }; - - // This class stores and manages the passively logged information for - // URLRequests/SocketStreams/ConnectJobs. - class SourceTracker : public SourceTrackerInterface { - public: - // Creates a SourceTracker that will track at most |max_num_sources|. - // Up to |max_graveyard_size| unreferenced sources will be kept around - // before deleting them for good. |parent| may be NULL, and points to - // the owning PassiveLogCollector (it is used when adding references - // to other sources). - SourceTracker(size_t max_num_sources, - size_t max_graveyard_size, - PassiveLogCollector* parent); - - virtual ~SourceTracker(); - - // SourceTrackerInterface implementation: - virtual void OnAddEntry(const ChromeNetLog::Entry& entry) OVERRIDE; - virtual void Clear() OVERRIDE; - virtual void AppendAllEntries(ChromeNetLog::EntryList* out) const OVERRIDE; - -#ifdef UNIT_TEST - // Helper used to inspect the current state by unit-tests. - // Retuns a copy of the source infos held by the tracker. - SourceInfoList GetAllDeadOrAliveSources(bool is_alive) const { - SourceInfoList result; - for (SourceIDToInfoMap::const_iterator it = sources_.begin(); - it != sources_.end(); ++it) { - if (it->second.is_alive == is_alive) - result.push_back(it->second); - } - return result; - } -#endif - - protected: - enum Action { - ACTION_NONE, - ACTION_DELETE, - ACTION_MOVE_TO_GRAVEYARD, - }; - - // Makes |info| hold a reference to |source|. This way |source| will be - // kept alive at least as long as |info|. - void AddReferenceToSourceDependency(const net::NetLog::Source& source, - SourceInfo* info); - - private: - typedef base::hash_map<uint32, SourceInfo> SourceIDToInfoMap; - typedef std::deque<uint32> DeletionQueue; - - // Updates |out_info| with the information from |entry|. Returns an action - // to perform for this map entry on completion. - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) = 0; - - // Removes |source_id| from |sources_|. This also releases any references - // to dependencies held by this source. - void DeleteSourceInfo(uint32 source_id); - - // Adds |source_id| to the FIFO queue (graveyard) for deletion. - void AddToDeletionQueue(uint32 source_id); - - // Removes |source_id| from the |deletion_queue_| container. - void EraseFromDeletionQueue(uint32 source_id); - - // Adds/Releases a reference from the source with ID |source_id|. - // Use |offset=-1| to do a release, and |offset=1| for an addref. - void AdjustReferenceCountForSource(int offset, uint32 source_id); - - // Releases all the references to sources held by |info|. - void ReleaseAllReferencesToDependencies(SourceInfo* info); - - // This map contains all of the sources being tracked by this tracker. - // (It includes both the "live" sources, and the "dead" ones.) - SourceIDToInfoMap sources_; - - size_t max_num_sources_; - size_t max_graveyard_size_; - - // FIFO queue for entries in |sources_| that are no longer alive, and - // can be deleted. This buffer is also called "graveyard" elsewhere. We - // queue sources for deletion so they can persist a bit longer. - DeletionQueue deletion_queue_; - - PassiveLogCollector* parent_; - - DISALLOW_COPY_AND_ASSIGN(SourceTracker); - }; - - // Specialization of SourceTracker for handling ConnectJobs. - class ConnectJobTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - explicit ConnectJobTracker(PassiveLogCollector* parent); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - DISALLOW_COPY_AND_ASSIGN(ConnectJobTracker); - }; - - // Specialization of SourceTracker for handling Sockets. - class SocketTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - SocketTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(SocketTracker); - }; - - // Specialization of SourceTracker for handling net::URLRequest/SocketStream. - class RequestTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - explicit RequestTracker(PassiveLogCollector* parent); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(RequestTracker); - }; - - // Specialization of SourceTracker for handling - // SOURCE_PROXY_SCRIPT_DECIDER. - class ProxyScriptDeciderTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - ProxyScriptDeciderTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(ProxyScriptDeciderTracker); - }; - - // Tracks the log entries for the last seen SOURCE_SPDY_SESSION. - class SpdySessionTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - SpdySessionTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(SpdySessionTracker); - }; - - // Tracks the log entries for the last seen SOURCE_HOST_RESOLVER_IMPL_REQUEST. - class HostResolverRequestTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - HostResolverRequestTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(HostResolverRequestTracker); - }; - - // Tracks the log entries for the last seen SOURCE_HOST_RESOLVER_IMPL_JOB. - class HostResolverJobTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - HostResolverJobTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(HostResolverJobTracker); - }; - - // Tracks the log entries for the last seen - // SOURCE_HOST_RESOLVER_IMPL_PROC_TASK. - class HostResolverProcTaskTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - HostResolverProcTaskTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(HostResolverProcTaskTracker); - }; - - // Tracks the log entries for the last seen SOURCE_DISK_CACHE_ENTRY. - class DiskCacheEntryTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - DiskCacheEntryTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(DiskCacheEntryTracker); - }; - - // Tracks the log entries for the last seen SOURCE_DISK_CACHE_ENTRY. - class MemCacheEntryTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - MemCacheEntryTracker(); - - protected: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - private: - DISALLOW_COPY_AND_ASSIGN(MemCacheEntryTracker); - }; - - class HttpStreamJobTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - explicit HttpStreamJobTracker(PassiveLogCollector* parent); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - DISALLOW_COPY_AND_ASSIGN(HttpStreamJobTracker); - }; - - class ExponentialBackoffThrottlingTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - explicit ExponentialBackoffThrottlingTracker(PassiveLogCollector* parent); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - DISALLOW_COPY_AND_ASSIGN(ExponentialBackoffThrottlingTracker); - }; - - // Tracks the log entries for the last seen SOURCE_DNS_TRANSACTION. - class DnsTransactionTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - DnsTransactionTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(DnsTransactionTracker); - }; - - // Tracks the log entries for the last seen SOURCE_ASYNC_HOST_RESOLVER_REQUEST - class AsyncHostResolverRequestTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - AsyncHostResolverRequestTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(AsyncHostResolverRequestTracker); - }; - - - // Tracks the log entries for the last seen SOURCE_UDP_SOCKET. - class UDPSocketTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - UDPSocketTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(UDPSocketTracker); - }; - - // Tracks the log entries for the last seen SOURCE_CERT_VERIFIER_JOB. - class CertVerifierJobTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - CertVerifierJobTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(CertVerifierJobTracker); - }; - - // Tracks the log entries for the last seen SOURCE_HTTP_PIPELINED_CONNECTION. - class HttpPipelinedConnectionTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - HttpPipelinedConnectionTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(HttpPipelinedConnectionTracker); - }; - - // Tracks the log entries for the last seen SOURCE_DOWNLOAD. - class DownloadTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - DownloadTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(DownloadTracker); - }; - - // Tracks the log entries for the last seen SOURCE_FILESTREAM. - class FileStreamTracker : public SourceTracker { - public: - static const size_t kMaxNumSources; - static const size_t kMaxGraveyardSize; - - FileStreamTracker(); - - private: - virtual Action DoAddEntry(const ChromeNetLog::Entry& entry, - SourceInfo* out_info) OVERRIDE; - - DISALLOW_COPY_AND_ASSIGN(FileStreamTracker); - }; - - PassiveLogCollector(); - virtual ~PassiveLogCollector(); - - // ThreadSafeObserver implementation: - virtual void OnAddEntry(net::NetLog::EventType type, - const base::TimeTicks& time, - const net::NetLog::Source& source, - net::NetLog::EventPhase phase, - net::NetLog::EventParameters* params) OVERRIDE; - - // Clears all of the passively logged data. - void Clear(); - - // Fills |out| with the full list of events that have been passively - // captured. The list is ordered by capture time. - void GetAllCapturedEvents(ChromeNetLog::EntryList* out) const; - - private: - // Returns the tracker to use for sources of type |source_type|, or NULL. - SourceTrackerInterface* GetTrackerForSourceType( - net::NetLog::SourceType source_type); - - FRIEND_TEST_ALL_PREFIXES(PassiveLogCollectorTest, - HoldReferenceToDependentSource); - FRIEND_TEST_ALL_PREFIXES(PassiveLogCollectorTest, - HoldReferenceToDeletedSource); - - GlobalSourceTracker global_source_tracker_; - ConnectJobTracker connect_job_tracker_; - SocketTracker socket_tracker_; - RequestTracker url_request_tracker_; - RequestTracker socket_stream_tracker_; - ProxyScriptDeciderTracker proxy_script_decider_tracker_; - SpdySessionTracker spdy_session_tracker_; - HostResolverRequestTracker dns_request_tracker_; - HostResolverJobTracker dns_job_tracker_; - HostResolverProcTaskTracker dns_proc_task_tracker_; - DiskCacheEntryTracker disk_cache_entry_tracker_; - MemCacheEntryTracker mem_cache_entry_tracker_; - HttpStreamJobTracker http_stream_job_tracker_; - ExponentialBackoffThrottlingTracker exponential_backoff_throttling_tracker_; - DnsTransactionTracker dns_transaction_tracker_; - AsyncHostResolverRequestTracker async_host_resolver_request_tracker_; - UDPSocketTracker udp_socket_tracker_; - CertVerifierJobTracker cert_verifier_job_tracker_; - HttpPipelinedConnectionTracker http_pipelined_connection_tracker_; - DownloadTracker download_tracker_; - FileStreamTracker file_stream_tracker_; - - // This array maps each NetLog::SourceType to one of the tracker instances - // defined above. Use of this array avoid duplicating the list of trackers - // elsewhere. - SourceTrackerInterface* trackers_[net::NetLog::SOURCE_COUNT]; - - // The count of how many events have flowed through this log. Used to set the - // "order" field on captured events. - uint32 num_events_seen_; - - DISALLOW_COPY_AND_ASSIGN(PassiveLogCollector); -}; - -#endif // CHROME_BROWSER_NET_PASSIVE_LOG_COLLECTOR_H_ |