aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaavard <havardpe@yahoo-inc.com>2017-07-06 06:59:59 +0000
committerHaavard <havardpe@yahoo-inc.com>2017-07-06 06:59:59 +0000
commit95c8d1a7819168ebad0079599de39fb5edb4d252 (patch)
tree4f77f59d8e1bf578cd1f08d7bb919770a5d6de1f
parent9b35cbe66cfeadcd42d233f171a19c1e7edb593d (diff)
add more testing and verification
-rw-r--r--vespalib/src/tests/net/async_resolver/async_resolver_test.cpp22
-rw-r--r--vespalib/src/vespa/vespalib/net/async_resolver.cpp2
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)