Skip to content

Commit f87cf88

Browse files
Miriam GershensonCommit Bot
authored andcommitted
Don't return errors from stale host cache entries
If the cached entry is an error, it's not useful, so it's better to wait for a result that might be a success than return the error quickly. BUG=770773 Cq-Include-Trybots: master.tryserver.chromium.android:android_cronet_tester;master.tryserver.chromium.mac:ios-simulator-cronet Change-Id: I4040f95c4c1d58f657de6fd3b8157e4ae1cdab02 Reviewed-on: https://chromium-review.googlesource.com/697924 Reviewed-by: Julia Tuttle <[email protected]> Commit-Queue: Miriam Gershenson <[email protected]> Cr-Commit-Position: refs/heads/master@{#507440}
1 parent d104d87 commit f87cf88

File tree

2 files changed

+58
-31
lines changed

2 files changed

+58
-31
lines changed

components/cronet/stale_host_resolver.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ int StaleHostResolver::RequestImpl::Start(
237237
handle_ = new Handle(this);
238238
*out_req = std::unique_ptr<net::HostResolver::Request>(handle_);
239239

240-
if (cache_rv != net::ERR_DNS_CACHE_MISS && usable_callback.Run(stale_info)) {
240+
if (cache_rv == net::OK && usable_callback.Run(stale_info)) {
241241
stale_error_ = cache_rv;
242242
stale_addresses_ = cache_addresses;
243243
// |stale_timer_| is deleted when the Request is deleted, so it's safe to

components/cronet/stale_host_resolver_unittest.cc

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,16 @@ class StaleHostResolverTest : public testing::Test {
151151
}
152152

153153
// Creates a cache entry for |kHostname| that is |age_sec| seconds old.
154-
void CreateCacheEntry(int age_sec) {
154+
void CreateCacheEntry(int age_sec, int error) {
155155
DCHECK(resolver_);
156156
DCHECK(resolver_->GetHostCache());
157157

158158
base::TimeDelta ttl(base::TimeDelta::FromSeconds(kCacheEntryTTLSec));
159159
net::HostCache::Key key(kHostname, net::ADDRESS_FAMILY_IPV4, 0);
160-
net::HostCache::Entry entry(net::OK, MakeAddressList(kCacheAddress), ttl);
160+
net::HostCache::Entry entry(
161+
error,
162+
error == net::OK ? MakeAddressList(kCacheAddress) : net::AddressList(),
163+
ttl);
161164
base::TimeDelta age = base::TimeDelta::FromSeconds(age_sec);
162165
base::TimeTicks then = base::TimeTicks::Now() - age;
163166
resolver_->GetHostCache()->Set(key, entry, then, ttl);
@@ -299,7 +302,7 @@ TEST_F(StaleHostResolverTest, Network) {
299302

300303
TEST_F(StaleHostResolverTest, FreshCache) {
301304
CreateResolver();
302-
CreateCacheEntry(kAgeFreshSec);
305+
CreateCacheEntry(kAgeFreshSec, net::OK);
303306

304307
Resolve();
305308

@@ -314,7 +317,7 @@ TEST_F(StaleHostResolverTest, FreshCache) {
314317
TEST_F(StaleHostResolverTest, StaleCache) {
315318
SetStaleDelay(kNoStaleDelaySec);
316319
CreateResolver();
317-
CreateCacheEntry(kAgeExpiredSec);
320+
CreateCacheEntry(kAgeExpiredSec, net::OK);
318321

319322
Resolve();
320323
WaitForResolve();
@@ -328,7 +331,7 @@ TEST_F(StaleHostResolverTest, StaleCache) {
328331
TEST_F(StaleHostResolverTest, NetworkWithStaleCache) {
329332
SetStaleDelay(kLongStaleDelaySec);
330333
CreateResolver();
331-
CreateCacheEntry(kAgeExpiredSec);
334+
CreateCacheEntry(kAgeExpiredSec, net::OK);
332335

333336
Resolve();
334337
WaitForResolve();
@@ -356,7 +359,7 @@ TEST_F(StaleHostResolverTest, CancelWithNoCache) {
356359
TEST_F(StaleHostResolverTest, CancelWithStaleCache) {
357360
SetStaleDelay(kLongStaleDelaySec);
358361
CreateResolver();
359-
CreateCacheEntry(kAgeExpiredSec);
362+
CreateCacheEntry(kAgeExpiredSec, net::OK);
360363

361364
Resolve();
362365

@@ -380,39 +383,50 @@ TEST_F(StaleHostResolverTest, StaleUsability) {
380383
int age_sec;
381384
int stale_use;
382385
int network_changes;
386+
int error;
383387

384388
bool usable;
385389
} kUsabilityTestCases[] = {
386390
// Fresh data always accepted.
387-
{0, 0, true, -1, 1, 0, true},
388-
{1, 1, false, -1, 1, 0, true},
391+
{0, 0, true, -1, 1, 0, net::OK, true},
392+
{1, 1, false, -1, 1, 0, net::OK, true},
389393

390394
// Unlimited expired time accepts non-zero time.
391-
{0, 0, true, 1, 1, 0, true},
395+
{0, 0, true, 1, 1, 0, net::OK, true},
392396

393397
// Limited expired time accepts before but not after limit.
394-
{2, 0, true, 1, 1, 0, true},
395-
{2, 0, true, 3, 1, 0, false},
398+
{2, 0, true, 1, 1, 0, net::OK, true},
399+
{2, 0, true, 3, 1, 0, net::OK, false},
396400

397401
// Unlimited stale uses accepts first and later uses.
398-
{2, 0, true, 1, 1, 0, true},
399-
{2, 0, true, 1, 9, 0, true},
402+
{2, 0, true, 1, 1, 0, net::OK, true},
403+
{2, 0, true, 1, 9, 0, net::OK, true},
400404

401405
// Limited stale uses accepts up to and including limit.
402-
{2, 2, true, 1, 1, 0, true},
403-
{2, 2, true, 1, 2, 0, true},
404-
{2, 2, true, 1, 3, 0, false},
405-
{2, 2, true, 1, 9, 0, false},
406+
{2, 2, true, 1, 1, 0, net::OK, true},
407+
{2, 2, true, 1, 2, 0, net::OK, true},
408+
{2, 2, true, 1, 3, 0, net::OK, false},
409+
{2, 2, true, 1, 9, 0, net::OK, false},
406410

407411
// Allowing other networks accepts zero or more network changes.
408-
{2, 0, true, 1, 1, 0, true},
409-
{2, 0, true, 1, 1, 1, true},
410-
{2, 0, true, 1, 1, 9, true},
412+
{2, 0, true, 1, 1, 0, net::OK, true},
413+
{2, 0, true, 1, 1, 1, net::OK, true},
414+
{2, 0, true, 1, 1, 9, net::OK, true},
411415

412416
// Disallowing other networks only accepts zero network changes.
413-
{2, 0, false, 1, 1, 0, true},
414-
{2, 0, false, 1, 1, 1, false},
415-
{2, 0, false, 1, 1, 9, false},
417+
{2, 0, false, 1, 1, 0, net::OK, true},
418+
{2, 0, false, 1, 1, 1, net::OK, false},
419+
{2, 0, false, 1, 1, 9, net::OK, false},
420+
421+
// Errors are only accepted if fresh.
422+
{0, 0, true, -1, 1, 0, net::ERR_NAME_NOT_RESOLVED, true},
423+
{1, 1, false, -1, 1, 0, net::ERR_NAME_NOT_RESOLVED, true},
424+
{0, 0, true, 1, 1, 0, net::ERR_NAME_NOT_RESOLVED, false},
425+
{2, 0, true, 1, 1, 0, net::ERR_NAME_NOT_RESOLVED, false},
426+
{2, 0, true, 1, 1, 0, net::ERR_NAME_NOT_RESOLVED, false},
427+
{2, 2, true, 1, 2, 0, net::ERR_NAME_NOT_RESOLVED, false},
428+
{2, 0, true, 1, 1, 1, net::ERR_NAME_NOT_RESOLVED, false},
429+
{2, 0, false, 1, 1, 0, net::ERR_NAME_NOT_RESOLVED, false},
416430
};
417431

418432
SetStaleDelay(kNoStaleDelaySec);
@@ -424,7 +438,7 @@ TEST_F(StaleHostResolverTest, StaleUsability) {
424438
SetStaleUsability(test_case.max_expired_time_sec, test_case.max_stale_uses,
425439
test_case.allow_other_network);
426440
CreateResolver();
427-
CreateCacheEntry(kCacheEntryTTLSec + test_case.age_sec);
441+
CreateCacheEntry(kCacheEntryTTLSec + test_case.age_sec, test_case.error);
428442
for (int j = 0; j < test_case.network_changes; ++j)
429443
OnNetworkChange();
430444
for (int j = 0; j < test_case.stale_use - 1; ++j)
@@ -433,11 +447,24 @@ TEST_F(StaleHostResolverTest, StaleUsability) {
433447
Resolve();
434448
WaitForResolve();
435449
EXPECT_TRUE(resolve_complete()) << i;
436-
EXPECT_EQ(net::OK, resolve_error()) << i;
437-
EXPECT_EQ(1u, resolve_addresses().size()) << i;
438-
{
439-
const char* expected = test_case.usable ? kCacheAddress : kNetworkAddress;
440-
EXPECT_EQ(expected, resolve_addresses()[0].ToStringWithoutPort()) << i;
450+
451+
if (test_case.error == net::OK) {
452+
EXPECT_EQ(test_case.error, resolve_error()) << i;
453+
EXPECT_EQ(1u, resolve_addresses().size()) << i;
454+
{
455+
const char* expected =
456+
test_case.usable ? kCacheAddress : kNetworkAddress;
457+
EXPECT_EQ(expected, resolve_addresses()[0].ToStringWithoutPort()) << i;
458+
}
459+
} else {
460+
if (test_case.usable) {
461+
EXPECT_EQ(test_case.error, resolve_error()) << i;
462+
} else {
463+
EXPECT_EQ(net::OK, resolve_error()) << i;
464+
EXPECT_EQ(1u, resolve_addresses().size()) << i;
465+
EXPECT_EQ(kNetworkAddress, resolve_addresses()[0].ToStringWithoutPort())
466+
<< i;
467+
}
441468
}
442469

443470
DestroyResolver();
@@ -492,7 +519,7 @@ TEST_F(StaleHostResolverTest, CreatedByContext) {
492519

493520
// Note: Experimental config above sets 0ms stale delay.
494521
SetResolver(context->host_resolver());
495-
CreateCacheEntry(kAgeExpiredSec);
522+
CreateCacheEntry(kAgeExpiredSec, net::OK);
496523

497524
Resolve();
498525
EXPECT_FALSE(resolve_complete());

0 commit comments

Comments
 (0)