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

Side by Side Diff: net/disk_cache/simple/simple_entry_impl.cc

Issue 23486006: Track entries pending Doom in SimpleCache backend. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remediation and test update Created 7 years, 3 months 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
OLDNEW
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_entry_impl.h" 5 #include "net/disk_cache/simple/simple_entry_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 SimpleBackendImpl* backend, 157 SimpleBackendImpl* backend,
158 net::NetLog* net_log) 158 net::NetLog* net_log)
159 : backend_(backend->AsWeakPtr()), 159 : backend_(backend->AsWeakPtr()),
160 worker_pool_(backend->worker_pool()), 160 worker_pool_(backend->worker_pool()),
161 path_(path), 161 path_(path),
162 entry_hash_(entry_hash), 162 entry_hash_(entry_hash),
163 use_optimistic_operations_(operations_mode == OPTIMISTIC_OPERATIONS), 163 use_optimistic_operations_(operations_mode == OPTIMISTIC_OPERATIONS),
164 last_used_(Time::Now()), 164 last_used_(Time::Now()),
165 last_modified_(last_used_), 165 last_modified_(last_used_),
166 open_count_(0), 166 open_count_(0),
167 doomed_(false),
167 state_(STATE_UNINITIALIZED), 168 state_(STATE_UNINITIALIZED),
168 synchronous_entry_(NULL), 169 synchronous_entry_(NULL),
169 net_log_(net::BoundNetLog::Make( 170 net_log_(net::BoundNetLog::Make(
170 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY)) { 171 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY)) {
171 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_end_offset_), 172 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_end_offset_),
172 arrays_should_be_same_size); 173 arrays_should_be_same_size);
173 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_), 174 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_),
174 arrays_should_be_same_size); 175 arrays_should_be_same_size);
175 COMPILE_ASSERT(arraysize(data_size_) == arraysize(have_written_), 176 COMPILE_ASSERT(arraysize(data_size_) == arraysize(have_written_),
176 arrays_should_be_same_size); 177 arrays_should_be_same_size);
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 DCHECK(out_entry); 521 DCHECK(out_entry);
521 ++open_count_; 522 ++open_count_;
522 AddRef(); // Balanced in Close() 523 AddRef(); // Balanced in Close()
523 *out_entry = this; 524 *out_entry = this;
524 } 525 }
525 526
526 void SimpleEntryImpl::RemoveSelfFromBackend() { 527 void SimpleEntryImpl::RemoveSelfFromBackend() {
527 if (!backend_.get()) 528 if (!backend_.get())
528 return; 529 return;
529 backend_->OnDeactivated(this); 530 backend_->OnDeactivated(this);
530 backend_.reset();
531 } 531 }
532 532
533 void SimpleEntryImpl::MarkAsDoomed() { 533 void SimpleEntryImpl::MarkAsDoomed() {
534 if (!backend_.get()) 534 if (!backend_.get())
535 return; 535 return;
536 doomed_ = true;
536 backend_->index()->Remove(entry_hash_); 537 backend_->index()->Remove(entry_hash_);
537 RemoveSelfFromBackend(); 538 RemoveSelfFromBackend();
538 } 539 }
539 540
540 void SimpleEntryImpl::RunNextOperationIfNeeded() { 541 void SimpleEntryImpl::RunNextOperationIfNeeded() {
541 DCHECK(io_thread_checker_.CalledOnValidThread()); 542 DCHECK(io_thread_checker_.CalledOnValidThread());
542 UMA_HISTOGRAM_CUSTOM_COUNTS("SimpleCache.EntryOperationsPending", 543 UMA_HISTOGRAM_CUSTOM_COUNTS("SimpleCache.EntryOperationsPending",
543 pending_operations_.size(), 0, 100, 20); 544 pending_operations_.size(), 0, 100, 20);
544 if (!pending_operations_.empty() && state_ != STATE_IO_PENDING) { 545 if (!pending_operations_.empty() && state_ != STATE_IO_PENDING) {
545 scoped_ptr<SimpleEntryOperation> operation( 546 scoped_ptr<SimpleEntryOperation> operation(
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 // STATE_IO_PENDING. 773 // STATE_IO_PENDING.
773 if (!callback.is_null()) 774 if (!callback.is_null())
774 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( 775 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind(
775 callback, 0)); 776 callback, 0));
776 return; 777 return;
777 } 778 }
778 779
779 buf_len = std::min(buf_len, GetDataSize(stream_index) - offset); 780 buf_len = std::min(buf_len, GetDataSize(stream_index) - offset);
780 781
781 state_ = STATE_IO_PENDING; 782 state_ = STATE_IO_PENDING;
782 if (backend_.get()) 783 if (!doomed_ && backend_.get())
783 backend_->index()->UseIfExists(entry_hash_); 784 backend_->index()->UseIfExists(entry_hash_);
784 785
785 scoped_ptr<uint32> read_crc32(new uint32()); 786 scoped_ptr<uint32> read_crc32(new uint32());
786 scoped_ptr<int> result(new int()); 787 scoped_ptr<int> result(new int());
787 scoped_ptr<base::Time> last_used(new base::Time()); 788 scoped_ptr<base::Time> last_used(new base::Time());
788 Closure task = base::Bind( 789 Closure task = base::Bind(
789 &SimpleSynchronousEntry::ReadData, 790 &SimpleSynchronousEntry::ReadData,
790 base::Unretained(synchronous_entry_), 791 base::Unretained(synchronous_entry_),
791 SimpleSynchronousEntry::EntryOperationData(stream_index, offset, buf_len), 792 SimpleSynchronousEntry::EntryOperationData(stream_index, offset, buf_len),
792 make_scoped_refptr(buf), 793 make_scoped_refptr(buf),
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 // callback directly. 833 // callback directly.
833 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( 834 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind(
834 callback, net::ERR_FAILED)); 835 callback, net::ERR_FAILED));
835 } 836 }
836 // |this| may be destroyed after return here. 837 // |this| may be destroyed after return here.
837 return; 838 return;
838 } 839 }
839 840
840 DCHECK_EQ(STATE_READY, state_); 841 DCHECK_EQ(STATE_READY, state_);
841 state_ = STATE_IO_PENDING; 842 state_ = STATE_IO_PENDING;
842 if (backend_.get()) 843 if (!doomed_ && backend_.get())
843 backend_->index()->UseIfExists(entry_hash_); 844 backend_->index()->UseIfExists(entry_hash_);
844 // It is easy to incrementally compute the CRC from [0 .. |offset + buf_len|) 845 // It is easy to incrementally compute the CRC from [0 .. |offset + buf_len|)
845 // if |offset == 0| or we have already computed the CRC for [0 .. offset). 846 // if |offset == 0| or we have already computed the CRC for [0 .. offset).
846 // We rely on most write operations being sequential, start to end to compute 847 // We rely on most write operations being sequential, start to end to compute
847 // the crc of the data. When we write to an entry and close without having 848 // the crc of the data. When we write to an entry and close without having
848 // done a sequential write, we don't check the CRC on read. 849 // done a sequential write, we don't check the CRC on read.
849 if (offset == 0 || crc32s_end_offset_[stream_index] == offset) { 850 if (offset == 0 || crc32s_end_offset_[stream_index] == offset) {
850 uint32 initial_crc = (offset != 0) ? crc32s_[stream_index] 851 uint32 initial_crc = (offset != 0) ? crc32s_[stream_index]
851 : crc32(0, Z_NULL, 0); 852 : crc32(0, Z_NULL, 0);
852 if (buf_len > 0) { 853 if (buf_len > 0) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 Closure reply = base::Bind(&SimpleEntryImpl::WriteOperationComplete, 885 Closure reply = base::Bind(&SimpleEntryImpl::WriteOperationComplete,
885 this, 886 this,
886 stream_index, 887 stream_index,
887 callback, 888 callback,
888 base::Passed(&entry_stat), 889 base::Passed(&entry_stat),
889 base::Passed(&result)); 890 base::Passed(&result));
890 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); 891 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply);
891 } 892 }
892 893
893 void SimpleEntryImpl::DoomEntryInternal(const CompletionCallback& callback) { 894 void SimpleEntryImpl::DoomEntryInternal(const CompletionCallback& callback) {
895 if (backend_)
896 backend_->OnDoomStart(entry_hash_);
894 PostTaskAndReplyWithResult( 897 PostTaskAndReplyWithResult(
895 worker_pool_, FROM_HERE, 898 worker_pool_, FROM_HERE,
896 base::Bind(&SimpleSynchronousEntry::DoomEntry, path_, key_, entry_hash_), 899 base::Bind(&SimpleSynchronousEntry::DoomEntry, path_, key_, entry_hash_),
897 base::Bind(&SimpleEntryImpl::DoomOperationComplete, this, callback, 900 base::Bind(&SimpleEntryImpl::DoomOperationComplete, this, callback,
898 state_)); 901 state_));
899 state_ = STATE_IO_PENDING; 902 state_ = STATE_IO_PENDING;
900 } 903 }
901 904
902 void SimpleEntryImpl::CreationOperationComplete( 905 void SimpleEntryImpl::CreationOperationComplete(
903 const CompletionCallback& completion_callback, 906 const CompletionCallback& completion_callback,
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 RecordWriteResult(WRITE_RESULT_SYNC_WRITE_FAILURE); 1065 RecordWriteResult(WRITE_RESULT_SYNC_WRITE_FAILURE);
1063 if (net_log_.IsLoggingAllEvents()) { 1066 if (net_log_.IsLoggingAllEvents()) {
1064 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_WRITE_END, 1067 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_WRITE_END,
1065 CreateNetLogReadWriteCompleteCallback(*result)); 1068 CreateNetLogReadWriteCompleteCallback(*result));
1066 } 1069 }
1067 1070
1068 EntryOperationComplete( 1071 EntryOperationComplete(
1069 stream_index, completion_callback, *entry_stat, result.Pass()); 1072 stream_index, completion_callback, *entry_stat, result.Pass());
1070 } 1073 }
1071 1074
1072 void SimpleEntryImpl::DoomOperationComplete(const CompletionCallback& callback, 1075 void SimpleEntryImpl::DoomOperationComplete(
1073 State state_to_restore, 1076 const CompletionCallback& callback,
1074 int result) { 1077 State state_to_restore,
1078 int result) {
1075 state_ = state_to_restore; 1079 state_ = state_to_restore;
1076 if (!callback.is_null()) 1080 if (!callback.is_null())
1077 callback.Run(result); 1081 callback.Run(result);
1078 RunNextOperationIfNeeded(); 1082 RunNextOperationIfNeeded();
1083 if (backend_)
1084 backend_->OnDoomComplete(entry_hash_);
1079 } 1085 }
1080 1086
1081 void SimpleEntryImpl::ChecksumOperationComplete( 1087 void SimpleEntryImpl::ChecksumOperationComplete(
1082 int orig_result, 1088 int orig_result,
1083 int stream_index, 1089 int stream_index,
1084 const CompletionCallback& completion_callback, 1090 const CompletionCallback& completion_callback,
1085 scoped_ptr<int> result) { 1091 scoped_ptr<int> result) {
1086 DCHECK(io_thread_checker_.CalledOnValidThread()); 1092 DCHECK(io_thread_checker_.CalledOnValidThread());
1087 DCHECK(synchronous_entry_); 1093 DCHECK(synchronous_entry_);
1088 DCHECK_EQ(STATE_IO_PENDING, state_); 1094 DCHECK_EQ(STATE_IO_PENDING, state_);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 const SimpleEntryStat& entry_stat) { 1136 const SimpleEntryStat& entry_stat) {
1131 DCHECK(io_thread_checker_.CalledOnValidThread()); 1137 DCHECK(io_thread_checker_.CalledOnValidThread());
1132 DCHECK(synchronous_entry_); 1138 DCHECK(synchronous_entry_);
1133 DCHECK_EQ(STATE_READY, state_); 1139 DCHECK_EQ(STATE_READY, state_);
1134 1140
1135 last_used_ = entry_stat.last_used; 1141 last_used_ = entry_stat.last_used;
1136 last_modified_ = entry_stat.last_modified; 1142 last_modified_ = entry_stat.last_modified;
1137 for (int i = 0; i < kSimpleEntryFileCount; ++i) { 1143 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
1138 data_size_[i] = entry_stat.data_size[i]; 1144 data_size_[i] = entry_stat.data_size[i];
1139 } 1145 }
1140 if (backend_.get()) 1146 if (!doomed_ && backend_.get())
1141 backend_->index()->UpdateEntrySize(entry_hash_, GetDiskUsage()); 1147 backend_->index()->UpdateEntrySize(entry_hash_, GetDiskUsage());
1142 } 1148 }
1143 1149
1144 int64 SimpleEntryImpl::GetDiskUsage() const { 1150 int64 SimpleEntryImpl::GetDiskUsage() const {
1145 int64 file_size = 0; 1151 int64 file_size = 0;
1146 for (int i = 0; i < kSimpleEntryFileCount; ++i) { 1152 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
1147 file_size += 1153 file_size +=
1148 simple_util::GetFileSizeFromKeyAndDataSize(key_, data_size_[i]); 1154 simple_util::GetFileSizeFromKeyAndDataSize(key_, data_size_[i]);
1149 } 1155 }
1150 return file_size; 1156 return file_size;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 } else { 1219 } else {
1214 type = conflicting ? WRITE_FOLLOWS_CONFLICTING_WRITE 1220 type = conflicting ? WRITE_FOLLOWS_CONFLICTING_WRITE
1215 : WRITE_FOLLOWS_NON_CONFLICTING_WRITE; 1221 : WRITE_FOLLOWS_NON_CONFLICTING_WRITE;
1216 } 1222 }
1217 } 1223 }
1218 UMA_HISTOGRAM_ENUMERATION( 1224 UMA_HISTOGRAM_ENUMERATION(
1219 "SimpleCache.WriteDependencyType", type, WRITE_DEPENDENCY_TYPE_MAX); 1225 "SimpleCache.WriteDependencyType", type, WRITE_DEPENDENCY_TYPE_MAX);
1220 } 1226 }
1221 1227
1222 } // namespace disk_cache 1228 } // namespace disk_cache
OLDNEW
« net/disk_cache/simple/simple_backend_impl.cc ('K') | « net/disk_cache/simple/simple_entry_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698