| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Performs basic inspection of the disk cache files with minimal disruption | 5 // Performs basic inspection of the disk cache files with minimal disruption |
| 6 // to the actual files (they still may change if an error is detected on the | 6 // to the actual files (they still may change if an error is detected on the |
| 7 // files). | 7 // files). |
| 8 | 8 |
| 9 #include "net/tools/dump_cache/dump_files.h" |
| 10 |
| 9 #include <stdio.h> | 11 #include <stdio.h> |
| 10 | 12 |
| 11 #include <set> | 13 #include <set> |
| 12 #include <string> | 14 #include <string> |
| 13 | 15 |
| 14 #include "base/file_util.h" | 16 #include "base/file_util.h" |
| 15 #include "base/message_loop.h" | 17 #include "base/message_loop.h" |
| 16 #include "net/base/file_stream.h" | 18 #include "net/base/file_stream.h" |
| 17 #include "net/disk_cache/block_files.h" | 19 #include "net/disk_cache/block_files.h" |
| 18 #include "net/disk_cache/disk_format.h" | 20 #include "net/disk_cache/disk_format.h" |
| 19 #include "net/disk_cache/mapped_file.h" | 21 #include "net/disk_cache/mapped_file.h" |
| 20 #include "net/disk_cache/storage_block.h" | 22 #include "net/disk_cache/storage_block.h" |
| 21 #include "net/disk_cache/storage_block-inl.h" | 23 #include "net/disk_cache/storage_block-inl.h" |
| 22 | 24 |
| 23 namespace { | 25 namespace { |
| 24 | 26 |
| 25 const wchar_t kIndexName[] = L"index"; | 27 const FilePath::CharType kIndexName[] = FILE_PATH_LITERAL("index"); |
| 26 | 28 |
| 27 // Reads the |header_size| bytes from the beginning of file |name|. | 29 // Reads the |header_size| bytes from the beginning of file |name|. |
| 28 bool ReadHeader(const FilePath& name, char* header, int header_size) { | 30 bool ReadHeader(const FilePath& name, char* header, int header_size) { |
| 29 net::FileStream file(NULL); | 31 net::FileStream file(NULL); |
| 30 file.OpenSync(name, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ); | 32 file.OpenSync(name, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ); |
| 31 if (!file.IsOpen()) { | 33 if (!file.IsOpen()) { |
| 32 printf("Unable to open file %ls\n", name.value().c_str()); | 34 printf("Unable to open file %s\n", name.MaybeAsASCII().c_str()); |
| 33 return false; | 35 return false; |
| 34 } | 36 } |
| 35 | 37 |
| 36 int read = file.ReadSync(header, header_size); | 38 int read = file.ReadSync(header, header_size); |
| 37 if (read != header_size) { | 39 if (read != header_size) { |
| 38 printf("Unable to read file %ls\n", name.value().c_str()); | 40 printf("Unable to read file %s\n", name.MaybeAsASCII().c_str()); |
| 39 return false; | 41 return false; |
| 40 } | 42 } |
| 41 return true; | 43 return true; |
| 42 } | 44 } |
| 43 | 45 |
| 44 int GetMajorVersionFromFile(const FilePath& name) { | 46 int GetMajorVersionFromFile(const FilePath& name) { |
| 45 disk_cache::IndexHeader header; | 47 disk_cache::IndexHeader header; |
| 46 if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) | 48 if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) |
| 47 return 0; | 49 return 0; |
| 48 | 50 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 75 printf("operation list: %d\n", header.lru.operation_list); | 77 printf("operation list: %d\n", header.lru.operation_list); |
| 76 printf("-------------------------\n\n"); | 78 printf("-------------------------\n\n"); |
| 77 } | 79 } |
| 78 | 80 |
| 79 // Dumps the contents of a block-file header. | 81 // Dumps the contents of a block-file header. |
| 80 void DumpBlockHeader(const FilePath& name) { | 82 void DumpBlockHeader(const FilePath& name) { |
| 81 disk_cache::BlockFileHeader header; | 83 disk_cache::BlockFileHeader header; |
| 82 if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) | 84 if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) |
| 83 return; | 85 return; |
| 84 | 86 |
| 85 printf("Block file: %ls\n", name.BaseName().value().c_str()); | 87 printf("Block file: %s\n", name.BaseName().MaybeAsASCII().c_str()); |
| 86 printf("magic: %x\n", header.magic); | 88 printf("magic: %x\n", header.magic); |
| 87 printf("version: %d.%d\n", header.version >> 16, header.version & 0xffff); | 89 printf("version: %d.%d\n", header.version >> 16, header.version & 0xffff); |
| 88 printf("file id: %d\n", header.this_file); | 90 printf("file id: %d\n", header.this_file); |
| 89 printf("next file id: %d\n", header.next_file); | 91 printf("next file id: %d\n", header.next_file); |
| 90 printf("entry size: %d\n", header.entry_size); | 92 printf("entry size: %d\n", header.entry_size); |
| 91 printf("current entries: %d\n", header.num_entries); | 93 printf("current entries: %d\n", header.num_entries); |
| 92 printf("max entries: %d\n", header.max_entries); | 94 printf("max entries: %d\n", header.max_entries); |
| 93 printf("updating: %d\n", header.updating); | 95 printf("updating: %d\n", header.updating); |
| 94 printf("empty sz 1: %d\n", header.empty[0]); | 96 printf("empty sz 1: %d\n", header.empty[0]); |
| 95 printf("empty sz 2: %d\n", header.empty[1]); | 97 printf("empty sz 2: %d\n", header.empty[1]); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 | 263 |
| 262 // ----------------------------------------------------------------------- | 264 // ----------------------------------------------------------------------- |
| 263 | 265 |
| 264 int GetMajorVersion(const FilePath& input_path) { | 266 int GetMajorVersion(const FilePath& input_path) { |
| 265 FilePath index_name(input_path.Append(kIndexName)); | 267 FilePath index_name(input_path.Append(kIndexName)); |
| 266 | 268 |
| 267 int version = GetMajorVersionFromFile(index_name); | 269 int version = GetMajorVersionFromFile(index_name); |
| 268 if (!version) | 270 if (!version) |
| 269 return 0; | 271 return 0; |
| 270 | 272 |
| 271 FilePath data_name(input_path.Append(L"data_0")); | 273 FilePath data_name(input_path.Append(FILE_PATH_LITERAL("data_0"))); |
| 272 if (version != GetMajorVersionFromFile(data_name)) | 274 if (version != GetMajorVersionFromFile(data_name)) |
| 273 return 0; | 275 return 0; |
| 274 | 276 |
| 275 data_name = input_path.Append(L"data_1"); | 277 data_name = input_path.Append(FILE_PATH_LITERAL("data_1")); |
| 276 if (version != GetMajorVersionFromFile(data_name)) | 278 if (version != GetMajorVersionFromFile(data_name)) |
| 277 return 0; | 279 return 0; |
| 278 | 280 |
| 281 data_name = input_path.Append(FILE_PATH_LITERAL("data_2")); |
| 282 if (version != GetMajorVersionFromFile(data_name)) |
| 283 return 0; |
| 284 |
| 285 data_name = input_path.Append(FILE_PATH_LITERAL("data_3")); |
| 286 if (version != GetMajorVersionFromFile(data_name)) |
| 287 return 0; |
| 288 |
| 279 return version; | 289 return version; |
| 280 } | 290 } |
| 281 | 291 |
| 282 // Dumps the headers of all files. | 292 // Dumps the headers of all files. |
| 283 int DumpHeaders(const FilePath& input_path) { | 293 int DumpHeaders(const FilePath& input_path) { |
| 284 FilePath index_name(input_path.Append(kIndexName)); | 294 FilePath index_name(input_path.Append(kIndexName)); |
| 285 DumpIndexHeader(index_name); | 295 DumpIndexHeader(index_name); |
| 286 | 296 |
| 287 file_util::FileEnumerator iter(input_path, false, | 297 file_util::FileEnumerator iter(input_path, false, |
| 288 file_util::FileEnumerator::FILES, L"data_*"); | 298 file_util::FileEnumerator::FILES, |
| 299 FILE_PATH_LITERAL("data_*")); |
| 289 for (FilePath file = iter.Next(); !file.empty(); file = iter.Next()) | 300 for (FilePath file = iter.Next(); !file.empty(); file = iter.Next()) |
| 290 DumpBlockHeader(file); | 301 DumpBlockHeader(file); |
| 291 return 0; | 302 return 0; |
| 292 } | 303 } |
| 293 | 304 |
| 294 // Dumps all entries from the cache. | 305 // Dumps all entries from the cache. |
| 295 int DumpContents(const FilePath& input_path) { | 306 int DumpContents(const FilePath& input_path) { |
| 296 DumpHeaders(input_path); | 307 DumpHeaders(input_path); |
| 297 | 308 |
| 298 // We need a message loop, although we really don't run any task. | 309 // We need a message loop, although we really don't run any task. |
| 299 MessageLoop loop(MessageLoop::TYPE_IO); | 310 MessageLoop loop(MessageLoop::TYPE_IO); |
| 300 CacheDumper dumper(input_path); | 311 CacheDumper dumper(input_path); |
| 301 if (!dumper.Init()) | 312 if (!dumper.Init()) |
| 302 return -1; | 313 return -1; |
| 303 | 314 |
| 304 disk_cache::EntryStore entry; | 315 disk_cache::EntryStore entry; |
| 305 while (dumper.GetEntry(&entry)) { | 316 while (dumper.GetEntry(&entry)) { |
| 306 DumpEntry(entry); | 317 DumpEntry(entry); |
| 307 disk_cache::RankingsNode rankings; | 318 disk_cache::RankingsNode rankings; |
| 308 if (dumper.LoadRankings(entry.rankings_node, &rankings)) | 319 if (dumper.LoadRankings(entry.rankings_node, &rankings)) |
| 309 DumpRankings(rankings); | 320 DumpRankings(rankings); |
| 310 } | 321 } |
| 311 | 322 |
| 312 printf("Done.\n"); | 323 printf("Done.\n"); |
| 313 | 324 |
| 314 return 0; | 325 return 0; |
| 315 } | 326 } |
| OLD | NEW |