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> |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 // Used in histograms, please only add entries at the end. | 67 // Used in histograms, please only add entries at the end. |
68 enum CloseResult { | 68 enum CloseResult { |
69 CLOSE_RESULT_SUCCESS, | 69 CLOSE_RESULT_SUCCESS, |
70 CLOSE_RESULT_WRITE_FAILURE, | 70 CLOSE_RESULT_WRITE_FAILURE, |
71 }; | 71 }; |
72 | 72 |
73 void RecordSyncOpenResult(net::CacheType cache_type, | 73 void RecordSyncOpenResult(net::CacheType cache_type, |
74 OpenEntryResult result, | 74 OpenEntryResult result, |
75 bool had_index) { | 75 bool had_index) { |
76 DCHECK_GT(OPEN_ENTRY_MAX, result); | 76 DCHECK_GT(OPEN_ENTRY_MAX, result); |
77 SIMPLE_CACHE_UMA(ENUMERATION, | 77 SIMPLE_CACHE_UMA( |
78 "SyncOpenResult", cache_type, result, OPEN_ENTRY_MAX); | 78 ENUMERATION, "SyncOpenResult", cache_type, result, OPEN_ENTRY_MAX); |
79 if (had_index) { | 79 if (had_index) { |
80 SIMPLE_CACHE_UMA(ENUMERATION, | 80 SIMPLE_CACHE_UMA(ENUMERATION, |
81 "SyncOpenResult_WithIndex", cache_type, | 81 "SyncOpenResult_WithIndex", |
82 result, OPEN_ENTRY_MAX); | 82 cache_type, |
| 83 result, |
| 84 OPEN_ENTRY_MAX); |
83 } else { | 85 } else { |
84 SIMPLE_CACHE_UMA(ENUMERATION, | 86 SIMPLE_CACHE_UMA(ENUMERATION, |
85 "SyncOpenResult_WithoutIndex", cache_type, | 87 "SyncOpenResult_WithoutIndex", |
86 result, OPEN_ENTRY_MAX); | 88 cache_type, |
| 89 result, |
| 90 OPEN_ENTRY_MAX); |
87 } | 91 } |
88 } | 92 } |
89 | 93 |
90 void RecordWriteResult(net::CacheType cache_type, WriteResult result) { | 94 void RecordWriteResult(net::CacheType cache_type, WriteResult result) { |
91 SIMPLE_CACHE_UMA(ENUMERATION, | 95 SIMPLE_CACHE_UMA( |
92 "SyncWriteResult", cache_type, result, WRITE_RESULT_MAX); | 96 ENUMERATION, "SyncWriteResult", cache_type, result, WRITE_RESULT_MAX); |
93 } | 97 } |
94 | 98 |
95 void RecordCheckEOFResult(net::CacheType cache_type, CheckEOFResult result) { | 99 void RecordCheckEOFResult(net::CacheType cache_type, CheckEOFResult result) { |
96 SIMPLE_CACHE_UMA(ENUMERATION, | 100 SIMPLE_CACHE_UMA(ENUMERATION, |
97 "SyncCheckEOFResult", cache_type, | 101 "SyncCheckEOFResult", |
98 result, CHECK_EOF_RESULT_MAX); | 102 cache_type, |
| 103 result, |
| 104 CHECK_EOF_RESULT_MAX); |
99 } | 105 } |
100 | 106 |
101 void RecordCloseResult(net::CacheType cache_type, CloseResult result) { | 107 void RecordCloseResult(net::CacheType cache_type, CloseResult result) { |
102 SIMPLE_CACHE_UMA(ENUMERATION, | 108 SIMPLE_CACHE_UMA( |
103 "SyncCloseResult", cache_type, result, WRITE_RESULT_MAX); | 109 ENUMERATION, "SyncCloseResult", cache_type, result, WRITE_RESULT_MAX); |
104 } | 110 } |
105 | 111 |
106 bool CanOmitEmptyFile(int file_index) { | 112 bool CanOmitEmptyFile(int file_index) { |
107 DCHECK_LE(0, file_index); | 113 DCHECK_LE(0, file_index); |
108 DCHECK_GT(disk_cache::kSimpleEntryFileCount, file_index); | 114 DCHECK_GT(disk_cache::kSimpleEntryFileCount, file_index); |
109 return file_index == disk_cache::simple_util::GetFileIndexFromStreamIndex(2); | 115 return file_index == disk_cache::simple_util::GetFileIndexFromStreamIndex(2); |
110 } | 116 } |
111 | 117 |
112 } // namespace | 118 } // namespace |
113 | 119 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 SimpleEntryStat entry_stat) | 170 SimpleEntryStat entry_stat) |
165 : sync_entry(NULL), | 171 : sync_entry(NULL), |
166 entry_stat(entry_stat), | 172 entry_stat(entry_stat), |
167 stream_0_crc32(crc32(0, Z_NULL, 0)), | 173 stream_0_crc32(crc32(0, Z_NULL, 0)), |
168 result(net::OK) { | 174 result(net::OK) { |
169 } | 175 } |
170 | 176 |
171 SimpleEntryCreationResults::~SimpleEntryCreationResults() { | 177 SimpleEntryCreationResults::~SimpleEntryCreationResults() { |
172 } | 178 } |
173 | 179 |
174 SimpleSynchronousEntry::CRCRecord::CRCRecord() : index(-1), | 180 SimpleSynchronousEntry::CRCRecord::CRCRecord() |
175 has_crc32(false), | 181 : index(-1), has_crc32(false), data_crc32(0) { |
176 data_crc32(0) { | |
177 } | 182 } |
178 | 183 |
179 SimpleSynchronousEntry::CRCRecord::CRCRecord(int index_p, | 184 SimpleSynchronousEntry::CRCRecord::CRCRecord(int index_p, |
180 bool has_crc32_p, | 185 bool has_crc32_p, |
181 uint32 data_crc32_p) | 186 uint32 data_crc32_p) |
182 : index(index_p), | 187 : index(index_p), has_crc32(has_crc32_p), data_crc32(data_crc32_p) { |
183 has_crc32(has_crc32_p), | 188 } |
184 data_crc32(data_crc32_p) {} | |
185 | 189 |
186 SimpleSynchronousEntry::EntryOperationData::EntryOperationData(int index_p, | 190 SimpleSynchronousEntry::EntryOperationData::EntryOperationData(int index_p, |
187 int offset_p, | 191 int offset_p, |
188 int buf_len_p) | 192 int buf_len_p) |
189 : index(index_p), | 193 : index(index_p), offset(offset_p), buf_len(buf_len_p) { |
190 offset(offset_p), | 194 } |
191 buf_len(buf_len_p) {} | |
192 | 195 |
193 SimpleSynchronousEntry::EntryOperationData::EntryOperationData(int index_p, | 196 SimpleSynchronousEntry::EntryOperationData::EntryOperationData(int index_p, |
194 int offset_p, | 197 int offset_p, |
195 int buf_len_p, | 198 int buf_len_p, |
196 bool truncate_p, | 199 bool truncate_p, |
197 bool doomed_p) | 200 bool doomed_p) |
198 : index(index_p), | 201 : index(index_p), |
199 offset(offset_p), | 202 offset(offset_p), |
200 buf_len(buf_len_p), | 203 buf_len(buf_len_p), |
201 truncate(truncate_p), | 204 truncate(truncate_p), |
202 doomed(doomed_p) {} | 205 doomed(doomed_p) { |
| 206 } |
203 | 207 |
204 SimpleSynchronousEntry::EntryOperationData::EntryOperationData( | 208 SimpleSynchronousEntry::EntryOperationData::EntryOperationData( |
205 int64 sparse_offset_p, | 209 int64 sparse_offset_p, |
206 int buf_len_p) | 210 int buf_len_p) |
207 : sparse_offset(sparse_offset_p), | 211 : sparse_offset(sparse_offset_p), buf_len(buf_len_p) { |
208 buf_len(buf_len_p) {} | 212 } |
209 | 213 |
210 // static | 214 // static |
211 void SimpleSynchronousEntry::OpenEntry( | 215 void SimpleSynchronousEntry::OpenEntry( |
212 net::CacheType cache_type, | 216 net::CacheType cache_type, |
213 const FilePath& path, | 217 const FilePath& path, |
214 const uint64 entry_hash, | 218 const uint64 entry_hash, |
215 bool had_index, | 219 bool had_index, |
216 SimpleEntryCreationResults *out_results) { | 220 SimpleEntryCreationResults* out_results) { |
217 SimpleSynchronousEntry* sync_entry = | 221 SimpleSynchronousEntry* sync_entry = |
218 new SimpleSynchronousEntry(cache_type, path, "", entry_hash); | 222 new SimpleSynchronousEntry(cache_type, path, "", entry_hash); |
219 out_results->result = | 223 out_results->result = |
220 sync_entry->InitializeForOpen(had_index, | 224 sync_entry->InitializeForOpen(had_index, |
221 &out_results->entry_stat, | 225 &out_results->entry_stat, |
222 &out_results->stream_0_data, | 226 &out_results->stream_0_data, |
223 &out_results->stream_0_crc32); | 227 &out_results->stream_0_crc32); |
224 if (out_results->result != net::OK) { | 228 if (out_results->result != net::OK) { |
225 sync_entry->Doom(); | 229 sync_entry->Doom(); |
226 delete sync_entry; | 230 delete sync_entry; |
227 out_results->sync_entry = NULL; | 231 out_results->sync_entry = NULL; |
228 out_results->stream_0_data = NULL; | 232 out_results->stream_0_data = NULL; |
229 return; | 233 return; |
230 } | 234 } |
231 out_results->sync_entry = sync_entry; | 235 out_results->sync_entry = sync_entry; |
232 } | 236 } |
233 | 237 |
234 // static | 238 // static |
235 void SimpleSynchronousEntry::CreateEntry( | 239 void SimpleSynchronousEntry::CreateEntry( |
236 net::CacheType cache_type, | 240 net::CacheType cache_type, |
237 const FilePath& path, | 241 const FilePath& path, |
238 const std::string& key, | 242 const std::string& key, |
239 const uint64 entry_hash, | 243 const uint64 entry_hash, |
240 bool had_index, | 244 bool had_index, |
241 SimpleEntryCreationResults *out_results) { | 245 SimpleEntryCreationResults* out_results) { |
242 DCHECK_EQ(entry_hash, GetEntryHashKey(key)); | 246 DCHECK_EQ(entry_hash, GetEntryHashKey(key)); |
243 SimpleSynchronousEntry* sync_entry = | 247 SimpleSynchronousEntry* sync_entry = |
244 new SimpleSynchronousEntry(cache_type, path, key, entry_hash); | 248 new SimpleSynchronousEntry(cache_type, path, key, entry_hash); |
245 out_results->result = sync_entry->InitializeForCreate( | 249 out_results->result = |
246 had_index, &out_results->entry_stat); | 250 sync_entry->InitializeForCreate(had_index, &out_results->entry_stat); |
247 if (out_results->result != net::OK) { | 251 if (out_results->result != net::OK) { |
248 if (out_results->result != net::ERR_FILE_EXISTS) | 252 if (out_results->result != net::ERR_FILE_EXISTS) |
249 sync_entry->Doom(); | 253 sync_entry->Doom(); |
250 delete sync_entry; | 254 delete sync_entry; |
251 out_results->sync_entry = NULL; | 255 out_results->sync_entry = NULL; |
252 return; | 256 return; |
253 } | 257 } |
254 out_results->sync_entry = sync_entry; | 258 out_results->sync_entry = sync_entry; |
255 } | 259 } |
256 | 260 |
257 // static | 261 // static |
258 int SimpleSynchronousEntry::DoomEntry( | 262 int SimpleSynchronousEntry::DoomEntry(const FilePath& path, uint64 entry_hash) { |
259 const FilePath& path, | |
260 uint64 entry_hash) { | |
261 const bool deleted_well = DeleteFilesForEntryHash(path, entry_hash); | 263 const bool deleted_well = DeleteFilesForEntryHash(path, entry_hash); |
262 return deleted_well ? net::OK : net::ERR_FAILED; | 264 return deleted_well ? net::OK : net::ERR_FAILED; |
263 } | 265 } |
264 | 266 |
265 // static | 267 // static |
266 int SimpleSynchronousEntry::DoomEntrySet( | 268 int SimpleSynchronousEntry::DoomEntrySet(const std::vector<uint64>* key_hashes, |
267 const std::vector<uint64>* key_hashes, | 269 const FilePath& path) { |
268 const FilePath& path) { | |
269 const size_t did_delete_count = std::count_if( | 270 const size_t did_delete_count = std::count_if( |
270 key_hashes->begin(), key_hashes->end(), std::bind1st( | 271 key_hashes->begin(), |
| 272 key_hashes->end(), |
| 273 std::bind1st( |
271 std::ptr_fun(SimpleSynchronousEntry::DeleteFilesForEntryHash), path)); | 274 std::ptr_fun(SimpleSynchronousEntry::DeleteFilesForEntryHash), path)); |
272 return (did_delete_count == key_hashes->size()) ? net::OK : net::ERR_FAILED; | 275 return (did_delete_count == key_hashes->size()) ? net::OK : net::ERR_FAILED; |
273 } | 276 } |
274 | 277 |
275 void SimpleSynchronousEntry::ReadData(const EntryOperationData& in_entry_op, | 278 void SimpleSynchronousEntry::ReadData(const EntryOperationData& in_entry_op, |
276 net::IOBuffer* out_buf, | 279 net::IOBuffer* out_buf, |
277 uint32* out_crc32, | 280 uint32* out_crc32, |
278 SimpleEntryStat* entry_stat, | 281 SimpleEntryStat* entry_stat, |
279 int* out_result) const { | 282 int* out_result) const { |
280 DCHECK(initialized_); | 283 DCHECK(initialized_); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 if (it != sparse_ranges_.begin()) { | 408 if (it != sparse_ranges_.begin()) { |
406 // Hop back one range and read the one overlapping with the start. | 409 // Hop back one range and read the one overlapping with the start. |
407 --it; | 410 --it; |
408 SparseRange* found_range = &it->second; | 411 SparseRange* found_range = &it->second; |
409 DCHECK_EQ(it->first, found_range->offset); | 412 DCHECK_EQ(it->first, found_range->offset); |
410 if (found_range->offset + found_range->length > offset) { | 413 if (found_range->offset + found_range->length > offset) { |
411 DCHECK_LE(0, found_range->length); | 414 DCHECK_LE(0, found_range->length); |
412 DCHECK_GE(kint32max, found_range->length); | 415 DCHECK_GE(kint32max, found_range->length); |
413 DCHECK_LE(0, offset - found_range->offset); | 416 DCHECK_LE(0, offset - found_range->offset); |
414 DCHECK_GE(kint32max, offset - found_range->offset); | 417 DCHECK_GE(kint32max, offset - found_range->offset); |
415 int range_len_after_offset = found_range->length - | 418 int range_len_after_offset = |
416 (offset - found_range->offset); | 419 found_range->length - (offset - found_range->offset); |
417 DCHECK_LE(0, range_len_after_offset); | 420 DCHECK_LE(0, range_len_after_offset); |
418 | 421 |
419 int len_to_read = std::min(buf_len, range_len_after_offset); | 422 int len_to_read = std::min(buf_len, range_len_after_offset); |
420 if (!ReadSparseRange(found_range, | 423 if (!ReadSparseRange( |
421 offset - found_range->offset, | 424 found_range, offset - found_range->offset, len_to_read, buf)) { |
422 len_to_read, | |
423 buf)) { | |
424 *out_result = net::ERR_CACHE_READ_FAILURE; | 425 *out_result = net::ERR_CACHE_READ_FAILURE; |
425 return; | 426 return; |
426 } | 427 } |
427 read_so_far += len_to_read; | 428 read_so_far += len_to_read; |
428 } | 429 } |
429 ++it; | 430 ++it; |
430 } | 431 } |
431 | 432 |
432 // Keep reading until the buffer is full or there is not another contiguous | 433 // Keep reading until the buffer is full or there is not another contiguous |
433 // range. | 434 // range. |
434 while (read_so_far < buf_len && | 435 while (read_so_far < buf_len && it != sparse_ranges_.end() && |
435 it != sparse_ranges_.end() && | |
436 it->second.offset == offset + read_so_far) { | 436 it->second.offset == offset + read_so_far) { |
437 SparseRange* found_range = &it->second; | 437 SparseRange* found_range = &it->second; |
438 DCHECK_EQ(it->first, found_range->offset); | 438 DCHECK_EQ(it->first, found_range->offset); |
439 int range_len = (found_range->length > kint32max) ? | 439 int range_len = |
440 kint32max : found_range->length; | 440 (found_range->length > kint32max) ? kint32max : found_range->length; |
441 int len_to_read = std::min(buf_len - read_so_far, range_len); | 441 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)) { | 442 if (!ReadSparseRange(found_range, 0, len_to_read, buf + read_so_far)) { |
443 *out_result = net::ERR_CACHE_READ_FAILURE; | 443 *out_result = net::ERR_CACHE_READ_FAILURE; |
444 return; | 444 return; |
445 } | 445 } |
446 read_so_far += len_to_read; | 446 read_so_far += len_to_read; |
447 ++it; | 447 ++it; |
448 } | 448 } |
449 | 449 |
450 *out_result = read_so_far; | 450 *out_result = read_so_far; |
(...skipping 30 matching lines...) Expand all Loading... |
481 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); | 481 SparseRangeIterator it = sparse_ranges_.lower_bound(offset); |
482 | 482 |
483 if (it != sparse_ranges_.begin()) { | 483 if (it != sparse_ranges_.begin()) { |
484 --it; | 484 --it; |
485 SparseRange* found_range = &it->second; | 485 SparseRange* found_range = &it->second; |
486 if (found_range->offset + found_range->length > offset) { | 486 if (found_range->offset + found_range->length > offset) { |
487 DCHECK_LE(0, found_range->length); | 487 DCHECK_LE(0, found_range->length); |
488 DCHECK_GE(kint32max, found_range->length); | 488 DCHECK_GE(kint32max, found_range->length); |
489 DCHECK_LE(0, offset - found_range->offset); | 489 DCHECK_LE(0, offset - found_range->offset); |
490 DCHECK_GE(kint32max, offset - found_range->offset); | 490 DCHECK_GE(kint32max, offset - found_range->offset); |
491 int range_len_after_offset = found_range->length - | 491 int range_len_after_offset = |
492 (offset - found_range->offset); | 492 found_range->length - (offset - found_range->offset); |
493 DCHECK_LE(0, range_len_after_offset); | 493 DCHECK_LE(0, range_len_after_offset); |
494 | 494 |
495 int len_to_write = std::min(buf_len, range_len_after_offset); | 495 int len_to_write = std::min(buf_len, range_len_after_offset); |
496 if (!WriteSparseRange(found_range, | 496 if (!WriteSparseRange( |
497 offset - found_range->offset, | 497 found_range, offset - found_range->offset, len_to_write, buf)) { |
498 len_to_write, | |
499 buf)) { | |
500 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 498 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
501 return; | 499 return; |
502 } | 500 } |
503 written_so_far += len_to_write; | 501 written_so_far += len_to_write; |
504 } | 502 } |
505 ++it; | 503 ++it; |
506 } | 504 } |
507 | 505 |
508 while (written_so_far < buf_len && | 506 while (written_so_far < buf_len && it != sparse_ranges_.end() && |
509 it != sparse_ranges_.end() && | |
510 it->second.offset < offset + buf_len) { | 507 it->second.offset < offset + buf_len) { |
511 SparseRange* found_range = &it->second; | 508 SparseRange* found_range = &it->second; |
512 if (offset + written_so_far < found_range->offset) { | 509 if (offset + written_so_far < found_range->offset) { |
513 int len_to_append = found_range->offset - (offset + written_so_far); | 510 int len_to_append = found_range->offset - (offset + written_so_far); |
514 if (!AppendSparseRange(offset + written_so_far, | 511 if (!AppendSparseRange( |
515 len_to_append, | 512 offset + written_so_far, len_to_append, buf + written_so_far)) { |
516 buf + written_so_far)) { | |
517 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 513 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
518 return; | 514 return; |
519 } | 515 } |
520 written_so_far += len_to_append; | 516 written_so_far += len_to_append; |
521 appended_so_far += len_to_append; | 517 appended_so_far += len_to_append; |
522 } | 518 } |
523 int range_len = (found_range->length > kint32max) ? | 519 int range_len = |
524 kint32max : found_range->length; | 520 (found_range->length > kint32max) ? 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, 0, len_to_write, buf + written_so_far)) { |
527 0, | |
528 len_to_write, | |
529 buf + written_so_far)) { | |
530 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 523 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
531 return; | 524 return; |
532 } | 525 } |
533 written_so_far += len_to_write; | 526 written_so_far += len_to_write; |
534 ++it; | 527 ++it; |
535 } | 528 } |
536 | 529 |
537 if (written_so_far < buf_len) { | 530 if (written_so_far < buf_len) { |
538 int len_to_append = buf_len - written_so_far; | 531 int len_to_append = buf_len - written_so_far; |
539 if (!AppendSparseRange(offset + written_so_far, | 532 if (!AppendSparseRange( |
540 len_to_append, | 533 offset + written_so_far, len_to_append, buf + written_so_far)) { |
541 buf + written_so_far)) { | |
542 *out_result = net::ERR_CACHE_WRITE_FAILURE; | 534 *out_result = net::ERR_CACHE_WRITE_FAILURE; |
543 return; | 535 return; |
544 } | 536 } |
545 written_so_far += len_to_append; | 537 written_so_far += len_to_append; |
546 appended_so_far += len_to_append; | 538 appended_so_far += len_to_append; |
547 } | 539 } |
548 | 540 |
549 DCHECK_EQ(buf_len, written_so_far); | 541 DCHECK_EQ(buf_len, written_so_far); |
550 | 542 |
551 base::Time modification_time = Time::Now(); | 543 base::Time modification_time = Time::Now(); |
(...skipping 23 matching lines...) Expand all Loading... |
575 if ((it == sparse_ranges_.end() || it->second.offset > offset) && | 567 if ((it == sparse_ranges_.end() || it->second.offset > offset) && |
576 it != sparse_ranges_.begin()) { | 568 it != sparse_ranges_.begin()) { |
577 --it; | 569 --it; |
578 if (it->second.offset + it->second.length > offset) { | 570 if (it->second.offset + it->second.length > offset) { |
579 start = offset; | 571 start = offset; |
580 avail_so_far = (it->second.offset + it->second.length) - offset; | 572 avail_so_far = (it->second.offset + it->second.length) - offset; |
581 } | 573 } |
582 ++it; | 574 ++it; |
583 } | 575 } |
584 | 576 |
585 while (start + avail_so_far < offset + len && | 577 while (start + avail_so_far < offset + len && it != sparse_ranges_.end() && |
586 it != sparse_ranges_.end() && | |
587 it->second.offset == start + avail_so_far) { | 578 it->second.offset == start + avail_so_far) { |
588 avail_so_far += it->second.length; | 579 avail_so_far += it->second.length; |
589 ++it; | 580 ++it; |
590 } | 581 } |
591 | 582 |
592 int len_from_start = len - (start - offset); | 583 int len_from_start = len - (start - offset); |
593 *out_start = start; | 584 *out_start = start; |
594 *out_result = std::min(avail_so_far, len_from_start); | 585 *out_result = std::min(avail_so_far, len_from_start); |
595 } | 586 } |
596 | 587 |
(...skipping 21 matching lines...) Expand all Loading... |
618 RecordCheckEOFResult(cache_type_, CHECK_EOF_RESULT_SUCCESS); | 609 RecordCheckEOFResult(cache_type_, CHECK_EOF_RESULT_SUCCESS); |
619 } | 610 } |
620 | 611 |
621 void SimpleSynchronousEntry::Close( | 612 void SimpleSynchronousEntry::Close( |
622 const SimpleEntryStat& entry_stat, | 613 const SimpleEntryStat& entry_stat, |
623 scoped_ptr<std::vector<CRCRecord> > crc32s_to_write, | 614 scoped_ptr<std::vector<CRCRecord> > crc32s_to_write, |
624 net::GrowableIOBuffer* stream_0_data) { | 615 net::GrowableIOBuffer* stream_0_data) { |
625 DCHECK(stream_0_data); | 616 DCHECK(stream_0_data); |
626 // Write stream 0 data. | 617 // Write stream 0 data. |
627 int stream_0_offset = entry_stat.GetOffsetInFile(key_, 0, 0); | 618 int stream_0_offset = entry_stat.GetOffsetInFile(key_, 0, 0); |
628 if (files_[0].Write(stream_0_offset, stream_0_data->data(), | 619 if (files_[0].Write(stream_0_offset, |
629 entry_stat.data_size(0)) != | 620 stream_0_data->data(), |
630 entry_stat.data_size(0)) { | 621 entry_stat.data_size(0)) != entry_stat.data_size(0)) { |
631 RecordCloseResult(cache_type_, CLOSE_RESULT_WRITE_FAILURE); | 622 RecordCloseResult(cache_type_, CLOSE_RESULT_WRITE_FAILURE); |
632 DVLOG(1) << "Could not write stream 0 data."; | 623 DVLOG(1) << "Could not write stream 0 data."; |
633 Doom(); | 624 Doom(); |
634 } | 625 } |
635 | 626 |
636 for (std::vector<CRCRecord>::const_iterator it = crc32s_to_write->begin(); | 627 for (std::vector<CRCRecord>::const_iterator it = crc32s_to_write->begin(); |
637 it != crc32s_to_write->end(); ++it) { | 628 it != crc32s_to_write->end(); |
| 629 ++it) { |
638 const int stream_index = it->index; | 630 const int stream_index = it->index; |
639 const int file_index = GetFileIndexFromStreamIndex(stream_index); | 631 const int file_index = GetFileIndexFromStreamIndex(stream_index); |
640 if (empty_file_omitted_[file_index]) | 632 if (empty_file_omitted_[file_index]) |
641 continue; | 633 continue; |
642 | 634 |
643 SimpleFileEOF eof_record; | 635 SimpleFileEOF eof_record; |
644 eof_record.stream_size = entry_stat.data_size(stream_index); | 636 eof_record.stream_size = entry_stat.data_size(stream_index); |
645 eof_record.final_magic_number = kSimpleFinalMagicNumber; | 637 eof_record.final_magic_number = kSimpleFinalMagicNumber; |
646 eof_record.flags = 0; | 638 eof_record.flags = 0; |
647 if (it->has_crc32) | 639 if (it->has_crc32) |
648 eof_record.flags |= SimpleFileEOF::FLAG_HAS_CRC32; | 640 eof_record.flags |= SimpleFileEOF::FLAG_HAS_CRC32; |
649 eof_record.data_crc32 = it->data_crc32; | 641 eof_record.data_crc32 = it->data_crc32; |
650 int eof_offset = entry_stat.GetEOFOffsetInFile(key_, stream_index); | 642 int eof_offset = entry_stat.GetEOFOffsetInFile(key_, stream_index); |
651 // If stream 0 changed size, the file needs to be resized, otherwise the | 643 // If stream 0 changed size, the file needs to be resized, otherwise the |
652 // next open will yield wrong stream sizes. On stream 1 and stream 2 proper | 644 // next open will yield wrong stream sizes. On stream 1 and stream 2 proper |
653 // resizing of the file is handled in SimpleSynchronousEntry::WriteData(). | 645 // resizing of the file is handled in SimpleSynchronousEntry::WriteData(). |
654 if (stream_index == 0 && | 646 if (stream_index == 0 && !files_[file_index].SetLength(eof_offset)) { |
655 !files_[file_index].SetLength(eof_offset)) { | |
656 RecordCloseResult(cache_type_, CLOSE_RESULT_WRITE_FAILURE); | 647 RecordCloseResult(cache_type_, CLOSE_RESULT_WRITE_FAILURE); |
657 DVLOG(1) << "Could not truncate stream 0 file."; | 648 DVLOG(1) << "Could not truncate stream 0 file."; |
658 Doom(); | 649 Doom(); |
659 break; | 650 break; |
660 } | 651 } |
661 if (files_[file_index].Write(eof_offset, | 652 if (files_[file_index].Write(eof_offset, |
662 reinterpret_cast<const char*>(&eof_record), | 653 reinterpret_cast<const char*>(&eof_record), |
663 sizeof(eof_record)) != | 654 sizeof(eof_record)) != sizeof(eof_record)) { |
664 sizeof(eof_record)) { | |
665 RecordCloseResult(cache_type_, CLOSE_RESULT_WRITE_FAILURE); | 655 RecordCloseResult(cache_type_, CLOSE_RESULT_WRITE_FAILURE); |
666 DVLOG(1) << "Could not write eof record."; | 656 DVLOG(1) << "Could not write eof record."; |
667 Doom(); | 657 Doom(); |
668 break; | 658 break; |
669 } | 659 } |
670 } | 660 } |
671 for (int i = 0; i < kSimpleEntryFileCount; ++i) { | 661 for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
672 if (empty_file_omitted_[i]) | 662 if (empty_file_omitted_[i]) |
673 continue; | 663 continue; |
674 | 664 |
675 files_[i].Close(); | 665 files_[i].Close(); |
676 const int64 file_size = entry_stat.GetFileSize(key_, i); | 666 const int64 file_size = entry_stat.GetFileSize(key_, i); |
677 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, | 667 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, |
678 "LastClusterSize", cache_type_, | 668 "LastClusterSize", |
679 file_size % 4096, 0, 4097, 50); | 669 cache_type_, |
| 670 file_size % 4096, |
| 671 0, |
| 672 4097, |
| 673 50); |
680 const int64 cluster_loss = file_size % 4096 ? 4096 - file_size % 4096 : 0; | 674 const int64 cluster_loss = file_size % 4096 ? 4096 - file_size % 4096 : 0; |
681 SIMPLE_CACHE_UMA(PERCENTAGE, | 675 SIMPLE_CACHE_UMA(PERCENTAGE, |
682 "LastClusterLossPercent", cache_type_, | 676 "LastClusterLossPercent", |
| 677 cache_type_, |
683 cluster_loss * 100 / (cluster_loss + file_size)); | 678 cluster_loss * 100 / (cluster_loss + file_size)); |
684 } | 679 } |
685 | 680 |
686 if (sparse_file_open()) | 681 if (sparse_file_open()) |
687 sparse_file_.Close(); | 682 sparse_file_.Close(); |
688 | 683 |
689 if (files_created_) { | 684 if (files_created_) { |
690 const int stream2_file_index = GetFileIndexFromStreamIndex(2); | 685 const int stream2_file_index = GetFileIndexFromStreamIndex(2); |
691 SIMPLE_CACHE_UMA(BOOLEAN, "EntryCreatedAndStream2Omitted", cache_type_, | 686 SIMPLE_CACHE_UMA(BOOLEAN, |
| 687 "EntryCreatedAndStream2Omitted", |
| 688 cache_type_, |
692 empty_file_omitted_[stream2_file_index]); | 689 empty_file_omitted_[stream2_file_index]); |
693 } | 690 } |
694 RecordCloseResult(cache_type_, CLOSE_RESULT_SUCCESS); | 691 RecordCloseResult(cache_type_, CLOSE_RESULT_SUCCESS); |
695 have_open_files_ = false; | 692 have_open_files_ = false; |
696 delete this; | 693 delete this; |
697 } | 694 } |
698 | 695 |
699 SimpleSynchronousEntry::SimpleSynchronousEntry(net::CacheType cache_type, | 696 SimpleSynchronousEntry::SimpleSynchronousEntry(net::CacheType cache_type, |
700 const FilePath& path, | 697 const FilePath& path, |
701 const std::string& key, | 698 const std::string& key, |
702 const uint64 entry_hash) | 699 const uint64 entry_hash) |
703 : cache_type_(cache_type), | 700 : cache_type_(cache_type), |
704 path_(path), | 701 path_(path), |
705 entry_hash_(entry_hash), | 702 entry_hash_(entry_hash), |
706 key_(key), | 703 key_(key), |
707 have_open_files_(false), | 704 have_open_files_(false), |
708 initialized_(false) { | 705 initialized_(false) { |
709 for (int i = 0; i < kSimpleEntryFileCount; ++i) | 706 for (int i = 0; i < kSimpleEntryFileCount; ++i) |
710 empty_file_omitted_[i] = false; | 707 empty_file_omitted_[i] = false; |
711 } | 708 } |
712 | 709 |
713 SimpleSynchronousEntry::~SimpleSynchronousEntry() { | 710 SimpleSynchronousEntry::~SimpleSynchronousEntry() { |
714 DCHECK(!(have_open_files_ && initialized_)); | 711 DCHECK(!(have_open_files_ && initialized_)); |
715 if (have_open_files_) | 712 if (have_open_files_) |
716 CloseFiles(); | 713 CloseFiles(); |
717 } | 714 } |
718 | 715 |
719 bool SimpleSynchronousEntry::MaybeOpenFile( | 716 bool SimpleSynchronousEntry::MaybeOpenFile(int file_index, |
720 int file_index, | 717 File::Error* out_error) { |
721 File::Error* out_error) { | |
722 DCHECK(out_error); | 718 DCHECK(out_error); |
723 | 719 |
724 FilePath filename = GetFilenameFromFileIndex(file_index); | 720 FilePath filename = GetFilenameFromFileIndex(file_index); |
725 int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; | 721 int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; |
726 files_[file_index].Initialize(filename, flags); | 722 files_[file_index].Initialize(filename, flags); |
727 *out_error = files_[file_index].error_details(); | 723 *out_error = files_[file_index].error_details(); |
728 | 724 |
729 if (CanOmitEmptyFile(file_index) && !files_[file_index].IsValid() && | 725 if (CanOmitEmptyFile(file_index) && !files_[file_index].IsValid() && |
730 *out_error == File::FILE_ERROR_NOT_FOUND) { | 726 *out_error == File::FILE_ERROR_NOT_FOUND) { |
731 empty_file_omitted_[file_index] = true; | 727 empty_file_omitted_[file_index] = true; |
732 return true; | 728 return true; |
733 } | 729 } |
734 | 730 |
735 return files_[file_index].IsValid(); | 731 return files_[file_index].IsValid(); |
736 } | 732 } |
737 | 733 |
738 bool SimpleSynchronousEntry::MaybeCreateFile( | 734 bool SimpleSynchronousEntry::MaybeCreateFile(int file_index, |
739 int file_index, | 735 FileRequired file_required, |
740 FileRequired file_required, | 736 File::Error* out_error) { |
741 File::Error* out_error) { | |
742 DCHECK(out_error); | 737 DCHECK(out_error); |
743 | 738 |
744 if (CanOmitEmptyFile(file_index) && file_required == FILE_NOT_REQUIRED) { | 739 if (CanOmitEmptyFile(file_index) && file_required == FILE_NOT_REQUIRED) { |
745 empty_file_omitted_[file_index] = true; | 740 empty_file_omitted_[file_index] = true; |
746 return true; | 741 return true; |
747 } | 742 } |
748 | 743 |
749 FilePath filename = GetFilenameFromFileIndex(file_index); | 744 FilePath filename = GetFilenameFromFileIndex(file_index); |
750 int flags = File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE; | 745 int flags = File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE; |
751 files_[file_index].Initialize(filename, flags); | 746 files_[file_index].Initialize(filename, flags); |
752 *out_error = files_[file_index].error_details(); | 747 *out_error = files_[file_index].error_details(); |
753 | 748 |
754 empty_file_omitted_[file_index] = false; | 749 empty_file_omitted_[file_index] = false; |
755 | 750 |
756 return files_[file_index].IsValid(); | 751 return files_[file_index].IsValid(); |
757 } | 752 } |
758 | 753 |
759 bool SimpleSynchronousEntry::OpenFiles( | 754 bool SimpleSynchronousEntry::OpenFiles(bool had_index, |
760 bool had_index, | 755 SimpleEntryStat* out_entry_stat) { |
761 SimpleEntryStat* out_entry_stat) { | |
762 for (int i = 0; i < kSimpleEntryFileCount; ++i) { | 756 for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
763 File::Error error; | 757 File::Error error; |
764 if (!MaybeOpenFile(i, &error)) { | 758 if (!MaybeOpenFile(i, &error)) { |
765 // TODO(ttuttle,gavinp): Remove one each of these triplets of histograms. | 759 // TODO(ttuttle,gavinp): Remove one each of these triplets of histograms. |
766 // We can calculate the third as the sum or difference of the other two. | 760 // We can calculate the third as the sum or difference of the other two. |
767 RecordSyncOpenResult( | 761 RecordSyncOpenResult( |
768 cache_type_, OPEN_ENTRY_PLATFORM_FILE_ERROR, had_index); | 762 cache_type_, OPEN_ENTRY_PLATFORM_FILE_ERROR, had_index); |
769 SIMPLE_CACHE_UMA(ENUMERATION, | 763 SIMPLE_CACHE_UMA(ENUMERATION, |
770 "SyncOpenPlatformFileError", cache_type_, | 764 "SyncOpenPlatformFileError", |
771 -error, -base::File::FILE_ERROR_MAX); | 765 cache_type_, |
| 766 -error, |
| 767 -base::File::FILE_ERROR_MAX); |
772 if (had_index) { | 768 if (had_index) { |
773 SIMPLE_CACHE_UMA(ENUMERATION, | 769 SIMPLE_CACHE_UMA(ENUMERATION, |
774 "SyncOpenPlatformFileError_WithIndex", cache_type_, | 770 "SyncOpenPlatformFileError_WithIndex", |
775 -error, -base::File::FILE_ERROR_MAX); | 771 cache_type_, |
| 772 -error, |
| 773 -base::File::FILE_ERROR_MAX); |
776 } else { | 774 } else { |
777 SIMPLE_CACHE_UMA(ENUMERATION, | 775 SIMPLE_CACHE_UMA(ENUMERATION, |
778 "SyncOpenPlatformFileError_WithoutIndex", | 776 "SyncOpenPlatformFileError_WithoutIndex", |
779 cache_type_, | 777 cache_type_, |
780 -error, -base::File::FILE_ERROR_MAX); | 778 -error, |
| 779 -base::File::FILE_ERROR_MAX); |
781 } | 780 } |
782 while (--i >= 0) | 781 while (--i >= 0) |
783 CloseFile(i); | 782 CloseFile(i); |
784 return false; | 783 return false; |
785 } | 784 } |
786 } | 785 } |
787 | 786 |
788 have_open_files_ = true; | 787 have_open_files_ = true; |
789 | 788 |
790 base::TimeDelta entry_age = base::Time::Now() - base::Time::UnixEpoch(); | 789 base::TimeDelta entry_age = base::Time::Now() - base::Time::UnixEpoch(); |
(...skipping 30 matching lines...) Expand all Loading... |
821 // |data_size(1)| and |data_size(2)| respectively. Reading the key in | 820 // |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 | 821 // 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 | 822 // 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 | 823 // 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 | 824 // 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 | 825 // stream 1 and stream 0 is only determined after reading the EOF record |
827 // for stream 0 in ReadAndValidateStream0. | 826 // for stream 0 in ReadAndValidateStream0. |
828 out_entry_stat->set_data_size(i + 1, file_info.size); | 827 out_entry_stat->set_data_size(i + 1, file_info.size); |
829 } | 828 } |
830 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, | 829 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, |
831 "SyncOpenEntryAge", cache_type_, | 830 "SyncOpenEntryAge", |
832 entry_age.InHours(), 1, 1000, 50); | 831 cache_type_, |
| 832 entry_age.InHours(), |
| 833 1, |
| 834 1000, |
| 835 50); |
833 | 836 |
834 files_created_ = false; | 837 files_created_ = false; |
835 | 838 |
836 return true; | 839 return true; |
837 } | 840 } |
838 | 841 |
839 bool SimpleSynchronousEntry::CreateFiles( | 842 bool SimpleSynchronousEntry::CreateFiles(bool had_index, |
840 bool had_index, | 843 SimpleEntryStat* out_entry_stat) { |
841 SimpleEntryStat* out_entry_stat) { | |
842 for (int i = 0; i < kSimpleEntryFileCount; ++i) { | 844 for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
843 File::Error error; | 845 File::Error error; |
844 if (!MaybeCreateFile(i, FILE_NOT_REQUIRED, &error)) { | 846 if (!MaybeCreateFile(i, FILE_NOT_REQUIRED, &error)) { |
845 // TODO(ttuttle,gavinp): Remove one each of these triplets of histograms. | 847 // TODO(ttuttle,gavinp): Remove one each of these triplets of histograms. |
846 // We can calculate the third as the sum or difference of the other two. | 848 // We can calculate the third as the sum or difference of the other two. |
847 RecordSyncCreateResult(CREATE_ENTRY_PLATFORM_FILE_ERROR, had_index); | 849 RecordSyncCreateResult(CREATE_ENTRY_PLATFORM_FILE_ERROR, had_index); |
848 SIMPLE_CACHE_UMA(ENUMERATION, | 850 SIMPLE_CACHE_UMA(ENUMERATION, |
849 "SyncCreatePlatformFileError", cache_type_, | 851 "SyncCreatePlatformFileError", |
850 -error, -base::File::FILE_ERROR_MAX); | 852 cache_type_, |
| 853 -error, |
| 854 -base::File::FILE_ERROR_MAX); |
851 if (had_index) { | 855 if (had_index) { |
852 SIMPLE_CACHE_UMA(ENUMERATION, | 856 SIMPLE_CACHE_UMA(ENUMERATION, |
853 "SyncCreatePlatformFileError_WithIndex", cache_type_, | 857 "SyncCreatePlatformFileError_WithIndex", |
854 -error, -base::File::FILE_ERROR_MAX); | 858 cache_type_, |
| 859 -error, |
| 860 -base::File::FILE_ERROR_MAX); |
855 } else { | 861 } else { |
856 SIMPLE_CACHE_UMA(ENUMERATION, | 862 SIMPLE_CACHE_UMA(ENUMERATION, |
857 "SyncCreatePlatformFileError_WithoutIndex", | 863 "SyncCreatePlatformFileError_WithoutIndex", |
858 cache_type_, | 864 cache_type_, |
859 -error, -base::File::FILE_ERROR_MAX); | 865 -error, |
| 866 -base::File::FILE_ERROR_MAX); |
860 } | 867 } |
861 while (--i >= 0) | 868 while (--i >= 0) |
862 CloseFile(i); | 869 CloseFile(i); |
863 return false; | 870 return false; |
864 } | 871 } |
865 } | 872 } |
866 | 873 |
867 have_open_files_ = true; | 874 have_open_files_ = true; |
868 | 875 |
869 base::Time creation_time = Time::Now(); | 876 base::Time creation_time = Time::Now(); |
870 out_entry_stat->set_last_modified(creation_time); | 877 out_entry_stat->set_last_modified(creation_time); |
871 out_entry_stat->set_last_used(creation_time); | 878 out_entry_stat->set_last_used(creation_time); |
872 for (int i = 0; i < kSimpleEntryStreamCount; ++i) | 879 for (int i = 0; i < kSimpleEntryStreamCount; ++i) |
873 out_entry_stat->set_data_size(i, 0); | 880 out_entry_stat->set_data_size(i, 0); |
874 | 881 |
875 files_created_ = true; | 882 files_created_ = true; |
876 | 883 |
877 return true; | 884 return true; |
878 } | 885 } |
879 | 886 |
880 void SimpleSynchronousEntry::CloseFile(int index) { | 887 void SimpleSynchronousEntry::CloseFile(int index) { |
881 if (empty_file_omitted_[index]) { | 888 if (empty_file_omitted_[index]) { |
882 empty_file_omitted_[index] = false; | 889 empty_file_omitted_[index] = false; |
883 } else { | 890 } else { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 return net::ERR_FAILED; | 933 return net::ERR_FAILED; |
927 } | 934 } |
928 | 935 |
929 if (header.version != kSimpleEntryVersionOnDisk) { | 936 if (header.version != kSimpleEntryVersionOnDisk) { |
930 DLOG(WARNING) << "Unreadable version."; | 937 DLOG(WARNING) << "Unreadable version."; |
931 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_BAD_VERSION, had_index); | 938 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_BAD_VERSION, had_index); |
932 return net::ERR_FAILED; | 939 return net::ERR_FAILED; |
933 } | 940 } |
934 | 941 |
935 scoped_ptr<char[]> key(new char[header.key_length]); | 942 scoped_ptr<char[]> key(new char[header.key_length]); |
936 int key_read_result = files_[i].Read(sizeof(header), key.get(), | 943 int key_read_result = |
937 header.key_length); | 944 files_[i].Read(sizeof(header), key.get(), header.key_length); |
938 if (key_read_result != implicit_cast<int>(header.key_length)) { | 945 if (key_read_result != implicit_cast<int>(header.key_length)) { |
939 DLOG(WARNING) << "Cannot read key from entry."; | 946 DLOG(WARNING) << "Cannot read key from entry."; |
940 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_CANT_READ_KEY, had_index); | 947 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_CANT_READ_KEY, had_index); |
941 return net::ERR_FAILED; | 948 return net::ERR_FAILED; |
942 } | 949 } |
943 | 950 |
944 key_ = std::string(key.get(), header.key_length); | 951 key_ = std::string(key.get(), header.key_length); |
945 if (i == 0) { | 952 if (i == 0) { |
946 // File size for stream 0 has been stored temporarily in data_size[1]. | 953 // File size for stream 0 has been stored temporarily in data_size[1]. |
947 int total_data_size = | 954 int total_data_size = |
(...skipping 14 matching lines...) Expand all Loading... |
962 if (base::Hash(key.get(), header.key_length) != header.key_hash) { | 969 if (base::Hash(key.get(), header.key_length) != header.key_hash) { |
963 DLOG(WARNING) << "Hash mismatch on key."; | 970 DLOG(WARNING) << "Hash mismatch on key."; |
964 RecordSyncOpenResult( | 971 RecordSyncOpenResult( |
965 cache_type_, OPEN_ENTRY_KEY_HASH_MISMATCH, had_index); | 972 cache_type_, OPEN_ENTRY_KEY_HASH_MISMATCH, had_index); |
966 return net::ERR_FAILED; | 973 return net::ERR_FAILED; |
967 } | 974 } |
968 } | 975 } |
969 | 976 |
970 int32 sparse_data_size = 0; | 977 int32 sparse_data_size = 0; |
971 if (!OpenSparseFileIfExists(&sparse_data_size)) { | 978 if (!OpenSparseFileIfExists(&sparse_data_size)) { |
972 RecordSyncOpenResult( | 979 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_SPARSE_OPEN_FAILED, had_index); |
973 cache_type_, OPEN_ENTRY_SPARSE_OPEN_FAILED, had_index); | |
974 return net::ERR_FAILED; | 980 return net::ERR_FAILED; |
975 } | 981 } |
976 out_entry_stat->set_sparse_data_size(sparse_data_size); | 982 out_entry_stat->set_sparse_data_size(sparse_data_size); |
977 | 983 |
978 bool removed_stream2 = false; | 984 bool removed_stream2 = false; |
979 const int stream2_file_index = GetFileIndexFromStreamIndex(2); | 985 const int stream2_file_index = GetFileIndexFromStreamIndex(2); |
980 DCHECK(CanOmitEmptyFile(stream2_file_index)); | 986 DCHECK(CanOmitEmptyFile(stream2_file_index)); |
981 if (!empty_file_omitted_[stream2_file_index] && | 987 if (!empty_file_omitted_[stream2_file_index] && |
982 out_entry_stat->data_size(2) == 0) { | 988 out_entry_stat->data_size(2) == 0) { |
983 DVLOG(1) << "Removing empty stream 2 file."; | 989 DVLOG(1) << "Removing empty stream 2 file."; |
984 CloseFile(stream2_file_index); | 990 CloseFile(stream2_file_index); |
985 DeleteFileForEntryHash(path_, entry_hash_, stream2_file_index); | 991 DeleteFileForEntryHash(path_, entry_hash_, stream2_file_index); |
986 empty_file_omitted_[stream2_file_index] = true; | 992 empty_file_omitted_[stream2_file_index] = true; |
987 removed_stream2 = true; | 993 removed_stream2 = true; |
988 } | 994 } |
989 | 995 |
990 SIMPLE_CACHE_UMA(BOOLEAN, "EntryOpenedAndStream2Removed", cache_type_, | 996 SIMPLE_CACHE_UMA( |
991 removed_stream2); | 997 BOOLEAN, "EntryOpenedAndStream2Removed", cache_type_, removed_stream2); |
992 | 998 |
993 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_SUCCESS, had_index); | 999 RecordSyncOpenResult(cache_type_, OPEN_ENTRY_SUCCESS, had_index); |
994 initialized_ = true; | 1000 initialized_ = true; |
995 return net::OK; | 1001 return net::OK; |
996 } | 1002 } |
997 | 1003 |
998 bool SimpleSynchronousEntry::InitializeCreatedFile( | 1004 bool SimpleSynchronousEntry::InitializeCreatedFile( |
999 int file_index, | 1005 int file_index, |
1000 CreateEntryResult* out_result) { | 1006 CreateEntryResult* out_result) { |
1001 SimpleFileHeader header; | 1007 SimpleFileHeader header; |
1002 header.initial_magic_number = kSimpleInitialMagicNumber; | 1008 header.initial_magic_number = kSimpleInitialMagicNumber; |
1003 header.version = kSimpleEntryVersionOnDisk; | 1009 header.version = kSimpleEntryVersionOnDisk; |
1004 | 1010 |
1005 header.key_length = key_.size(); | 1011 header.key_length = key_.size(); |
1006 header.key_hash = base::Hash(key_); | 1012 header.key_hash = base::Hash(key_); |
1007 | 1013 |
1008 int bytes_written = files_[file_index].Write( | 1014 int bytes_written = files_[file_index].Write( |
1009 0, reinterpret_cast<char*>(&header), sizeof(header)); | 1015 0, reinterpret_cast<char*>(&header), sizeof(header)); |
1010 if (bytes_written != sizeof(header)) { | 1016 if (bytes_written != sizeof(header)) { |
1011 *out_result = CREATE_ENTRY_CANT_WRITE_HEADER; | 1017 *out_result = CREATE_ENTRY_CANT_WRITE_HEADER; |
1012 return false; | 1018 return false; |
1013 } | 1019 } |
1014 | 1020 |
1015 bytes_written = files_[file_index].Write(sizeof(header), key_.data(), | 1021 bytes_written = |
1016 key_.size()); | 1022 files_[file_index].Write(sizeof(header), key_.data(), key_.size()); |
1017 if (bytes_written != implicit_cast<int>(key_.size())) { | 1023 if (bytes_written != implicit_cast<int>(key_.size())) { |
1018 *out_result = CREATE_ENTRY_CANT_WRITE_KEY; | 1024 *out_result = CREATE_ENTRY_CANT_WRITE_KEY; |
1019 return false; | 1025 return false; |
1020 } | 1026 } |
1021 | 1027 |
1022 return true; | 1028 return true; |
1023 } | 1029 } |
1024 | 1030 |
1025 int SimpleSynchronousEntry::InitializeForCreate( | 1031 int SimpleSynchronousEntry::InitializeForCreate( |
1026 bool had_index, | 1032 bool had_index, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 int ret_value_crc32 = GetEOFRecordData( | 1067 int ret_value_crc32 = GetEOFRecordData( |
1062 0, *out_entry_stat, &has_crc32, &read_crc32, &stream_0_size); | 1068 0, *out_entry_stat, &has_crc32, &read_crc32, &stream_0_size); |
1063 if (ret_value_crc32 != net::OK) | 1069 if (ret_value_crc32 != net::OK) |
1064 return ret_value_crc32; | 1070 return ret_value_crc32; |
1065 | 1071 |
1066 if (stream_0_size > out_entry_stat->data_size(1)) | 1072 if (stream_0_size > out_entry_stat->data_size(1)) |
1067 return net::ERR_FAILED; | 1073 return net::ERR_FAILED; |
1068 | 1074 |
1069 // These are the real values of data size. | 1075 // These are the real values of data size. |
1070 out_entry_stat->set_data_size(0, stream_0_size); | 1076 out_entry_stat->set_data_size(0, stream_0_size); |
1071 out_entry_stat->set_data_size( | 1077 out_entry_stat->set_data_size(1, |
1072 1, out_entry_stat->data_size(1) - stream_0_size); | 1078 out_entry_stat->data_size(1) - stream_0_size); |
1073 | 1079 |
1074 // Put stream 0 data in memory. | 1080 // Put stream 0 data in memory. |
1075 *stream_0_data = new net::GrowableIOBuffer(); | 1081 *stream_0_data = new net::GrowableIOBuffer(); |
1076 (*stream_0_data)->SetCapacity(stream_0_size); | 1082 (*stream_0_data)->SetCapacity(stream_0_size); |
1077 int file_offset = out_entry_stat->GetOffsetInFile(key_, 0, 0); | 1083 int file_offset = out_entry_stat->GetOffsetInFile(key_, 0, 0); |
1078 File* file = const_cast<File*>(&files_[0]); | 1084 File* file = const_cast<File*>(&files_[0]); |
1079 int bytes_read = | 1085 int bytes_read = |
1080 file->Read(file_offset, (*stream_0_data)->data(), stream_0_size); | 1086 file->Read(file_offset, (*stream_0_data)->data(), stream_0_size); |
1081 if (bytes_read != stream_0_size) | 1087 if (bytes_read != stream_0_size) |
1082 return net::ERR_FAILED; | 1088 return net::ERR_FAILED; |
(...skipping 17 matching lines...) Expand all Loading... |
1100 | 1106 |
1101 int SimpleSynchronousEntry::GetEOFRecordData(int index, | 1107 int SimpleSynchronousEntry::GetEOFRecordData(int index, |
1102 const SimpleEntryStat& entry_stat, | 1108 const SimpleEntryStat& entry_stat, |
1103 bool* out_has_crc32, | 1109 bool* out_has_crc32, |
1104 uint32* out_crc32, | 1110 uint32* out_crc32, |
1105 int* out_data_size) const { | 1111 int* out_data_size) const { |
1106 SimpleFileEOF eof_record; | 1112 SimpleFileEOF eof_record; |
1107 int file_offset = entry_stat.GetEOFOffsetInFile(key_, index); | 1113 int file_offset = entry_stat.GetEOFOffsetInFile(key_, index); |
1108 int file_index = GetFileIndexFromStreamIndex(index); | 1114 int file_index = GetFileIndexFromStreamIndex(index); |
1109 File* file = const_cast<File*>(&files_[file_index]); | 1115 File* file = const_cast<File*>(&files_[file_index]); |
1110 if (file->Read(file_offset, reinterpret_cast<char*>(&eof_record), | 1116 if (file->Read(file_offset, |
1111 sizeof(eof_record)) != | 1117 reinterpret_cast<char*>(&eof_record), |
1112 sizeof(eof_record)) { | 1118 sizeof(eof_record)) != sizeof(eof_record)) { |
1113 RecordCheckEOFResult(cache_type_, CHECK_EOF_RESULT_READ_FAILURE); | 1119 RecordCheckEOFResult(cache_type_, CHECK_EOF_RESULT_READ_FAILURE); |
1114 return net::ERR_CACHE_CHECKSUM_READ_FAILURE; | 1120 return net::ERR_CACHE_CHECKSUM_READ_FAILURE; |
1115 } | 1121 } |
1116 | 1122 |
1117 if (eof_record.final_magic_number != kSimpleFinalMagicNumber) { | 1123 if (eof_record.final_magic_number != kSimpleFinalMagicNumber) { |
1118 RecordCheckEOFResult(cache_type_, CHECK_EOF_RESULT_MAGIC_NUMBER_MISMATCH); | 1124 RecordCheckEOFResult(cache_type_, CHECK_EOF_RESULT_MAGIC_NUMBER_MISMATCH); |
1119 DVLOG(1) << "EOF record had bad magic number."; | 1125 DVLOG(1) << "EOF record had bad magic number."; |
1120 return net::ERR_CACHE_CHECKSUM_READ_FAILURE; | 1126 return net::ERR_CACHE_CHECKSUM_READ_FAILURE; |
1121 } | 1127 } |
1122 | 1128 |
1123 *out_has_crc32 = (eof_record.flags & SimpleFileEOF::FLAG_HAS_CRC32) == | 1129 *out_has_crc32 = (eof_record.flags & SimpleFileEOF::FLAG_HAS_CRC32) == |
1124 SimpleFileEOF::FLAG_HAS_CRC32; | 1130 SimpleFileEOF::FLAG_HAS_CRC32; |
1125 *out_crc32 = eof_record.data_crc32; | 1131 *out_crc32 = eof_record.data_crc32; |
1126 *out_data_size = eof_record.stream_size; | 1132 *out_data_size = eof_record.stream_size; |
1127 SIMPLE_CACHE_UMA(BOOLEAN, "SyncCheckEOFHasCrc", cache_type_, *out_has_crc32); | 1133 SIMPLE_CACHE_UMA(BOOLEAN, "SyncCheckEOFHasCrc", cache_type_, *out_has_crc32); |
1128 return net::OK; | 1134 return net::OK; |
1129 } | 1135 } |
1130 | 1136 |
1131 void SimpleSynchronousEntry::Doom() const { | 1137 void SimpleSynchronousEntry::Doom() const { |
1132 DeleteFilesForEntryHash(path_, entry_hash_); | 1138 DeleteFilesForEntryHash(path_, entry_hash_); |
1133 } | 1139 } |
1134 | 1140 |
1135 // static | 1141 // static |
1136 bool SimpleSynchronousEntry::DeleteFileForEntryHash( | 1142 bool SimpleSynchronousEntry::DeleteFileForEntryHash(const FilePath& path, |
1137 const FilePath& path, | 1143 const uint64 entry_hash, |
1138 const uint64 entry_hash, | 1144 const int file_index) { |
1139 const int file_index) { | |
1140 FilePath to_delete = path.AppendASCII( | 1145 FilePath to_delete = path.AppendASCII( |
1141 GetFilenameFromEntryHashAndFileIndex(entry_hash, file_index)); | 1146 GetFilenameFromEntryHashAndFileIndex(entry_hash, file_index)); |
1142 return base::DeleteFile(to_delete, false); | 1147 return base::DeleteFile(to_delete, false); |
1143 } | 1148 } |
1144 | 1149 |
1145 // static | 1150 // static |
1146 bool SimpleSynchronousEntry::DeleteFilesForEntryHash( | 1151 bool SimpleSynchronousEntry::DeleteFilesForEntryHash(const FilePath& path, |
1147 const FilePath& path, | 1152 const uint64 entry_hash) { |
1148 const uint64 entry_hash) { | |
1149 bool result = true; | 1153 bool result = true; |
1150 for (int i = 0; i < kSimpleEntryFileCount; ++i) { | 1154 for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
1151 if (!DeleteFileForEntryHash(path, entry_hash, i) && !CanOmitEmptyFile(i)) | 1155 if (!DeleteFileForEntryHash(path, entry_hash, i) && !CanOmitEmptyFile(i)) |
1152 result = false; | 1156 result = false; |
1153 } | 1157 } |
1154 FilePath to_delete = path.AppendASCII( | 1158 FilePath to_delete = |
1155 GetSparseFilenameFromEntryHash(entry_hash)); | 1159 path.AppendASCII(GetSparseFilenameFromEntryHash(entry_hash)); |
1156 base::DeleteFile(to_delete, false); | 1160 base::DeleteFile(to_delete, false); |
1157 return result; | 1161 return result; |
1158 } | 1162 } |
1159 | 1163 |
1160 void SimpleSynchronousEntry::RecordSyncCreateResult(CreateEntryResult result, | 1164 void SimpleSynchronousEntry::RecordSyncCreateResult(CreateEntryResult result, |
1161 bool had_index) { | 1165 bool had_index) { |
1162 DCHECK_GT(CREATE_ENTRY_MAX, result); | 1166 DCHECK_GT(CREATE_ENTRY_MAX, result); |
1163 SIMPLE_CACHE_UMA(ENUMERATION, | 1167 SIMPLE_CACHE_UMA( |
1164 "SyncCreateResult", cache_type_, result, CREATE_ENTRY_MAX); | 1168 ENUMERATION, "SyncCreateResult", cache_type_, result, CREATE_ENTRY_MAX); |
1165 if (had_index) { | 1169 if (had_index) { |
1166 SIMPLE_CACHE_UMA(ENUMERATION, | 1170 SIMPLE_CACHE_UMA(ENUMERATION, |
1167 "SyncCreateResult_WithIndex", cache_type_, | 1171 "SyncCreateResult_WithIndex", |
1168 result, CREATE_ENTRY_MAX); | 1172 cache_type_, |
| 1173 result, |
| 1174 CREATE_ENTRY_MAX); |
1169 } else { | 1175 } else { |
1170 SIMPLE_CACHE_UMA(ENUMERATION, | 1176 SIMPLE_CACHE_UMA(ENUMERATION, |
1171 "SyncCreateResult_WithoutIndex", cache_type_, | 1177 "SyncCreateResult_WithoutIndex", |
1172 result, CREATE_ENTRY_MAX); | 1178 cache_type_, |
| 1179 result, |
| 1180 CREATE_ENTRY_MAX); |
1173 } | 1181 } |
1174 } | 1182 } |
1175 | 1183 |
1176 FilePath SimpleSynchronousEntry::GetFilenameFromFileIndex(int file_index) { | 1184 FilePath SimpleSynchronousEntry::GetFilenameFromFileIndex(int file_index) { |
1177 return path_.AppendASCII( | 1185 return path_.AppendASCII( |
1178 GetFilenameFromEntryHashAndFileIndex(entry_hash_, file_index)); | 1186 GetFilenameFromEntryHashAndFileIndex(entry_hash_, file_index)); |
1179 } | 1187 } |
1180 | 1188 |
1181 bool SimpleSynchronousEntry::OpenSparseFileIfExists( | 1189 bool SimpleSynchronousEntry::OpenSparseFileIfExists( |
1182 int32* out_sparse_data_size) { | 1190 int32* out_sparse_data_size) { |
1183 DCHECK(!sparse_file_open()); | 1191 DCHECK(!sparse_file_open()); |
1184 | 1192 |
1185 FilePath filename = path_.AppendASCII( | 1193 FilePath filename = |
1186 GetSparseFilenameFromEntryHash(entry_hash_)); | 1194 path_.AppendASCII(GetSparseFilenameFromEntryHash(entry_hash_)); |
1187 int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; | 1195 int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; |
1188 sparse_file_.Initialize(filename, flags); | 1196 sparse_file_.Initialize(filename, flags); |
1189 if (sparse_file_.IsValid()) | 1197 if (sparse_file_.IsValid()) |
1190 return ScanSparseFile(out_sparse_data_size); | 1198 return ScanSparseFile(out_sparse_data_size); |
1191 | 1199 |
1192 return sparse_file_.error_details() == File::FILE_ERROR_NOT_FOUND; | 1200 return sparse_file_.error_details() == File::FILE_ERROR_NOT_FOUND; |
1193 } | 1201 } |
1194 | 1202 |
1195 bool SimpleSynchronousEntry::CreateSparseFile() { | 1203 bool SimpleSynchronousEntry::CreateSparseFile() { |
1196 DCHECK(!sparse_file_open()); | 1204 DCHECK(!sparse_file_open()); |
1197 | 1205 |
1198 FilePath filename = path_.AppendASCII( | 1206 FilePath filename = |
1199 GetSparseFilenameFromEntryHash(entry_hash_)); | 1207 path_.AppendASCII(GetSparseFilenameFromEntryHash(entry_hash_)); |
1200 int flags = File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE; | 1208 int flags = File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE; |
1201 sparse_file_.Initialize(filename, flags); | 1209 sparse_file_.Initialize(filename, flags); |
1202 if (!sparse_file_.IsValid()) | 1210 if (!sparse_file_.IsValid()) |
1203 return false; | 1211 return false; |
1204 | 1212 |
1205 return InitializeSparseFile(); | 1213 return InitializeSparseFile(); |
1206 } | 1214 } |
1207 | 1215 |
1208 void SimpleSynchronousEntry::CloseSparseFile() { | 1216 void SimpleSynchronousEntry::CloseSparseFile() { |
1209 DCHECK(sparse_file_open()); | 1217 DCHECK(sparse_file_open()); |
(...skipping 23 matching lines...) Expand all Loading... |
1233 header.key_length = key_.size(); | 1241 header.key_length = key_.size(); |
1234 header.key_hash = base::Hash(key_); | 1242 header.key_hash = base::Hash(key_); |
1235 | 1243 |
1236 int header_write_result = | 1244 int header_write_result = |
1237 sparse_file_.Write(0, reinterpret_cast<char*>(&header), sizeof(header)); | 1245 sparse_file_.Write(0, reinterpret_cast<char*>(&header), sizeof(header)); |
1238 if (header_write_result != sizeof(header)) { | 1246 if (header_write_result != sizeof(header)) { |
1239 DLOG(WARNING) << "Could not write sparse file header"; | 1247 DLOG(WARNING) << "Could not write sparse file header"; |
1240 return false; | 1248 return false; |
1241 } | 1249 } |
1242 | 1250 |
1243 int key_write_result = sparse_file_.Write(sizeof(header), key_.data(), | 1251 int key_write_result = |
1244 key_.size()); | 1252 sparse_file_.Write(sizeof(header), key_.data(), key_.size()); |
1245 if (key_write_result != implicit_cast<int>(key_.size())) { | 1253 if (key_write_result != implicit_cast<int>(key_.size())) { |
1246 DLOG(WARNING) << "Could not write sparse file key"; | 1254 DLOG(WARNING) << "Could not write sparse file key"; |
1247 return false; | 1255 return false; |
1248 } | 1256 } |
1249 | 1257 |
1250 sparse_ranges_.clear(); | 1258 sparse_ranges_.clear(); |
1251 sparse_tail_offset_ = sizeof(header) + key_.size(); | 1259 sparse_tail_offset_ = sizeof(header) + key_.size(); |
1252 | 1260 |
1253 return true; | 1261 return true; |
1254 } | 1262 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1311 sparse_data_size += range.length; | 1319 sparse_data_size += range.length; |
1312 } | 1320 } |
1313 | 1321 |
1314 *out_sparse_data_size = sparse_data_size; | 1322 *out_sparse_data_size = sparse_data_size; |
1315 sparse_tail_offset_ = range_header_offset; | 1323 sparse_tail_offset_ = range_header_offset; |
1316 | 1324 |
1317 return true; | 1325 return true; |
1318 } | 1326 } |
1319 | 1327 |
1320 bool SimpleSynchronousEntry::ReadSparseRange(const SparseRange* range, | 1328 bool SimpleSynchronousEntry::ReadSparseRange(const SparseRange* range, |
1321 int offset, int len, char* buf) { | 1329 int offset, |
| 1330 int len, |
| 1331 char* buf) { |
1322 DCHECK(range); | 1332 DCHECK(range); |
1323 DCHECK(buf); | 1333 DCHECK(buf); |
1324 DCHECK_GE(range->length, offset); | 1334 DCHECK_GE(range->length, offset); |
1325 DCHECK_GE(range->length, offset + len); | 1335 DCHECK_GE(range->length, offset + len); |
1326 | 1336 |
1327 int bytes_read = sparse_file_.Read(range->file_offset + offset, buf, len); | 1337 int bytes_read = sparse_file_.Read(range->file_offset + offset, buf, len); |
1328 if (bytes_read < len) { | 1338 if (bytes_read < len) { |
1329 DLOG(WARNING) << "Could not read sparse range."; | 1339 DLOG(WARNING) << "Could not read sparse range."; |
1330 return false; | 1340 return false; |
1331 } | 1341 } |
1332 | 1342 |
1333 // If we read the whole range and we have a crc32, check it. | 1343 // If we read the whole range and we have a crc32, check it. |
1334 if (offset == 0 && len == range->length && range->data_crc32 != 0) { | 1344 if (offset == 0 && len == range->length && range->data_crc32 != 0) { |
1335 uint32 actual_crc32 = crc32(crc32(0L, Z_NULL, 0), | 1345 uint32 actual_crc32 = |
1336 reinterpret_cast<const Bytef*>(buf), | 1346 crc32(crc32(0L, Z_NULL, 0), reinterpret_cast<const Bytef*>(buf), len); |
1337 len); | |
1338 if (actual_crc32 != range->data_crc32) { | 1347 if (actual_crc32 != range->data_crc32) { |
1339 DLOG(WARNING) << "Sparse range crc32 mismatch."; | 1348 DLOG(WARNING) << "Sparse range crc32 mismatch."; |
1340 return false; | 1349 return false; |
1341 } | 1350 } |
1342 } | 1351 } |
1343 // TODO(ttuttle): Incremental crc32 calculation? | 1352 // TODO(ttuttle): Incremental crc32 calculation? |
1344 | 1353 |
1345 return true; | 1354 return true; |
1346 } | 1355 } |
1347 | 1356 |
1348 bool SimpleSynchronousEntry::WriteSparseRange(SparseRange* range, | 1357 bool SimpleSynchronousEntry::WriteSparseRange(SparseRange* range, |
1349 int offset, int len, | 1358 int offset, |
| 1359 int len, |
1350 const char* buf) { | 1360 const char* buf) { |
1351 DCHECK(range); | 1361 DCHECK(range); |
1352 DCHECK(buf); | 1362 DCHECK(buf); |
1353 DCHECK_GE(range->length, offset); | 1363 DCHECK_GE(range->length, offset); |
1354 DCHECK_GE(range->length, offset + len); | 1364 DCHECK_GE(range->length, offset + len); |
1355 | 1365 |
1356 uint32 new_crc32 = 0; | 1366 uint32 new_crc32 = 0; |
1357 if (offset == 0 && len == range->length) { | 1367 if (offset == 0 && len == range->length) { |
1358 new_crc32 = crc32(crc32(0L, Z_NULL, 0), | 1368 new_crc32 = |
1359 reinterpret_cast<const Bytef*>(buf), | 1369 crc32(crc32(0L, Z_NULL, 0), reinterpret_cast<const Bytef*>(buf), len); |
1360 len); | |
1361 } | 1370 } |
1362 | 1371 |
1363 if (new_crc32 != range->data_crc32) { | 1372 if (new_crc32 != range->data_crc32) { |
1364 range->data_crc32 = new_crc32; | 1373 range->data_crc32 = new_crc32; |
1365 | 1374 |
1366 SimpleFileSparseRangeHeader header; | 1375 SimpleFileSparseRangeHeader header; |
1367 header.sparse_range_magic_number = kSimpleSparseRangeMagicNumber; | 1376 header.sparse_range_magic_number = kSimpleSparseRangeMagicNumber; |
1368 header.offset = range->offset; | 1377 header.offset = range->offset; |
1369 header.length = range->length; | 1378 header.length = range->length; |
1370 header.data_crc32 = range->data_crc32; | 1379 header.data_crc32 = range->data_crc32; |
(...skipping 16 matching lines...) Expand all Loading... |
1387 return true; | 1396 return true; |
1388 } | 1397 } |
1389 | 1398 |
1390 bool SimpleSynchronousEntry::AppendSparseRange(int64 offset, | 1399 bool SimpleSynchronousEntry::AppendSparseRange(int64 offset, |
1391 int len, | 1400 int len, |
1392 const char* buf) { | 1401 const char* buf) { |
1393 DCHECK_LE(0, offset); | 1402 DCHECK_LE(0, offset); |
1394 DCHECK_LT(0, len); | 1403 DCHECK_LT(0, len); |
1395 DCHECK(buf); | 1404 DCHECK(buf); |
1396 | 1405 |
1397 uint32 data_crc32 = crc32(crc32(0L, Z_NULL, 0), | 1406 uint32 data_crc32 = |
1398 reinterpret_cast<const Bytef*>(buf), | 1407 crc32(crc32(0L, Z_NULL, 0), reinterpret_cast<const Bytef*>(buf), len); |
1399 len); | |
1400 | 1408 |
1401 SimpleFileSparseRangeHeader header; | 1409 SimpleFileSparseRangeHeader header; |
1402 header.sparse_range_magic_number = kSimpleSparseRangeMagicNumber; | 1410 header.sparse_range_magic_number = kSimpleSparseRangeMagicNumber; |
1403 header.offset = offset; | 1411 header.offset = offset; |
1404 header.length = len; | 1412 header.length = len; |
1405 header.data_crc32 = data_crc32; | 1413 header.data_crc32 = data_crc32; |
1406 | 1414 |
1407 int bytes_written = sparse_file_.Write(sparse_tail_offset_, | 1415 int bytes_written = sparse_file_.Write( |
1408 reinterpret_cast<char*>(&header), | 1416 sparse_tail_offset_, reinterpret_cast<char*>(&header), sizeof(header)); |
1409 sizeof(header)); | |
1410 if (bytes_written != implicit_cast<int>(sizeof(header))) { | 1417 if (bytes_written != implicit_cast<int>(sizeof(header))) { |
1411 DLOG(WARNING) << "Could not append sparse range header."; | 1418 DLOG(WARNING) << "Could not append sparse range header."; |
1412 return false; | 1419 return false; |
1413 } | 1420 } |
1414 sparse_tail_offset_ += bytes_written; | 1421 sparse_tail_offset_ += bytes_written; |
1415 | 1422 |
1416 bytes_written = sparse_file_.Write(sparse_tail_offset_, buf, len); | 1423 bytes_written = sparse_file_.Write(sparse_tail_offset_, buf, len); |
1417 if (bytes_written < len) { | 1424 if (bytes_written < len) { |
1418 DLOG(WARNING) << "Could not append sparse range data."; | 1425 DLOG(WARNING) << "Could not append sparse range data."; |
1419 return false; | 1426 return false; |
1420 } | 1427 } |
1421 int64 data_file_offset = sparse_tail_offset_; | 1428 int64 data_file_offset = sparse_tail_offset_; |
1422 sparse_tail_offset_ += bytes_written; | 1429 sparse_tail_offset_ += bytes_written; |
1423 | 1430 |
1424 SparseRange range; | 1431 SparseRange range; |
1425 range.offset = offset; | 1432 range.offset = offset; |
1426 range.length = len; | 1433 range.length = len; |
1427 range.data_crc32 = data_crc32; | 1434 range.data_crc32 = data_crc32; |
1428 range.file_offset = data_file_offset; | 1435 range.file_offset = data_file_offset; |
1429 sparse_ranges_.insert(std::make_pair(offset, range)); | 1436 sparse_ranges_.insert(std::make_pair(offset, range)); |
1430 | 1437 |
1431 return true; | 1438 return true; |
1432 } | 1439 } |
1433 | 1440 |
1434 } // namespace disk_cache | 1441 } // namespace disk_cache |
OLD | NEW |