| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_HTTP_DISK_CACHE_BASED_QUIC_SERVER_INFO_H_ | |
| 6 #define NET_HTTP_DISK_CACHE_BASED_QUIC_SERVER_INFO_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/memory/ref_counted.h" | |
| 11 #include "base/memory/weak_ptr.h" | |
| 12 #include "base/threading/non_thread_safe.h" | |
| 13 #include "base/time/time.h" | |
| 14 #include "net/base/completion_callback.h" | |
| 15 #include "net/disk_cache/disk_cache.h" | |
| 16 #include "net/quic/crypto/quic_server_info.h" | |
| 17 | |
| 18 namespace net { | |
| 19 | |
| 20 class HttpCache; | |
| 21 class IOBuffer; | |
| 22 class QuicServerId; | |
| 23 | |
| 24 // DiskCacheBasedQuicServerInfo fetches information about a QUIC server from | |
| 25 // our standard disk cache. Since the information is defined to be | |
| 26 // non-sensitive, it's ok for us to keep it on disk. | |
| 27 class NET_EXPORT_PRIVATE DiskCacheBasedQuicServerInfo | |
| 28 : public QuicServerInfo, | |
| 29 public NON_EXPORTED_BASE(base::NonThreadSafe) { | |
| 30 public: | |
| 31 DiskCacheBasedQuicServerInfo(const QuicServerId& server_id, | |
| 32 HttpCache* http_cache); | |
| 33 | |
| 34 // QuicServerInfo implementation. | |
| 35 void Start() override; | |
| 36 int WaitForDataReady(const CompletionCallback& callback) override; | |
| 37 void ResetWaitForDataReadyCallback() override; | |
| 38 void CancelWaitForDataReadyCallback() override; | |
| 39 bool IsDataReady() override; | |
| 40 bool IsReadyToPersist() override; | |
| 41 void Persist() override; | |
| 42 void OnExternalCacheHit() override; | |
| 43 | |
| 44 private: | |
| 45 struct CacheOperationDataShim; | |
| 46 | |
| 47 enum State { | |
| 48 GET_BACKEND, | |
| 49 GET_BACKEND_COMPLETE, | |
| 50 OPEN, | |
| 51 OPEN_COMPLETE, | |
| 52 READ, | |
| 53 READ_COMPLETE, | |
| 54 WAIT_FOR_DATA_READY_DONE, | |
| 55 CREATE_OR_OPEN, | |
| 56 CREATE_OR_OPEN_COMPLETE, | |
| 57 WRITE, | |
| 58 WRITE_COMPLETE, | |
| 59 SET_DONE, | |
| 60 NONE, | |
| 61 }; | |
| 62 | |
| 63 // Enum to track number of times data read/parse/write API calls of | |
| 64 // QuicServerInfo to and from disk cache is called. | |
| 65 enum QuicServerInfoAPICall { | |
| 66 QUIC_SERVER_INFO_START = 0, | |
| 67 QUIC_SERVER_INFO_WAIT_FOR_DATA_READY = 1, | |
| 68 QUIC_SERVER_INFO_PARSE = 2, | |
| 69 QUIC_SERVER_INFO_WAIT_FOR_DATA_READY_CANCEL = 3, | |
| 70 QUIC_SERVER_INFO_READY_TO_PERSIST = 4, | |
| 71 QUIC_SERVER_INFO_PERSIST = 5, | |
| 72 QUIC_SERVER_INFO_EXTERNAL_CACHE_HIT = 6, | |
| 73 QUIC_SERVER_INFO_NUM_OF_API_CALLS = 7, | |
| 74 }; | |
| 75 | |
| 76 // Enum to track failure reasons to read/load/write of QuicServerInfo to | |
| 77 // and from disk cache. | |
| 78 enum FailureReason { | |
| 79 WAIT_FOR_DATA_READY_INVALID_ARGUMENT_FAILURE = 0, | |
| 80 GET_BACKEND_FAILURE = 1, | |
| 81 OPEN_FAILURE = 2, | |
| 82 CREATE_OR_OPEN_FAILURE = 3, | |
| 83 PARSE_NO_DATA_FAILURE = 4, | |
| 84 PARSE_FAILURE = 5, | |
| 85 READ_FAILURE = 6, | |
| 86 READY_TO_PERSIST_FAILURE = 7, | |
| 87 PERSIST_NO_BACKEND_FAILURE = 8, | |
| 88 WRITE_FAILURE = 9, | |
| 89 NO_FAILURE = 10, | |
| 90 NUM_OF_FAILURES = 11, | |
| 91 }; | |
| 92 | |
| 93 ~DiskCacheBasedQuicServerInfo() override; | |
| 94 | |
| 95 // Persists |pending_write_data_| if it is not empty, otherwise serializes the | |
| 96 // data and pesists it. | |
| 97 void PersistInternal(); | |
| 98 | |
| 99 std::string key() const; | |
| 100 | |
| 101 // The |unused| parameter is a small hack so that we can have the | |
| 102 // CacheOperationDataShim object owned by the Callback that is created for | |
| 103 // this method. See comment above CacheOperationDataShim for details. | |
| 104 void OnIOComplete(CacheOperationDataShim* unused, int rv); | |
| 105 | |
| 106 int DoLoop(int rv); | |
| 107 | |
| 108 int DoGetBackendComplete(int rv); | |
| 109 int DoOpenComplete(int rv); | |
| 110 int DoReadComplete(int rv); | |
| 111 int DoWriteComplete(int rv); | |
| 112 int DoCreateOrOpenComplete(int rv); | |
| 113 | |
| 114 int DoGetBackend(); | |
| 115 int DoOpen(); | |
| 116 int DoRead(); | |
| 117 int DoWrite(); | |
| 118 int DoCreateOrOpen(); | |
| 119 | |
| 120 // DoWaitForDataReadyDone is the terminal state of the read operation. | |
| 121 int DoWaitForDataReadyDone(); | |
| 122 | |
| 123 // DoSetDone is the terminal state of the write operation. | |
| 124 int DoSetDone(); | |
| 125 | |
| 126 // Tracks in a histogram the number of times data read/parse/write API calls | |
| 127 // of QuicServerInfo to and from disk cache is called. | |
| 128 void RecordQuicServerInfoStatus(QuicServerInfoAPICall call); | |
| 129 | |
| 130 // Tracks in a histogram the failure reasons to read/load/write of | |
| 131 // QuicServerInfo to and from disk cache. It also saves the |failure| in | |
| 132 // |last_failure_|. | |
| 133 void RecordQuicServerInfoFailure(FailureReason failure); | |
| 134 | |
| 135 // Tracks in a histogram if |last_failure_| is not NO_FAILURE. | |
| 136 void RecordLastFailure(); | |
| 137 | |
| 138 CacheOperationDataShim* data_shim_; // Owned by |io_callback_|. | |
| 139 CompletionCallback io_callback_; | |
| 140 State state_; | |
| 141 bool ready_; | |
| 142 bool found_entry_; // Controls the behavior of DoCreateOrOpen. | |
| 143 std::string new_data_; | |
| 144 std::string pending_write_data_; | |
| 145 const QuicServerId server_id_; | |
| 146 HttpCache* const http_cache_; | |
| 147 disk_cache::Backend* backend_; | |
| 148 disk_cache::Entry* entry_; | |
| 149 CompletionCallback wait_for_ready_callback_; | |
| 150 scoped_refptr<IOBuffer> read_buffer_; | |
| 151 scoped_refptr<IOBuffer> write_buffer_; | |
| 152 std::string data_; | |
| 153 base::TimeTicks load_start_time_; | |
| 154 FailureReason last_failure_; | |
| 155 | |
| 156 base::WeakPtrFactory<DiskCacheBasedQuicServerInfo> weak_factory_; | |
| 157 | |
| 158 DISALLOW_COPY_AND_ASSIGN(DiskCacheBasedQuicServerInfo); | |
| 159 }; | |
| 160 | |
| 161 } // namespace net | |
| 162 | |
| 163 #endif // NET_HTTP_DISK_CACHE_BASED_QUIC_SERVER_INFO_H_ | |
| OLD | NEW |