Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: net/disk_cache/sparse_control.cc

Issue 15203004: Disk cache: Reference CL for the implementation of file format version 3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: IndexTable review Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/disk_cache/rankings.cc ('k') | net/disk_cache/stats.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/disk_cache/sparse_control.h" 5 #include "net/disk_cache/sparse_control.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/format_macros.h" 8 #include "base/format_macros.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 int child_id = 0; 129 int child_id = 0;
130 if (!children_map_.FindNextSetBit(&child_id) || !backend_) { 130 if (!children_map_.FindNextSetBit(&child_id) || !backend_) {
131 // We are done. Just delete this object. 131 // We are done. Just delete this object.
132 return Release(); 132 return Release();
133 } 133 }
134 std::string child_name = GenerateChildName(name_, signature_, child_id); 134 std::string child_name = GenerateChildName(name_, signature_, child_id);
135 backend_->SyncDoomEntry(child_name); 135 backend_->SyncDoomEntry(child_name);
136 children_map_.Set(child_id, false); 136 children_map_.Set(child_id, false);
137 137
138 // Post a task to delete the next child. 138 // Post a task to delete the next child.
139 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 139 base::MessageLoop::current()->PostTask(
140 &ChildrenDeleter::DeleteChildren, this)); 140 FROM_HERE, base::Bind(&ChildrenDeleter::DeleteChildren, this));
141 } 141 }
142 142
143 // Returns the NetLog event type corresponding to a SparseOperation. 143 // Returns the NetLog event type corresponding to a SparseOperation.
144 net::NetLog::EventType GetSparseEventType( 144 net::NetLog::EventType GetSparseEventType(
145 disk_cache::SparseControl::SparseOperation operation) { 145 disk_cache::SparseControl::SparseOperation operation) {
146 switch (operation) { 146 switch (operation) {
147 case disk_cache::SparseControl::kReadOperation: 147 case disk_cache::SparseControl::kReadOperation:
148 return net::NetLog::TYPE_SPARSE_READ; 148 return net::NetLog::TYPE_SPARSE_READ;
149 case disk_cache::SparseControl::kWriteOperation: 149 case disk_cache::SparseControl::kWriteOperation:
150 return net::NetLog::TYPE_SPARSE_WRITE; 150 return net::NetLog::TYPE_SPARSE_WRITE;
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 344
345 char* buffer; 345 char* buffer;
346 Addr address; 346 Addr address;
347 entry->GetData(kSparseIndex, &buffer, &address); 347 entry->GetData(kSparseIndex, &buffer, &address);
348 if (!buffer && !address.is_initialized()) 348 if (!buffer && !address.is_initialized())
349 return; 349 return;
350 350
351 entry->net_log().AddEvent(net::NetLog::TYPE_SPARSE_DELETE_CHILDREN); 351 entry->net_log().AddEvent(net::NetLog::TYPE_SPARSE_DELETE_CHILDREN);
352 352
353 DCHECK(entry->backend_); 353 DCHECK(entry->backend_);
354 ChildrenDeleter* deleter = new ChildrenDeleter(entry->backend_, 354 ChildrenDeleter* deleter = new ChildrenDeleter(entry->backend_.get(),
355 entry->GetKey()); 355 entry->GetKey());
356 // The object will self destruct when finished. 356 // The object will self destruct when finished.
357 deleter->AddRef(); 357 deleter->AddRef();
358 358
359 if (buffer) { 359 if (buffer) {
360 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 360 base::MessageLoop::current()->PostTask(
361 &ChildrenDeleter::Start, deleter, buffer, data_len)); 361 FROM_HERE,
362 base::Bind(&ChildrenDeleter::Start, deleter, buffer, data_len));
362 } else { 363 } else {
363 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 364 base::MessageLoop::current()->PostTask(
364 &ChildrenDeleter::ReadData, deleter, address, data_len)); 365 FROM_HERE,
366 base::Bind(&ChildrenDeleter::ReadData, deleter, address, data_len));
365 } 367 }
366 } 368 }
367 369
368 // We are going to start using this entry to store sparse data, so we have to 370 // We are going to start using this entry to store sparse data, so we have to
369 // initialize our control info. 371 // initialize our control info.
370 int SparseControl::CreateSparseEntry() { 372 int SparseControl::CreateSparseEntry() {
371 if (CHILD_ENTRY & entry_->GetEntryFlags()) 373 if (CHILD_ENTRY & entry_->GetEntryFlags())
372 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 374 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
373 375
374 memset(&sparse_header_, 0, sizeof(sparse_header_)); 376 memset(&sparse_header_, 0, sizeof(sparse_header_));
375 sparse_header_.signature = Time::Now().ToInternalValue(); 377 sparse_header_.signature = Time::Now().ToInternalValue();
376 sparse_header_.magic = kIndexMagic; 378 sparse_header_.magic = kIndexMagic;
377 sparse_header_.parent_key_len = entry_->GetKey().size(); 379 sparse_header_.parent_key_len = entry_->GetKey().size();
378 children_map_.Resize(kNumSparseBits, true); 380 children_map_.Resize(kNumSparseBits, true);
379 381
380 // Save the header. The bitmap is saved in the destructor. 382 // Save the header. The bitmap is saved in the destructor.
381 scoped_refptr<net::IOBuffer> buf( 383 scoped_refptr<net::IOBuffer> buf(
382 new net::WrappedIOBuffer(reinterpret_cast<char*>(&sparse_header_))); 384 new net::WrappedIOBuffer(reinterpret_cast<char*>(&sparse_header_)));
383 385
384 int rv = entry_->WriteData( 386 int rv = entry_->WriteData(kSparseIndex, 0, buf.get(), sizeof(sparse_header_),
385 kSparseIndex, 0, buf, sizeof(sparse_header_), CompletionCallback(), 387 CompletionCallback(), false);
386 false);
387 if (rv != sizeof(sparse_header_)) { 388 if (rv != sizeof(sparse_header_)) {
388 DLOG(ERROR) << "Unable to save sparse_header_"; 389 DLOG(ERROR) << "Unable to save sparse_header_";
389 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 390 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
390 } 391 }
391 392
392 entry_->SetEntryFlags(PARENT_ENTRY); 393 entry_->SetEntryFlags(PARENT_ENTRY);
393 return net::OK; 394 return net::OK;
394 } 395 }
395 396
396 // We are opening an entry from disk. Make sure that our control data is there. 397 // We are opening an entry from disk. Make sure that our control data is there.
397 int SparseControl::OpenSparseEntry(int data_len) { 398 int SparseControl::OpenSparseEntry(int data_len) {
398 if (data_len < static_cast<int>(sizeof(SparseData))) 399 if (data_len < static_cast<int>(sizeof(SparseData)))
399 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 400 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
400 401
401 if (entry_->GetDataSize(kSparseData)) 402 if (entry_->GetDataSize(kSparseData))
402 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 403 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
403 404
404 if (!(PARENT_ENTRY & entry_->GetEntryFlags())) 405 if (!(PARENT_ENTRY & entry_->GetEntryFlags()))
405 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 406 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
406 407
407 // Dont't go over board with the bitmap. 8 KB gives us offsets up to 64 GB. 408 // Dont't go over board with the bitmap. 8 KB gives us offsets up to 64 GB.
408 int map_len = data_len - sizeof(sparse_header_); 409 int map_len = data_len - sizeof(sparse_header_);
409 if (map_len > kMaxMapSize || map_len % 4) 410 if (map_len > kMaxMapSize || map_len % 4)
410 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 411 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
411 412
412 scoped_refptr<net::IOBuffer> buf( 413 scoped_refptr<net::IOBuffer> buf(
413 new net::WrappedIOBuffer(reinterpret_cast<char*>(&sparse_header_))); 414 new net::WrappedIOBuffer(reinterpret_cast<char*>(&sparse_header_)));
414 415
415 // Read header. 416 // Read header.
416 int rv = entry_->ReadData( 417 int rv = entry_->ReadData(kSparseIndex, 0, buf.get(), sizeof(sparse_header_),
417 kSparseIndex, 0, buf, sizeof(sparse_header_), CompletionCallback()); 418 CompletionCallback());
418 if (rv != static_cast<int>(sizeof(sparse_header_))) 419 if (rv != static_cast<int>(sizeof(sparse_header_)))
419 return net::ERR_CACHE_READ_FAILURE; 420 return net::ERR_CACHE_READ_FAILURE;
420 421
421 // The real validation should be performed by the caller. This is just to 422 // The real validation should be performed by the caller. This is just to
422 // double check. 423 // double check.
423 if (sparse_header_.magic != kIndexMagic || 424 if (sparse_header_.magic != kIndexMagic ||
424 sparse_header_.parent_key_len != 425 sparse_header_.parent_key_len !=
425 static_cast<int>(entry_->GetKey().size())) 426 static_cast<int>(entry_->GetKey().size()))
426 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; 427 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
427 428
428 // Read the actual bitmap. 429 // Read the actual bitmap.
429 buf = new net::IOBuffer(map_len); 430 buf = new net::IOBuffer(map_len);
430 rv = entry_->ReadData(kSparseIndex, sizeof(sparse_header_), buf, map_len, 431 rv = entry_->ReadData(kSparseIndex, sizeof(sparse_header_), buf.get(),
431 CompletionCallback()); 432 map_len, CompletionCallback());
432 if (rv != map_len) 433 if (rv != map_len)
433 return net::ERR_CACHE_READ_FAILURE; 434 return net::ERR_CACHE_READ_FAILURE;
434 435
435 // Grow the bitmap to the current size and copy the bits. 436 // Grow the bitmap to the current size and copy the bits.
436 children_map_.Resize(map_len * 8, false); 437 children_map_.Resize(map_len * 8, false);
437 children_map_.SetMap(reinterpret_cast<uint32*>(buf->data()), map_len); 438 children_map_.SetMap(reinterpret_cast<uint32*>(buf->data()), map_len);
438 return net::OK; 439 return net::OK;
439 } 440 }
440 441
441 bool SparseControl::OpenChild() { 442 bool SparseControl::OpenChild() {
(...skipping 21 matching lines...) Expand all
463 EntryImpl* child = static_cast<EntryImpl*>(child_); 464 EntryImpl* child = static_cast<EntryImpl*>(child_);
464 if (!(CHILD_ENTRY & child->GetEntryFlags()) || 465 if (!(CHILD_ENTRY & child->GetEntryFlags()) ||
465 child->GetDataSize(kSparseIndex) < 466 child->GetDataSize(kSparseIndex) <
466 static_cast<int>(sizeof(child_data_))) 467 static_cast<int>(sizeof(child_data_)))
467 return KillChildAndContinue(key, false); 468 return KillChildAndContinue(key, false);
468 469
469 scoped_refptr<net::WrappedIOBuffer> buf( 470 scoped_refptr<net::WrappedIOBuffer> buf(
470 new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_))); 471 new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_)));
471 472
472 // Read signature. 473 // Read signature.
473 int rv = child_->ReadData(kSparseIndex, 0, buf, sizeof(child_data_), 474 int rv = child_->ReadData(kSparseIndex, 0, buf.get(), sizeof(child_data_),
474 CompletionCallback()); 475 CompletionCallback());
475 if (rv != sizeof(child_data_)) 476 if (rv != sizeof(child_data_))
476 return KillChildAndContinue(key, true); // This is a fatal failure. 477 return KillChildAndContinue(key, true); // This is a fatal failure.
477 478
478 if (child_data_.header.signature != sparse_header_.signature || 479 if (child_data_.header.signature != sparse_header_.signature ||
479 child_data_.header.magic != kIndexMagic) 480 child_data_.header.magic != kIndexMagic)
480 return KillChildAndContinue(key, false); 481 return KillChildAndContinue(key, false);
481 482
482 if (child_data_.header.last_block_len < 0 || 483 if (child_data_.header.last_block_len < 0 ||
483 child_data_.header.last_block_len > kBlockSize) { 484 child_data_.header.last_block_len > kBlockSize) {
484 // Make sure these values are always within range. 485 // Make sure these values are always within range.
485 child_data_.header.last_block_len = 0; 486 child_data_.header.last_block_len = 0;
486 child_data_.header.last_block = -1; 487 child_data_.header.last_block = -1;
487 } 488 }
488 489
489 return true; 490 return true;
490 } 491 }
491 492
492 void SparseControl::CloseChild() { 493 void SparseControl::CloseChild() {
493 scoped_refptr<net::WrappedIOBuffer> buf( 494 scoped_refptr<net::WrappedIOBuffer> buf(
494 new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_))); 495 new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_)));
495 496
496 // Save the allocation bitmap before closing the child entry. 497 // Save the allocation bitmap before closing the child entry.
497 int rv = child_->WriteData(kSparseIndex, 0, buf, sizeof(child_data_), 498 int rv = child_->WriteData(kSparseIndex, 0, buf.get(), sizeof(child_data_),
498 CompletionCallback(), 499 CompletionCallback(), false);
499 false);
500 if (rv != sizeof(child_data_)) 500 if (rv != sizeof(child_data_))
501 DLOG(ERROR) << "Failed to save child data"; 501 DLOG(ERROR) << "Failed to save child data";
502 child_->Release(); 502 child_->Release();
503 child_ = NULL; 503 child_ = NULL;
504 } 504 }
505 505
506 std::string SparseControl::GenerateChildKey() { 506 std::string SparseControl::GenerateChildKey() {
507 return GenerateChildName(entry_->GetKey(), sparse_header_.signature, 507 return GenerateChildName(entry_->GetKey(), sparse_header_.signature,
508 offset_ >> 20); 508 offset_ >> 20);
509 } 509 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 children_map_.Resize(Bitmap::RequiredArraySize(child_bit + 1) * 32, true); 558 children_map_.Resize(Bitmap::RequiredArraySize(child_bit + 1) * 32, true);
559 559
560 children_map_.Set(child_bit, value); 560 children_map_.Set(child_bit, value);
561 } 561 }
562 562
563 void SparseControl::WriteSparseData() { 563 void SparseControl::WriteSparseData() {
564 scoped_refptr<net::IOBuffer> buf(new net::WrappedIOBuffer( 564 scoped_refptr<net::IOBuffer> buf(new net::WrappedIOBuffer(
565 reinterpret_cast<const char*>(children_map_.GetMap()))); 565 reinterpret_cast<const char*>(children_map_.GetMap())));
566 566
567 int len = children_map_.ArraySize() * 4; 567 int len = children_map_.ArraySize() * 4;
568 int rv = entry_->WriteData(kSparseIndex, sizeof(sparse_header_), buf, len, 568 int rv = entry_->WriteData(kSparseIndex, sizeof(sparse_header_), buf.get(),
569 CompletionCallback(), false); 569 len, CompletionCallback(), false);
570 if (rv != len) { 570 if (rv != len) {
571 DLOG(ERROR) << "Unable to save sparse map"; 571 DLOG(ERROR) << "Unable to save sparse map";
572 } 572 }
573 } 573 }
574 574
575 bool SparseControl::VerifyRange() { 575 bool SparseControl::VerifyRange() {
576 DCHECK_GE(result_, 0); 576 DCHECK_GE(result_, 0);
577 577
578 child_offset_ = static_cast<int>(offset_) & (kMaxEntrySize - 1); 578 child_offset_ = static_cast<int>(offset_) & (kMaxEntrySize - 1);
579 child_len_ = std::min(buf_len_, kMaxEntrySize - child_offset_); 579 child_len_ = std::min(buf_len_, kMaxEntrySize - child_offset_);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 // We know the real type of child_. 662 // We know the real type of child_.
663 EntryImpl* child = static_cast<EntryImpl*>(child_); 663 EntryImpl* child = static_cast<EntryImpl*>(child_);
664 child->SetEntryFlags(CHILD_ENTRY); 664 child->SetEntryFlags(CHILD_ENTRY);
665 665
666 memset(&child_data_, 0, sizeof(child_data_)); 666 memset(&child_data_, 0, sizeof(child_data_));
667 child_data_.header = sparse_header_; 667 child_data_.header = sparse_header_;
668 668
669 scoped_refptr<net::WrappedIOBuffer> buf( 669 scoped_refptr<net::WrappedIOBuffer> buf(
670 new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_))); 670 new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_)));
671 671
672 int rv = child_->WriteData(kSparseIndex, 0, buf, sizeof(child_data_), 672 int rv = child_->WriteData(kSparseIndex, 0, buf.get(), sizeof(child_data_),
673 CompletionCallback(), false); 673 CompletionCallback(), false);
674 if (rv != sizeof(child_data_)) 674 if (rv != sizeof(child_data_))
675 DLOG(ERROR) << "Failed to save child data"; 675 DLOG(ERROR) << "Failed to save child data";
676 SetChildBit(true); 676 SetChildBit(true);
677 } 677 }
678 678
679 void SparseControl::DoChildrenIO() { 679 void SparseControl::DoChildrenIO() {
680 while (DoChildIO()) continue; 680 while (DoChildIO()) continue;
681 681
682 // Range operations are finished synchronously, often without setting 682 // Range operations are finished synchronously, often without setting
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 718
719 int rv = 0; 719 int rv = 0;
720 switch (operation_) { 720 switch (operation_) {
721 case kReadOperation: 721 case kReadOperation:
722 if (entry_->net_log().IsLoggingAllEvents()) { 722 if (entry_->net_log().IsLoggingAllEvents()) {
723 entry_->net_log().BeginEvent( 723 entry_->net_log().BeginEvent(
724 net::NetLog::TYPE_SPARSE_READ_CHILD_DATA, 724 net::NetLog::TYPE_SPARSE_READ_CHILD_DATA,
725 CreateNetLogSparseReadWriteCallback(child_->net_log().source(), 725 CreateNetLogSparseReadWriteCallback(child_->net_log().source(),
726 child_len_)); 726 child_len_));
727 } 727 }
728 rv = child_->ReadDataImpl(kSparseData, child_offset_, user_buf_, 728 rv = child_->ReadDataImpl(kSparseData, child_offset_, user_buf_.get(),
729 child_len_, callback); 729 child_len_, callback);
730 break; 730 break;
731 case kWriteOperation: 731 case kWriteOperation:
732 if (entry_->net_log().IsLoggingAllEvents()) { 732 if (entry_->net_log().IsLoggingAllEvents()) {
733 entry_->net_log().BeginEvent( 733 entry_->net_log().BeginEvent(
734 net::NetLog::TYPE_SPARSE_WRITE_CHILD_DATA, 734 net::NetLog::TYPE_SPARSE_WRITE_CHILD_DATA,
735 CreateNetLogSparseReadWriteCallback(child_->net_log().source(), 735 CreateNetLogSparseReadWriteCallback(child_->net_log().source(),
736 child_len_)); 736 child_len_));
737 } 737 }
738 rv = child_->WriteDataImpl(kSparseData, child_offset_, user_buf_, 738 rv = child_->WriteDataImpl(kSparseData, child_offset_, user_buf_.get(),
739 child_len_, callback, false); 739 child_len_, callback, false);
740 break; 740 break;
741 case kGetRangeOperation: 741 case kGetRangeOperation:
742 rv = DoGetAvailableRange(); 742 rv = DoGetAvailableRange();
743 break; 743 break;
744 default: 744 default:
745 NOTREACHED(); 745 NOTREACHED();
746 } 746 }
747 747
748 if (rv == net::ERR_IO_PENDING) { 748 if (rv == net::ERR_IO_PENDING) {
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 CompletionCallback cb = abort_callbacks_[i]; 875 CompletionCallback cb = abort_callbacks_[i];
876 if (i == abort_callbacks_.size() - 1) 876 if (i == abort_callbacks_.size() - 1)
877 abort_callbacks_.clear(); 877 abort_callbacks_.clear();
878 878
879 entry_->Release(); // Don't touch object after this line. 879 entry_->Release(); // Don't touch object after this line.
880 cb.Run(net::OK); 880 cb.Run(net::OK);
881 } 881 }
882 } 882 }
883 883
884 } // namespace disk_cache 884 } // namespace disk_cache
OLDNEW
« no previous file with comments | « net/disk_cache/rankings.cc ('k') | net/disk_cache/stats.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698