From d2a9ea7ca60782c56d7ca1c44972633b9ecc6bd6 Mon Sep 17 00:00:00 2001 From: Asias He Date: Mon, 15 Jun 2015 17:19:07 +0800 Subject: [PATCH] storage_service: Fix Unable to contact any seeds Sleep before do bootstrap. This code was not converted from Origin. With this we can start multiple nodes simultaneously. ./build/release/seastar -c 1 -m 128M --rpc-address 127.0.0.1 --listen-address 127.0.0.1 --seed-provider-parameters 127.0.0.1 --datadir `pwd`/tmp/1 --commitlog-directory `pwd`/tmp/1 2>&1 | tee /tmp/out1 & ./build/release/seastar -c 1 -m 128M --rpc-address 127.0.0.2 --listen-address 127.0.0.2 --seed-provider-parameters 127.0.0.1 --datadir `pwd`/tmp/2 --commitlog-directory `pwd`/tmp/2 2>&1 | tee /tmp/out2 & ./build/release/seastar -c 1 -m 128M --rpc-address 127.0.0.3 --listen-address 127.0.0.3 --seed-provider-parameters 127.0.0.1 --datadir `pwd`/tmp/3 --commitlog-directory `pwd`/tmp/3 2>&1 | tee /tmp/out3 & ./build/release/seastar -c 1 -m 128M --rpc-address 127.0.0.4 --listen-address 127.0.0.4 --seed-provider-parameters 127.0.0.1 --datadir `pwd`/tmp/4 --commitlog-directory `pwd`/tmp/4 2>&1 | tee /tmp/out4 --- service/storage_service.cc | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/service/storage_service.cc b/service/storage_service.cc index 77063158d7..79449ecc4c 100644 --- a/service/storage_service.cc +++ b/service/storage_service.cc @@ -110,8 +110,27 @@ future<> storage_service::join_token_ring(int delay) { logger.info("This node will not auto bootstrap because it is configured to be a seed node."); #endif if (should_bootstrap()) { - _bootstrap_tokens = boot_strapper::get_bootstrap_tokens(_token_metadata); - f = bootstrap(_bootstrap_tokens); + auto elapsed = make_shared(0); + auto stop_cond = [elapsed, delay] { + // FIXME + // if we see schema, we can proceed to the next check directly + // if (!Schema.instance.getVersion().equals(Schema.emptyVersion)) { + // return true; + // } + if (*elapsed < delay) { + return false; + } + return true; + }; + f = do_until(stop_cond, [elapsed] { + auto t = 1000; + return sleep(std::chrono::milliseconds(t)).then([elapsed, t] { + *elapsed += t; + }); + }).then([this] { + _bootstrap_tokens = boot_strapper::get_bootstrap_tokens(_token_metadata); + bootstrap(_bootstrap_tokens); + }); #if 0 if (SystemKeyspace.bootstrapInProgress()) logger.warn("Detected previous bootstrap failure; retrying");