Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 #include "net/disk_cache/simple/simple_synchronous_entry.h" | 5 #include "net/disk_cache/simple/simple_synchronous_entry.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 #include <functional> | 9 #include <functional> |
| 10 #include <limits> | 10 #include <limits> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/hash.h" | 15 #include "base/hash.h" |
| 16 #include "base/location.h" | 16 #include "base/location.h" |
| 17 #include "base/numerics/safe_conversions.h" | |
| 17 #include "base/sha1.h" | 18 #include "base/sha1.h" |
| 18 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
| 19 #include "net/base/io_buffer.h" | 20 #include "net/base/io_buffer.h" |
| 20 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
| 21 #include "net/disk_cache/simple/simple_backend_version.h" | 22 #include "net/disk_cache/simple/simple_backend_version.h" |
| 22 #include "net/disk_cache/simple/simple_histogram_macros.h" | 23 #include "net/disk_cache/simple/simple_histogram_macros.h" |
| 23 #include "net/disk_cache/simple/simple_util.h" | 24 #include "net/disk_cache/simple/simple_util.h" |
| 24 #include "third_party/zlib/zlib.h" | 25 #include "third_party/zlib/zlib.h" |
| 25 | 26 |
| 26 using base::File; | 27 using base::File; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 | 67 |
| 67 // Used in histograms, please only add entries at the end. | 68 // Used in histograms, please only add entries at the end. |
| 68 enum CloseResult { | 69 enum CloseResult { |
| 69 CLOSE_RESULT_SUCCESS, | 70 CLOSE_RESULT_SUCCESS, |
| 70 CLOSE_RESULT_WRITE_FAILURE, | 71 CLOSE_RESULT_WRITE_FAILURE, |
| 71 }; | 72 }; |
| 72 | 73 |
| 73 void RecordSyncOpenResult(net::CacheType cache_type, | 74 void RecordSyncOpenResult(net::CacheType cache_type, |
| 74 OpenEntryResult result, | 75 OpenEntryResult result, |
| 75 bool had_index) { | 76 bool had_index) { |
| 76 DCHECK_GT(OPEN_ENTRY_MAX, result); | 77 DCHECK_LT(result, OPEN_ENTRY_MAX); |
| 77 SIMPLE_CACHE_UMA(ENUMERATION, | 78 SIMPLE_CACHE_UMA(ENUMERATION, |
| 78 "SyncOpenResult", cache_type, result, OPEN_ENTRY_MAX); | 79 "SyncOpenResult", cache_type, result, OPEN_ENTRY_MAX); |
| 79 if (had_index) { | 80 if (had_index) { |
| 80 SIMPLE_CACHE_UMA(ENUMERATION, | 81 SIMPLE_CACHE_UMA(ENUMERATION, |
| 81 "SyncOpenResult_WithIndex", cache_type, | 82 "SyncOpenResult_WithIndex", cache_type, |
| 82 result, OPEN_ENTRY_MAX); | 83 result, OPEN_ENTRY_MAX); |
| 83 } else { | 84 } else { |
| 84 SIMPLE_CACHE_UMA(ENUMERATION, | 85 SIMPLE_CACHE_UMA(ENUMERATION, |
| 85 "SyncOpenResult_WithoutIndex", cache_type, | 86 "SyncOpenResult_WithoutIndex", cache_type, |
| 86 result, OPEN_ENTRY_MAX); | 87 result, OPEN_ENTRY_MAX); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 97 "SyncCheckEOFResult", cache_type, | 98 "SyncCheckEOFResult", cache_type, |
| 98 result, CHECK_EOF_RESULT_MAX); | 99 result, CHECK_EOF_RESULT_MAX); |
| 99 } | 100 } |
| 100 | 101 |
| 101 void RecordCloseResult(net::CacheType cache_type, CloseResult result) { | 102 void RecordCloseResult(net::CacheType cache_type, CloseResult result) { |
| 102 SIMPLE_CACHE_UMA(ENUMERATION, | 103 SIMPLE_CACHE_UMA(ENUMERATION, |
| 103 "SyncCloseResult", cache_type, result, WRITE_RESULT_MAX); | 104 "SyncCloseResult", cache_type, result, WRITE_RESULT_MAX); |
| 104 } | 105 } |
| 105 | 106 |
| 106 bool CanOmitEmptyFile(int file_index) { | 107 bool CanOmitEmptyFile(int file_index) { |
| 107 DCHECK_LE(0, file_index); | 108 DCHECK_GE(file_index, 0); |
|
rvargas (doing something else)
2014/10/08 20:01:14
Thanks for fixing all of these.
| |
| 108 DCHECK_GT(disk_cache::kSimpleEntryFileCount, file_index); | 109 DCHECK_LT(file_index, disk_cache::kSimpleEntryFileCount); |
| 109 return file_index == disk_cache::simple_util::GetFileIndexFromStreamIndex(2); | 110 return file_index == disk_cache::simple_util::GetFileIndexFromStreamIndex(2); |
| 110 } | 111 } |
| 111 | 112 |
| 112 } // namespace | 113 } // namespace |
| 113 | 114 |
| 114 namespace disk_cache { | 115 namespace disk_cache { |
| 115 | 116 |
| 116 using simple_util::GetEntryHashKey; | 117 using simple_util::GetEntryHashKey; |
| 117 using simple_util::GetFilenameFromEntryHashAndFileIndex; | 118 using simple_util::GetFilenameFromEntryHashAndFileIndex; |
| 118 using simple_util::GetSparseFilenameFromEntryHash; | 119 using simple_util::GetSparseFilenameFromEntryHash; |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 uint32* out_crc32, | 278 uint32* out_crc32, |
| 278 SimpleEntryStat* entry_stat, | 279 SimpleEntryStat* entry_stat, |
| 279 int* out_result) const { | 280 int* out_result) const { |
| 280 DCHECK(initialized_); | 281 DCHECK(initialized_); |
| 281 DCHECK_NE(0, in_entry_op.index); | 282 DCHECK_NE(0, in_entry_op.index); |
| 282 const int64 file_offset = | 283 const int64 file_offset = |
| 283 entry_stat->GetOffsetInFile(key_, in_entry_op.offset, in_entry_op.index); | 284 entry_stat->GetOffsetInFile(key_, in_entry_op.offset, in_entry_op.index); |
| 284 int file_index = GetFileIndexFromStreamIndex(in_entry_op.index); | 285 int file_index = GetFileIndexFromStreamIndex(in_entry_op.index); |
| 285 // Zero-length reads and reads to the empty streams of omitted files should | 286 // Zero-length reads and reads to the empty streams of omitted files should |
| 286 // be handled in the SimpleEntryImpl. | 287 // be handled in the SimpleEntryImpl. |
| 287 DCHECK_LT(0, in_entry_op.buf_len); | 288 DCHECK_GT(in_entry_op.buf_len, 0); |
| 288 DCHECK(!empty_file_omitted_[file_index]); | 289 DCHECK(!empty_file_omitted_[file_index]); |
| 289 File* file = const_cast<File*>(&files_[file_index]); | 290 File* file = const_cast<File*>(&files_[file_index]); |
| 290 int bytes_read = | 291 int bytes_read = |
| 291 file->Read(file_offset, out_buf->data(), in_entry_op.buf_len); | 292 file->Read(file_offset, out_buf->data(), in_entry_op.buf_len); |
| 292 if (bytes_read > 0) { | 293 if (bytes_read > 0) { |
| 293 entry_stat->set_last_used(Time::Now()); | 294 entry_stat->set_last_used(Time::Now()); |
| 294 *out_crc32 = crc32(crc32(0L, Z_NULL, 0), | 295 *out_crc32 = crc32(crc32(0L, Z_NULL, 0), |
| 295 reinterpret_cast<const Bytef*>(out_buf->data()), | 296 reinterpret_cast<const Bytef*>(out_buf->data()), |
| 296 bytes_read); | 297 bytes_read); |
| 297 } | 298 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 401 | 402 |
| 402 // Find the first sparse range at or after the requested offset. | 403 // Find the first sparse range at or after the requested offset. |
| 403 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); | 404 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); |
| 404 | 405 |
| 405 if (it != sparse_ranges_.begin()) { | 406 if (it != sparse_ranges_.begin()) { |
| 406 // Hop back one range and read the one overlapping with the start. | 407 // Hop back one range and read the one overlapping with the start. |
| 407 --it; | 408 --it; |
| 408 SparseRange* found_range = &it->second; | 409 SparseRange* found_range = &it->second; |
| 409 DCHECK_EQ(it->first, found_range->offset); | 410 DCHECK_EQ(it->first, found_range->offset); |
| 410 if (found_range->offset + found_range->length > offset) { | 411 if (found_range->offset + found_range->length > offset) { |
| 411 DCHECK_LE(0, found_range->length); | 412 DCHECK_GE(found_range->length, 0); |
| 412 DCHECK_GE(kint32max, found_range->length); | 413 DCHECK_LE(found_range->length, kint32max); |
| 413 DCHECK_LE(0, offset - found_range->offset); | 414 DCHECK_GE(offset - found_range->offset, 0); |
| 414 DCHECK_GE(kint32max, offset - found_range->offset); | 415 DCHECK_LE(offset - found_range->offset, kint32max); |
| 415 int range_len_after_offset = found_range->length - | 416 int net_offset = static_cast<int>(offset - found_range->offset); |
| 416 (offset - found_range->offset); | 417 int range_len_after_offset = |
| 417 DCHECK_LE(0, range_len_after_offset); | 418 static_cast<int>(found_range->length - net_offset); |
| 419 DCHECK_GE(range_len_after_offset, 0); | |
| 418 | 420 |
| 419 int len_to_read = std::min(buf_len, range_len_after_offset); | 421 int len_to_read = std::min(buf_len, range_len_after_offset); |
| 420 if (!ReadSparseRange(found_range, | 422 if (!ReadSparseRange(found_range, net_offset, len_to_read, buf)) { |
| 421 offset - found_range->offset, | |
| 422 len_to_read, | |
| 423 buf)) { | |
| 424 *out_result = net::ERR_CACHE_READ_FAILURE; | 423 *out_result = net::ERR_CACHE_READ_FAILURE; |
| 425 return; | 424 return; |
| 426 } | 425 } |
| 427 read_so_far += len_to_read; | 426 read_so_far += len_to_read; |
| 428 } | 427 } |
| 429 ++it; | 428 ++it; |
| 430 } | 429 } |
| 431 | 430 |
| 432 // Keep reading until the buffer is full or there is not another contiguous | 431 // Keep reading until the buffer is full or there is not another contiguous |
| 433 // range. | 432 // range. |
| 434 while (read_so_far < buf_len && | 433 while (read_so_far < buf_len && |
| 435 it != sparse_ranges_.end() && | 434 it != sparse_ranges_.end() && |
| 436 it->second.offset == offset + read_so_far) { | 435 it->second.offset == offset + read_so_far) { |
| 437 SparseRange* found_range = &it->second; | 436 SparseRange* found_range = &it->second; |
| 438 DCHECK_EQ(it->first, found_range->offset); | 437 DCHECK_EQ(it->first, found_range->offset); |
| 439 int range_len = (found_range->length > kint32max) ? | 438 int range_len = base::saturated_cast<int>(found_range->length); |
|
pasko
2015/12/09 18:41:06
Is this actually right?
I am not very familiar wi
Peter Kasting
2015/12/09 22:07:23
saturated_cast is not checked_cast. This change d
| |
| 440 kint32max : found_range->length; | |
| 441 int len_to_read = std::min(buf_len - read_so_far, range_len); | 439 int len_to_read = std::min(buf_len - read_so_far, range_len); |
| 442 if (!ReadSparseRange(found_range, 0, len_to_read, buf + read_so_far)) { | 440 if (!ReadSparseRange(found_range, 0, len_to_read, buf + read_so_far)) { |
| 443 *out_result = net::ERR_CACHE_READ_FAILURE; | 441 *out_result = net::ERR_CACHE_READ_FAILURE; |
| 444 return; | 442 return; |
| 445 } | 443 } |
| 446 read_so_far += len_to_read; | 444 read_so_far += len_to_read; |
| 447 ++it; | 445 ++it; |
| 448 } | 446 } |
| 449 | 447 |
| 450 *out_result = read_so_far; | 448 *out_result = read_so_far; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 477 << buf_len << " > " << max_sparse_data_size << ")"; | 475 << buf_len << " > " << max_sparse_data_size << ")"; |
| 478 TruncateSparseFile(); | 476 TruncateSparseFile(); |
| 479 } | 477 } |
| 480 | 478 |
| 481 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); | 479 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); |
| 482 | 480 |
| 483 if (it != sparse_ranges_.begin()) { | 481 if (it != sparse_ranges_.begin()) { |
| 484 --it; | 482 --it; |
| 485 SparseRange* found_range = &it->second; | 483 SparseRange* found_range = &it->second; |
| 486 if (found_range->offset + found_range->length > offset) { | 484 if (found_range->offset + found_range->length > offset) { |
| 487 DCHECK_LE(0, found_range->length); | 485 DCHECK_GE(found_range->length, 0); |
| 488 DCHECK_GE(kint32max, found_range->length); | 486 DCHECK_LE(found_range->length, kint32max); |
| 489 DCHECK_LE(0, offset - found_range->offset); | 487 DCHECK_GE(offset - found_range->offset, 0); |
| 490 DCHECK_GE(kint32max, offset - found_range->offset); | 488 DCHECK_LE(offset - found_range->offset, kint32max); |
| 491 int range_len_after_offset = found_range->length - | 489 int net_offset = static_cast<int>(offset - found_range->offset); |
| 492 (offset - found_range->offset); | 490 int range_len_after_offset = |
| 493 DCHECK_LE(0, range_len_after_offset); | 491 static_cast<int>(found_range->length - net_offset); |
| 492 DCHECK_GE(range_len_after_offset, 0); | |
| 494 | 493 |
| 495 int len_to_write = std::min(buf_len, range_len_after_offset); | 494 int len_to_write = std::min(buf_len, range_len_after_offset); |
| 496 if (!WriteSparseRange(found_range, | 495 if (!WriteSparseRange(found_range, net_offset, len_to_write, buf)) { |
| 497 offset - found_range->offset, | |
| 498 len_to_write, | |
| 499 buf)) { | |
| 500 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 496 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
| 501 return; | 497 return; |
| 502 } | 498 } |
| 503 written_so_far += len_to_write; | 499 written_so_far += len_to_write; |
| 504 } | 500 } |
| 505 ++it; | 501 ++it; |
| 506 } | 502 } |
| 507 | 503 |
| 508 while (written_so_far < buf_len && | 504 while (written_so_far < buf_len && |
| 509 it != sparse_ranges_.end() && | 505 it != sparse_ranges_.end() && |
| 510 it->second.offset < offset + buf_len) { | 506 it->second.offset < offset + buf_len) { |
| 511 SparseRange* found_range = &it->second; | 507 SparseRange* found_range = &it->second; |
| 512 if (offset + written_so_far < found_range->offset) { | 508 if (offset + written_so_far < found_range->offset) { |
| 513 int len_to_append = found_range->offset - (offset + written_so_far); | 509 int len_to_append = |
| 510 static_cast<int>(found_range->offset - (offset + written_so_far)); | |
| 514 if (!AppendSparseRange(offset + written_so_far, | 511 if (!AppendSparseRange(offset + written_so_far, |
| 515 len_to_append, | 512 len_to_append, |
| 516 buf + written_so_far)) { | 513 buf + written_so_far)) { |
| 517 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 514 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
| 518 return; | 515 return; |
| 519 } | 516 } |
| 520 written_so_far += len_to_append; | 517 written_so_far += len_to_append; |
| 521 appended_so_far += len_to_append; | 518 appended_so_far += len_to_append; |
| 522 } | 519 } |
| 523 int range_len = (found_range->length > kint32max) ? | 520 int range_len = base::saturated_cast<int>(found_range->length); |
| 524 kint32max : found_range->length; | |
| 525 int len_to_write = std::min(buf_len - written_so_far, range_len); | 521 int len_to_write = std::min(buf_len - written_so_far, range_len); |
| 526 if (!WriteSparseRange(found_range, | 522 if (!WriteSparseRange(found_range, |
| 527 0, | 523 0, |
| 528 len_to_write, | 524 len_to_write, |
| 529 buf + written_so_far)) { | 525 buf + written_so_far)) { |
| 530 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 526 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
| 531 return; | 527 return; |
| 532 } | 528 } |
| 533 written_so_far += len_to_write; | 529 written_so_far += len_to_write; |
| 534 ++it; | 530 ++it; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 560 const EntryOperationData& in_entry_op, | 556 const EntryOperationData& in_entry_op, |
| 561 int64* out_start, | 557 int64* out_start, |
| 562 int* out_result) { | 558 int* out_result) { |
| 563 DCHECK(initialized_); | 559 DCHECK(initialized_); |
| 564 int64 offset = in_entry_op.sparse_offset; | 560 int64 offset = in_entry_op.sparse_offset; |
| 565 int len = in_entry_op.buf_len; | 561 int len = in_entry_op.buf_len; |
| 566 | 562 |
| 567 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); | 563 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); |
| 568 | 564 |
| 569 int64 start = offset; | 565 int64 start = offset; |
| 570 int avail_so_far = 0; | 566 int64 avail_so_far = 0; |
|
Peter Kasting
2014/10/08 19:21:56
The type changes and typecasts inserted in this fi
| |
| 571 | 567 |
| 572 if (it != sparse_ranges_.end() && it->second.offset < offset + len) | 568 if (it != sparse_ranges_.end() && it->second.offset < offset + len) |
| 573 start = it->second.offset; | 569 start = it->second.offset; |
| 574 | 570 |
| 575 if ((it == sparse_ranges_.end() || it->second.offset > offset) && | 571 if ((it == sparse_ranges_.end() || it->second.offset > offset) && |
| 576 it != sparse_ranges_.begin()) { | 572 it != sparse_ranges_.begin()) { |
| 577 --it; | 573 --it; |
| 578 if (it->second.offset + it->second.length > offset) { | 574 if (it->second.offset + it->second.length > offset) { |
| 579 start = offset; | 575 start = offset; |
| 580 avail_so_far = (it->second.offset + it->second.length) - offset; | 576 avail_so_far = (it->second.offset + it->second.length) - offset; |
| 581 } | 577 } |
| 582 ++it; | 578 ++it; |
| 583 } | 579 } |
| 584 | 580 |
| 585 while (start + avail_so_far < offset + len && | 581 while (start + avail_so_far < offset + len && |
| 586 it != sparse_ranges_.end() && | 582 it != sparse_ranges_.end() && |
| 587 it->second.offset == start + avail_so_far) { | 583 it->second.offset == start + avail_so_far) { |
| 588 avail_so_far += it->second.length; | 584 avail_so_far += it->second.length; |
| 589 ++it; | 585 ++it; |
| 590 } | 586 } |
| 591 | 587 |
| 592 int len_from_start = len - (start - offset); | 588 int64 len_from_start = len - (start - offset); |
| 593 *out_start = start; | 589 *out_start = start; |
| 594 *out_result = std::min(avail_so_far, len_from_start); | 590 *out_result = static_cast<int>(std::min(avail_so_far, len_from_start)); |
| 595 } | 591 } |
| 596 | 592 |
| 597 void SimpleSynchronousEntry::CheckEOFRecord(int index, | 593 void SimpleSynchronousEntry::CheckEOFRecord(int index, |
| 598 const SimpleEntryStat& entry_stat, | 594 const SimpleEntryStat& entry_stat, |
| 599 uint32 expected_crc32, | 595 uint32 expected_crc32, |
| 600 int* out_result) const { | 596 int* out_result) const { |
| 601 DCHECK(initialized_); | 597 DCHECK(initialized_); |
| 602 uint32 crc32; | 598 uint32 crc32; |
| 603 bool has_crc32; | 599 bool has_crc32; |
| 604 int stream_size; | 600 int stream_size; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 673 continue; | 669 continue; |
| 674 | 670 |
| 675 files_[i].Close(); | 671 files_[i].Close(); |
| 676 const int64 file_size = entry_stat.GetFileSize(key_, i); | 672 const int64 file_size = entry_stat.GetFileSize(key_, i); |
| 677 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, | 673 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, |
| 678 "LastClusterSize", cache_type_, | 674 "LastClusterSize", cache_type_, |
| 679 file_size % 4096, 0, 4097, 50); | 675 file_size % 4096, 0, 4097, 50); |
| 680 const int64 cluster_loss = file_size % 4096 ? 4096 - file_size % 4096 : 0; | 676 const int64 cluster_loss = file_size % 4096 ? 4096 - file_size % 4096 : 0; |
| 681 SIMPLE_CACHE_UMA(PERCENTAGE, | 677 SIMPLE_CACHE_UMA(PERCENTAGE, |
| 682 "LastClusterLossPercent", cache_type_, | 678 "LastClusterLossPercent", cache_type_, |
| 683 cluster_loss * 100 / (cluster_loss + file_size)); | 679 static_cast<base::HistogramBase::Sample>( |
| 680 cluster_loss * 100 / (cluster_loss + file_size))); | |
| 684 } | 681 } |
| 685 | 682 |
| 686 if (sparse_file_open()) | 683 if (sparse_file_open()) |
| 687 sparse_file_.Close(); | 684 sparse_file_.Close(); |
| 688 | 685 |
| 689 if (files_created_) { | 686 if (files_created_) { |
| 690 const int stream2_file_index = GetFileIndexFromStreamIndex(2); | 687 const int stream2_file_index = GetFileIndexFromStreamIndex(2); |
| 691 SIMPLE_CACHE_UMA(BOOLEAN, "EntryCreatedAndStream2Omitted", cache_type_, | 688 SIMPLE_CACHE_UMA(BOOLEAN, "EntryCreatedAndStream2Omitted", cache_type_, |
| 692 empty_file_omitted_[stream2_file_index]); | 689 empty_file_omitted_[stream2_file_index]); |
| 693 } | 690 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 818 // each will only be known when reading the EOF record for stream 0. | 815 // each will only be known when reading the EOF record for stream 0. |
| 819 // | 816 // |
| 820 // The size for file 0 and 1 is temporarily kept in | 817 // The size for file 0 and 1 is temporarily kept in |
| 821 // |data_size(1)| and |data_size(2)| respectively. Reading the key in | 818 // |data_size(1)| and |data_size(2)| respectively. Reading the key in |
| 822 // InitializeForOpen yields the data size for each file. In the case of | 819 // InitializeForOpen yields the data size for each file. In the case of |
| 823 // file hash_1, this is the total size of stream 2, and is assigned to | 820 // file hash_1, this is the total size of stream 2, and is assigned to |
| 824 // data_size(2). In the case of file 0, it is the combined size of stream | 821 // data_size(2). In the case of file 0, it is the combined size of stream |
| 825 // 0, stream 1 and one EOF record. The exact distribution of sizes between | 822 // 0, stream 1 and one EOF record. The exact distribution of sizes between |
| 826 // stream 1 and stream 0 is only determined after reading the EOF record | 823 // stream 1 and stream 0 is only determined after reading the EOF record |
| 827 // for stream 0 in ReadAndValidateStream0. | 824 // for stream 0 in ReadAndValidateStream0. |
| 828 out_entry_stat->set_data_size(i + 1, file_info.size); | 825 out_entry_stat->set_data_size(i + 1, static_cast<int>(file_info.size)); |
| 829 } | 826 } |
| 830 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, | 827 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, |
| 831 "SyncOpenEntryAge", cache_type_, | 828 "SyncOpenEntryAge", cache_type_, |
| 832 entry_age.InHours(), 1, 1000, 50); | 829 entry_age.InHours(), 1, 1000, 50); |
| 833 | 830 |
| 834 files_created_ = false; | 831 files_created_ = false; |
| 835 | 832 |
| 836 return true; | 833 return true; |
| 837 } | 834 } |
| 838 | 835 |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1152 result = false; | 1149 result = false; |
| 1153 } | 1150 } |
| 1154 FilePath to_delete = path.AppendASCII( | 1151 FilePath to_delete = path.AppendASCII( |
| 1155 GetSparseFilenameFromEntryHash(entry_hash)); | 1152 GetSparseFilenameFromEntryHash(entry_hash)); |
| 1156 base::DeleteFile(to_delete, false); | 1153 base::DeleteFile(to_delete, false); |
| 1157 return result; | 1154 return result; |
| 1158 } | 1155 } |
| 1159 | 1156 |
| 1160 void SimpleSynchronousEntry::RecordSyncCreateResult(CreateEntryResult result, | 1157 void SimpleSynchronousEntry::RecordSyncCreateResult(CreateEntryResult result, |
| 1161 bool had_index) { | 1158 bool had_index) { |
| 1162 DCHECK_GT(CREATE_ENTRY_MAX, result); | 1159 DCHECK_LT(result, CREATE_ENTRY_MAX); |
| 1163 SIMPLE_CACHE_UMA(ENUMERATION, | 1160 SIMPLE_CACHE_UMA(ENUMERATION, |
| 1164 "SyncCreateResult", cache_type_, result, CREATE_ENTRY_MAX); | 1161 "SyncCreateResult", cache_type_, result, CREATE_ENTRY_MAX); |
| 1165 if (had_index) { | 1162 if (had_index) { |
| 1166 SIMPLE_CACHE_UMA(ENUMERATION, | 1163 SIMPLE_CACHE_UMA(ENUMERATION, |
| 1167 "SyncCreateResult_WithIndex", cache_type_, | 1164 "SyncCreateResult_WithIndex", cache_type_, |
| 1168 result, CREATE_ENTRY_MAX); | 1165 result, CREATE_ENTRY_MAX); |
| 1169 } else { | 1166 } else { |
| 1170 SIMPLE_CACHE_UMA(ENUMERATION, | 1167 SIMPLE_CACHE_UMA(ENUMERATION, |
| 1171 "SyncCreateResult_WithoutIndex", cache_type_, | 1168 "SyncCreateResult_WithoutIndex", cache_type_, |
| 1172 result, CREATE_ENTRY_MAX); | 1169 result, CREATE_ENTRY_MAX); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1249 | 1246 |
| 1250 sparse_ranges_.clear(); | 1247 sparse_ranges_.clear(); |
| 1251 sparse_tail_offset_ = sizeof(header) + key_.size(); | 1248 sparse_tail_offset_ = sizeof(header) + key_.size(); |
| 1252 | 1249 |
| 1253 return true; | 1250 return true; |
| 1254 } | 1251 } |
| 1255 | 1252 |
| 1256 bool SimpleSynchronousEntry::ScanSparseFile(int32* out_sparse_data_size) { | 1253 bool SimpleSynchronousEntry::ScanSparseFile(int32* out_sparse_data_size) { |
| 1257 DCHECK(sparse_file_open()); | 1254 DCHECK(sparse_file_open()); |
| 1258 | 1255 |
| 1259 int32 sparse_data_size = 0; | 1256 int64 sparse_data_size = 0; |
| 1260 | 1257 |
| 1261 SimpleFileHeader header; | 1258 SimpleFileHeader header; |
| 1262 int header_read_result = | 1259 int header_read_result = |
| 1263 sparse_file_.Read(0, reinterpret_cast<char*>(&header), sizeof(header)); | 1260 sparse_file_.Read(0, reinterpret_cast<char*>(&header), sizeof(header)); |
| 1264 if (header_read_result != sizeof(header)) { | 1261 if (header_read_result != sizeof(header)) { |
| 1265 DLOG(WARNING) << "Could not read header from sparse file."; | 1262 DLOG(WARNING) << "Could not read header from sparse file."; |
| 1266 return false; | 1263 return false; |
| 1267 } | 1264 } |
| 1268 | 1265 |
| 1269 if (header.initial_magic_number != kSimpleInitialMagicNumber) { | 1266 if (header.initial_magic_number != kSimpleInitialMagicNumber) { |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1300 | 1297 |
| 1301 SparseRange range; | 1298 SparseRange range; |
| 1302 range.offset = range_header.offset; | 1299 range.offset = range_header.offset; |
| 1303 range.length = range_header.length; | 1300 range.length = range_header.length; |
| 1304 range.data_crc32 = range_header.data_crc32; | 1301 range.data_crc32 = range_header.data_crc32; |
| 1305 range.file_offset = range_header_offset + sizeof(range_header); | 1302 range.file_offset = range_header_offset + sizeof(range_header); |
| 1306 sparse_ranges_.insert(std::make_pair(range.offset, range)); | 1303 sparse_ranges_.insert(std::make_pair(range.offset, range)); |
| 1307 | 1304 |
| 1308 range_header_offset += sizeof(range_header) + range.length; | 1305 range_header_offset += sizeof(range_header) + range.length; |
| 1309 | 1306 |
| 1310 DCHECK_LE(sparse_data_size, sparse_data_size + range.length); | 1307 DCHECK_GE(sparse_data_size + range.length, sparse_data_size); |
| 1311 sparse_data_size += range.length; | 1308 sparse_data_size += range.length; |
| 1312 } | 1309 } |
| 1313 | 1310 |
| 1314 *out_sparse_data_size = sparse_data_size; | 1311 *out_sparse_data_size = static_cast<int32>(sparse_data_size); |
| 1315 sparse_tail_offset_ = range_header_offset; | 1312 sparse_tail_offset_ = range_header_offset; |
| 1316 | 1313 |
| 1317 return true; | 1314 return true; |
| 1318 } | 1315 } |
| 1319 | 1316 |
| 1320 bool SimpleSynchronousEntry::ReadSparseRange(const SparseRange* range, | 1317 bool SimpleSynchronousEntry::ReadSparseRange(const SparseRange* range, |
| 1321 int offset, int len, char* buf) { | 1318 int offset, int len, char* buf) { |
| 1322 DCHECK(range); | 1319 DCHECK(range); |
| 1323 DCHECK(buf); | 1320 DCHECK(buf); |
| 1324 DCHECK_GE(range->length, offset); | 1321 DCHECK_LE(offset, range->length); |
| 1325 DCHECK_GE(range->length, offset + len); | 1322 DCHECK_LE(offset + len, range->length); |
| 1326 | 1323 |
| 1327 int bytes_read = sparse_file_.Read(range->file_offset + offset, buf, len); | 1324 int bytes_read = sparse_file_.Read(range->file_offset + offset, buf, len); |
| 1328 if (bytes_read < len) { | 1325 if (bytes_read < len) { |
| 1329 DLOG(WARNING) << "Could not read sparse range."; | 1326 DLOG(WARNING) << "Could not read sparse range."; |
| 1330 return false; | 1327 return false; |
| 1331 } | 1328 } |
| 1332 | 1329 |
| 1333 // If we read the whole range and we have a crc32, check it. | 1330 // If we read the whole range and we have a crc32, check it. |
| 1334 if (offset == 0 && len == range->length && range->data_crc32 != 0) { | 1331 if (offset == 0 && len == range->length && range->data_crc32 != 0) { |
| 1335 uint32 actual_crc32 = crc32(crc32(0L, Z_NULL, 0), | 1332 uint32 actual_crc32 = crc32(crc32(0L, Z_NULL, 0), |
| 1336 reinterpret_cast<const Bytef*>(buf), | 1333 reinterpret_cast<const Bytef*>(buf), |
| 1337 len); | 1334 len); |
| 1338 if (actual_crc32 != range->data_crc32) { | 1335 if (actual_crc32 != range->data_crc32) { |
| 1339 DLOG(WARNING) << "Sparse range crc32 mismatch."; | 1336 DLOG(WARNING) << "Sparse range crc32 mismatch."; |
| 1340 return false; | 1337 return false; |
| 1341 } | 1338 } |
| 1342 } | 1339 } |
| 1343 // TODO(ttuttle): Incremental crc32 calculation? | 1340 // TODO(ttuttle): Incremental crc32 calculation? |
| 1344 | 1341 |
| 1345 return true; | 1342 return true; |
| 1346 } | 1343 } |
| 1347 | 1344 |
| 1348 bool SimpleSynchronousEntry::WriteSparseRange(SparseRange* range, | 1345 bool SimpleSynchronousEntry::WriteSparseRange(SparseRange* range, |
| 1349 int offset, int len, | 1346 int offset, int len, |
| 1350 const char* buf) { | 1347 const char* buf) { |
| 1351 DCHECK(range); | 1348 DCHECK(range); |
| 1352 DCHECK(buf); | 1349 DCHECK(buf); |
| 1353 DCHECK_GE(range->length, offset); | 1350 DCHECK_LE(offset, range->length); |
| 1354 DCHECK_GE(range->length, offset + len); | 1351 DCHECK_LE(offset + len, range->length); |
| 1355 | 1352 |
| 1356 uint32 new_crc32 = 0; | 1353 uint32 new_crc32 = 0; |
| 1357 if (offset == 0 && len == range->length) { | 1354 if (offset == 0 && len == range->length) { |
| 1358 new_crc32 = crc32(crc32(0L, Z_NULL, 0), | 1355 new_crc32 = crc32(crc32(0L, Z_NULL, 0), |
| 1359 reinterpret_cast<const Bytef*>(buf), | 1356 reinterpret_cast<const Bytef*>(buf), |
| 1360 len); | 1357 len); |
| 1361 } | 1358 } |
| 1362 | 1359 |
| 1363 if (new_crc32 != range->data_crc32) { | 1360 if (new_crc32 != range->data_crc32) { |
| 1364 range->data_crc32 = new_crc32; | 1361 range->data_crc32 = new_crc32; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1383 DLOG(WARNING) << "Could not write sparse range."; | 1380 DLOG(WARNING) << "Could not write sparse range."; |
| 1384 return false; | 1381 return false; |
| 1385 } | 1382 } |
| 1386 | 1383 |
| 1387 return true; | 1384 return true; |
| 1388 } | 1385 } |
| 1389 | 1386 |
| 1390 bool SimpleSynchronousEntry::AppendSparseRange(int64 offset, | 1387 bool SimpleSynchronousEntry::AppendSparseRange(int64 offset, |
| 1391 int len, | 1388 int len, |
| 1392 const char* buf) { | 1389 const char* buf) { |
| 1393 DCHECK_LE(0, offset); | 1390 DCHECK_GE(offset, 0); |
| 1394 DCHECK_LT(0, len); | 1391 DCHECK_GT(len, 0); |
| 1395 DCHECK(buf); | 1392 DCHECK(buf); |
| 1396 | 1393 |
| 1397 uint32 data_crc32 = crc32(crc32(0L, Z_NULL, 0), | 1394 uint32 data_crc32 = crc32(crc32(0L, Z_NULL, 0), |
| 1398 reinterpret_cast<const Bytef*>(buf), | 1395 reinterpret_cast<const Bytef*>(buf), |
| 1399 len); | 1396 len); |
| 1400 | 1397 |
| 1401 SimpleFileSparseRangeHeader header; | 1398 SimpleFileSparseRangeHeader header; |
| 1402 header.sparse_range_magic_number = kSimpleSparseRangeMagicNumber; | 1399 header.sparse_range_magic_number = kSimpleSparseRangeMagicNumber; |
| 1403 header.offset = offset; | 1400 header.offset = offset; |
| 1404 header.length = len; | 1401 header.length = len; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1425 range.offset = offset; | 1422 range.offset = offset; |
| 1426 range.length = len; | 1423 range.length = len; |
| 1427 range.data_crc32 = data_crc32; | 1424 range.data_crc32 = data_crc32; |
| 1428 range.file_offset = data_file_offset; | 1425 range.file_offset = data_file_offset; |
| 1429 sparse_ranges_.insert(std::make_pair(offset, range)); | 1426 sparse_ranges_.insert(std::make_pair(offset, range)); |
| 1430 | 1427 |
| 1431 return true; | 1428 return true; |
| 1432 } | 1429 } |
| 1433 | 1430 |
| 1434 } // namespace disk_cache | 1431 } // namespace disk_cache |
| OLD | NEW |