diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-07-06 06:59:59 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-07-06 06:59:59 +0000 |
commit | 95c8d1a7819168ebad0079599de39fb5edb4d252 (patch) | |
tree | 4f77f59d8e1bf578cd1f08d7bb919770a5d6de1f /vespalib/src | |
parent | 9b35cbe66cfeadcd42d233f171a19c1e7edb593d (diff) |
add more testing and verification
Diffstat (limited to 'vespalib/src')
-rw-r--r-- | vespalib/src/tests/net/async_resolver/async_resolver_test.cpp | 22 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/net/async_resolver.cpp | 2 |
2 files changed, 24 insertions, 0 deletions
diff --git a/vespalib/src/tests/net/async_resolver/async_resolver_test.cpp b/vespalib/src/tests/net/async_resolver/async_resolver_test.cpp index bcff1f15a36..4938d2ab68e 100644 --- a/vespalib/src/tests/net/async_resolver/async_resolver_test.cpp +++ b/vespalib/src/tests/net/async_resolver/async_resolver_test.cpp @@ -237,6 +237,9 @@ TEST_F("require that multiple cache entries can be evicted at the same time", Re EXPECT_EQUAL(f1.get_total_cnt(), 6u); EXPECT_EQUAL(f1.resolve("tcp/d:123"), "tcp/127.0.4.1:123"); EXPECT_EQUAL(f1.get_total_cnt(), 6u); + f1.set_now(0.0); // a has already been evicted from cache + EXPECT_EQUAL(f1.resolve("tcp/a:123"), "tcp/127.0.1.1:123"); + EXPECT_EQUAL(f1.get_total_cnt(), 7u); } TEST_F("require that slow host lookups trigger warning (manual log inspection)", TimeBomb(60)) { @@ -285,4 +288,23 @@ TEST_F("require that discarding result handlers will avoid pending work (but com EXPECT_EQUAL(result3.spec(), "invalid"); } +TEST_F("require that cache races can be provoked", TimeBomb(60)) { + auto host_resolver = std::make_shared<BlockingHostResolver>(2); + AsyncResolver::Params params; + params.resolver = host_resolver; + params.num_threads = 2; + auto resolver = AsyncResolver::create(params); + SocketAddress result1; + SocketAddress result2; + auto handler1 = std::make_shared<ResultSetter>(result1); + auto handler2 = std::make_shared<ResultSetter>(result2); + resolver->resolve_async("tcp/same_host:123", handler1); + resolver->resolve_async("tcp/same_host:123", handler2); + host_resolver->wait_for_callers(); + host_resolver->release_callers(); + resolver->wait_for_pending_resolves(); + EXPECT_EQUAL(result1.spec(), "tcp/127.0.0.7:123"); + EXPECT_EQUAL(result2.spec(), "tcp/127.0.0.7:123"); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/vespalib/src/vespa/vespalib/net/async_resolver.cpp b/vespalib/src/vespa/vespalib/net/async_resolver.cpp index c50fd722c45..f6e31715d06 100644 --- a/vespalib/src/vespa/vespalib/net/async_resolver.cpp +++ b/vespalib/src/vespa/vespalib/net/async_resolver.cpp @@ -66,6 +66,7 @@ AsyncResolver::CachingHostResolver::lookup(const vespalib::string &host_name, ve _map.erase(_queue.front()); _queue.pop(); } + assert(_map.size() == _queue.size()); auto pos = _map.find(host_name); if (pos != _map.end()) { ip_address = pos->second.ip_address; @@ -83,6 +84,7 @@ AsyncResolver::CachingHostResolver::store(const vespalib::string &host_name, con if (res.second) { _queue.push(res.first); } + assert(_map.size() == _queue.size()); } AsyncResolver::CachingHostResolver::CachingHostResolver(Clock::SP clock, HostResolver::SP resolver, seconds max_result_age) |