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

Side by Side Diff: net/http/http_cache.cc

Issue 2774603003: Doom and create new entry when validation is not a match (Closed)
Patch Set: Rebased with parent branch Created 3 years, 6 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
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/http/http_cache.h" 5 #include "net/http/http_cache.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 void HttpCache::DoneReadingFromEntry(ActiveEntry* entry, 939 void HttpCache::DoneReadingFromEntry(ActiveEntry* entry,
940 Transaction* transaction) { 940 Transaction* transaction) {
941 DCHECK(!entry->writer); 941 DCHECK(!entry->writer);
942 auto it = entry->readers.find(transaction); 942 auto it = entry->readers.find(transaction);
943 DCHECK(it != entry->readers.end()); 943 DCHECK(it != entry->readers.end());
944 entry->readers.erase(it); 944 entry->readers.erase(it);
945 945
946 ProcessQueuedTransactions(entry); 946 ProcessQueuedTransactions(entry);
947 } 947 }
948 948
949 void HttpCache::DoomEntryValidationNoMatch(ActiveEntry* entry,
950 Transaction* transaction) {
951 // Validating transaction received a non-matching response.
952
953 // TODO(shivanisha) Can transaction be a writer in case of partial requests?
jkarlin 2017/06/09 17:04:49 s/a writer/the writer/
shivanisha 2017/06/12 18:01:22 done
954 // Handlie the writer case if that's possible.
jkarlin 2017/06/09 17:04:49 Seems like we need to answer that question before
jkarlin 2017/06/09 17:04:49 s/Handlie/Handle/
shivanisha 2017/06/12 18:01:22 Handled this TODO in CanTransactionWriteResponseHe
955 CHECK(transaction == entry->headers_transaction);
jkarlin 2017/06/09 17:04:49 Let's DCHECK this and save CHECK for cases where w
shivanisha 2017/06/12 18:01:22 done
956
957 entry->headers_transaction = nullptr;
958 if (entry->HasNoTransactions() && !entry->will_process_queued_transactions) {
959 entry->disk_entry->Doom();
960 DestroyEntry(entry);
961 return;
962 }
963
964 // Restart only add_to_entry_queue transactions.
965
966 DoomActiveEntry(entry->disk_entry->GetKey());
967 // Post task here to avoid a race in creating the entry between |transaction|
968 // and the add_to_entry_queue transactions. Reset the queued transactions'
969 // cache pending state so that in case their destructor is invoked, it's ok
970 // for them to not be found in this entry.
971 for (auto* transaction : entry->add_to_entry_queue) {
972 transaction->ResetCachePendingState();
jkarlin 2017/06/09 17:04:49 Why is this necessary? Won't they all have this re
shivanisha 2017/06/12 18:01:23 I am thinking of the race where we remove them fro
973 base::ThreadTaskRunnerHandle::Get()->PostTask(
974 FROM_HERE, base::Bind(transaction->io_callback(), net::ERR_CACHE_RACE));
975 }
976 entry->add_to_entry_queue.clear();
977 }
978
949 void HttpCache::RemoveAllQueuedTransactions(ActiveEntry* entry, 979 void HttpCache::RemoveAllQueuedTransactions(ActiveEntry* entry,
950 TransactionList* list) { 980 TransactionList* list) {
951 // Process done_headers_queue before add_to_entry_queue to maintain FIFO 981 // Process done_headers_queue before add_to_entry_queue to maintain FIFO
952 // order. 982 // order.
953 983
954 for (auto* transaction : entry->done_headers_queue) 984 for (auto* transaction : entry->done_headers_queue)
955 list->push_back(transaction); 985 list->push_back(transaction);
956 entry->done_headers_queue.clear(); 986 entry->done_headers_queue.clear();
957 987
958 for (auto* pending_transaction : entry->add_to_entry_queue) 988 for (auto* pending_transaction : entry->add_to_entry_queue)
959 list->push_back(pending_transaction); 989 list->push_back(pending_transaction);
960 entry->add_to_entry_queue.clear(); 990 entry->add_to_entry_queue.clear();
961 } 991 }
962 992
963 void HttpCache::ProcessEntryFailure(ActiveEntry* entry, 993 void HttpCache::ProcessEntryFailure(ActiveEntry* entry,
964 Transaction* transaction) { 994 Transaction* transaction) {
965 // Failure case is either writer failing to completely write the response to 995 // Writer failed to completely write the response to
966 // the cache or validating transaction received a non-304 response. 996 // the cache.
967 997
968 if (entry->headers_transaction && transaction != entry->headers_transaction) 998 if (entry->headers_transaction && transaction != entry->headers_transaction)
969 RestartHeadersTransaction(entry, transaction); 999 RestartHeadersTransaction(entry, transaction);
970 1000
971 TransactionList list; 1001 TransactionList list;
972 RemoveAllQueuedTransactions(entry, &list); 1002 RemoveAllQueuedTransactions(entry, &list);
973 1003
974 if (entry->HasNoTransactions() && !entry->will_process_queued_transactions) { 1004 if (entry->HasNoTransactions() && !entry->will_process_queued_transactions) {
975 entry->disk_entry->Doom(); 1005 entry->disk_entry->Doom();
976 DestroyEntry(entry); 1006 DestroyEntry(entry);
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1351 building_backend_ = false; 1381 building_backend_ = false;
1352 DeletePendingOp(pending_op); 1382 DeletePendingOp(pending_op);
1353 } 1383 }
1354 1384
1355 // The cache may be gone when we return from the callback. 1385 // The cache may be gone when we return from the callback.
1356 if (!item->DoCallback(result, disk_cache_.get())) 1386 if (!item->DoCallback(result, disk_cache_.get()))
1357 item->NotifyTransaction(result, NULL); 1387 item->NotifyTransaction(result, NULL);
1358 } 1388 }
1359 1389
1360 } // namespace net 1390 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698