Skip to content

Commit

Permalink
Refactoring part of the code.
Browse files Browse the repository at this point in the history
  • Loading branch information
monadbobo committed Sep 17, 2019
1 parent eadd368 commit 5f8d7bd
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 44 deletions.
64 changes: 36 additions & 28 deletions src/common/network/NetworkUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,24 +215,17 @@ std::string NetworkUtils::intToIPv4(IPv4 ip) {
return buf;
}

StatusOr<std::vector<HostAddr>> NetworkUtils::toHostAddr(folly::StringPiece ip, int32_t port) {
StatusOr<std::vector<HostAddr>> NetworkUtils::resolveHost(const std::string &ip, int32_t port) {
std::vector<HostAddr> addrs;
IPv4 ipV4;
std::string str = ip.toString();
if (ipv4ToInt(str, ipV4)) {
addrs.emplace_back(std::move(ipV4), port);
return addrs;
}

struct addrinfo hints, *res, *rp;
::memset(&hints, 0, sizeof(struct addrinfo));

hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_ADDRCONFIG;

if (getaddrinfo(str.c_str(), nullptr, &hints, &res) != 0) {
return Status::Error("host not found:%s", ip.start());
if (getaddrinfo(ip.c_str(), nullptr, &hints, &res) != 0) {
return Status::Error("host not found:%s", ip.c_str());
}

for (rp = res; rp != nullptr; rp = rp->ai_next) {
Expand All @@ -255,26 +248,19 @@ StatusOr<std::vector<HostAddr>> NetworkUtils::toHostAddr(folly::StringPiece ip,
freeaddrinfo(res);

if (addrs.empty()) {
return Status::Error("host not found: %s", str.c_str());
return Status::Error("host not found: %s", ip.c_str());
}

return addrs;
}

StatusOr<std::vector<HostAddr>> NetworkUtils::toHostAddr(folly::StringPiece ipPort) {
auto pos = ipPort.find(':');
if (pos == folly::StringPiece::npos) {
return Status::Error("Bad peer format: %s", ipPort.start());
}

int32_t port;
try {
port = folly::to<int32_t>(ipPort.subpiece(pos + 1));
} catch (const std::exception& ex) {
return Status::Error("Bad port number, error: %s", ex.what());
StatusOr<HostAddr> NetworkUtils::toHostAddr(const std::string &ip, int32_t port) {
IPv4 ipV4;
if (!ipv4ToInt(ip, ipV4)) {
return Status::Error("Bad ip format:%s", ip.c_str());
}

return toHostAddr(ipPort.subpiece(0, pos), port);
return std::make_pair(ipV4, port);
}

StatusOr<std::vector<HostAddr>> NetworkUtils::toHosts(const std::string& peersStr) {
Expand All @@ -283,12 +269,34 @@ StatusOr<std::vector<HostAddr>> NetworkUtils::toHosts(const std::string& peersSt
folly::split(",", peersStr, peers, true);
hosts.reserve(peers.size());
for (auto& peerStr : peers) {
auto hostAddr = network::NetworkUtils::toHostAddr(folly::trimWhitespace(peerStr));
if (!hostAddr.ok()) {
return hostAddr.status();
auto ipPort = folly::trimWhitespace(peerStr);
auto pos = ipPort.find(':');
if (pos == folly::StringPiece::npos) {
return Status::Error("Bad peer format: %s", ipPort.start());
}
hosts.insert(hosts.end(), std::make_move_iterator(hostAddr.value().begin()),
std::make_move_iterator(hostAddr.value().end()));

int32_t port;
try {
port = folly::to<int32_t>(ipPort.subpiece(pos + 1));
} catch (const std::exception& ex) {
return Status::Error("Bad port number, error: %s", ex.what());
}

auto ipAddr = ipPort.subpiece(0, pos).toString();
auto hostAddr = toHostAddr(ipAddr, port);
if (hostAddr.ok()) {
hosts.emplace_back(hostAddr.value());
continue;
}

auto resolveAddr = resolveHost(ipAddr, port);
if (resolveAddr.ok()) {
hosts.insert(hosts.end(), std::make_move_iterator(resolveAddr.value().begin()),
std::make_move_iterator(resolveAddr.value().end()));
continue;
}

return resolveAddr.status();
}
return hosts;
}
Expand Down
5 changes: 2 additions & 3 deletions src/common/network/NetworkUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,9 @@ class NetworkUtils final {
// Get a dynamic port that is not in use
static uint16_t getAvailablePort();

static StatusOr<std::vector<HostAddr>> resolveHost(const std::string &ip, int32_t port);
// Convert the given IP/HOST and Port to a HostAddr
static StatusOr<std::vector<HostAddr>> toHostAddr(folly::StringPiece ip, int32_t port);
// Convert the given (IP/HOST):Port to a HostAddr
static StatusOr<std::vector<HostAddr>> toHostAddr(folly::StringPiece ipPort);
static StatusOr<HostAddr> toHostAddr(const std::string &ip, int32_t port);
// Retrieve the string-form IP from the given HostAddr
static std::string ipFromHostAddr(const HostAddr& host);
// Retrieve the port number from the given HostAddr
Expand Down
18 changes: 9 additions & 9 deletions src/common/network/test/NetworkUtilsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,24 +88,24 @@ TEST(NetworkUtils, getAvailablePort) {
}

TEST(NetworkUtils, toHostAddr) {
auto s = NetworkUtils::toHostAddr("localhost:1200");
auto s = NetworkUtils::resolveHost("localhost", 1200);
ASSERT_TRUE(s.ok());
auto addr = s.value();
IPv4 ip;
ASSERT_TRUE(NetworkUtils::ipv4ToInt("127.0.0.1", ip));
ASSERT_EQ(addr[0].first, ip);
ASSERT_EQ(addr[0].second, 1200);

s = NetworkUtils::toHostAddr("8.8.8.8:1300");
ASSERT_TRUE(s.ok());
addr = s.value();
auto s2 = NetworkUtils::toHostAddr("8.8.8.8", 1300);
ASSERT_TRUE(s2.ok());
auto addr2 = s2.value();

ASSERT_TRUE(NetworkUtils::ipv4ToInt("8.8.8.8", ip));
ASSERT_EQ(addr[0].first, ip);
ASSERT_EQ(addr[0].second, 1300);
ASSERT_EQ(addr2.first, ip);
ASSERT_EQ(addr2.second, 1300);

s = NetworkUtils::toHostAddr("a.b.c.d:a23");
ASSERT_FALSE(s.ok());
s2 = NetworkUtils::toHostAddr("a.b.c.d:a23", 1200);
ASSERT_FALSE(s2.ok());
}

TEST(NetworkUtils, toHosts) {
Expand All @@ -121,7 +121,7 @@ TEST(NetworkUtils, toHosts) {
ASSERT_EQ(addr[1].first, ip);
ASSERT_EQ(addr[1].second, 1200);

s = NetworkUtils::toHostAddr("1.1.2.3:123, a.b.c.d:a23");
s = NetworkUtils::toHosts("1.1.2.3:123, a.b.c.d:a23");
ASSERT_FALSE(s.ok());
}

Expand Down
2 changes: 1 addition & 1 deletion src/daemons/MetaDaemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ int main(int argc, char *argv[]) {
LOG(ERROR) << "Bad local host addr, status:" << hostAddrRet.status();
return EXIT_FAILURE;
}
auto& localhost = hostAddrRet.value()[0];
auto& localhost = hostAddrRet.value();
auto peersRet = nebula::network::NetworkUtils::toHosts(FLAGS_meta_server_addrs);
if (!peersRet.ok()) {
LOG(ERROR) << "Can't get peers address, status:" << peersRet.status();
Expand Down
2 changes: 1 addition & 1 deletion src/daemons/StorageDaemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}

gStorageServer = std::make_unique<nebula::storage::StorageServer>(hostRet.value()[0],
gStorageServer = std::make_unique<nebula::storage::StorageServer>(hostRet.value(),
metaAddrsRet.value(),
paths);
if (!gStorageServer->start()) {
Expand Down
2 changes: 1 addition & 1 deletion src/graph/test/TestEnv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void TestEnv::SetUp() {
if (!hostRet.ok()) {
LOG(ERROR) << "Bad local host addr, status:" << hostRet.status();
}
auto& localhost = hostRet.value()[0];
auto& localhost = hostRet.value();

mClient_ = std::make_unique<meta::MetaClient>(threadPool,
std::move(addrsRet.value()),
Expand Down
2 changes: 1 addition & 1 deletion src/storage/test/StorageClientTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ TEST(StorageClientTest, VerticesInterfacesTest) {
auto& addrs = addrsRet.value();
uint32_t localDataPort = network::NetworkUtils::getAvailablePort();
auto hostRet = nebula::network::NetworkUtils::toHostAddr("127.0.0.1", localDataPort);
auto& localHost = hostRet.value()[0];
auto& localHost = hostRet.value();
auto mClient = std::make_unique<meta::MetaClient>(threadPool,
std::move(addrs),
localHost,
Expand Down

0 comments on commit 5f8d7bd

Please sign in to comment.