Remove range port selection (leads to races)

trace-sqes
Vitaliy Filippov 2020-04-21 00:10:59 +03:00
parent 6a21ea207e
commit 2a640ba2e8
4 changed files with 14 additions and 40 deletions

49
osd.cpp
View File

@ -126,10 +126,6 @@ void osd_t::parse_config(blockstore_config_t & config)
bind_port = stoull_full(config["bind_port"]);
if (bind_port <= 0 || bind_port > 65535)
bind_port = 0;
if (config.find("bind_port_range_start") != config.end())
bind_port_range_start = stoull_full(config["bind_port_range_start"]);
if (config.find("bind_port_range_end") != config.end())
bind_port_range_end = stoull_full(config["bind_port_range_end"]);
if (config["immediate_commit"] == "all")
immediate_commit = IMMEDIATE_ALL;
else if (config["immediate_commit"] == "small")
@ -175,46 +171,25 @@ void osd_t::bind_socket()
}
addr.sin_family = AF_INET;
if (bind_port == 0 && bind_port_range_start > 0 &&
bind_port_range_end > bind_port_range_start && bind_port_range_end < 65535)
addr.sin_port = htons(bind_port);
if (bind(listen_fd, (sockaddr*)&addr, sizeof(addr)) < 0)
{
for (listening_port = bind_port_range_start; listening_port != bind_port_range_end; listening_port++)
close(listen_fd);
throw std::runtime_error(std::string("bind: ") + strerror(errno));
}
if (bind_port == 0)
{
socklen_t len = sizeof(addr);
if (getsockname(listen_fd, (sockaddr *)&addr, &len) == -1)
{
addr.sin_port = htons(listening_port);
if (bind(listen_fd, (sockaddr*)&addr, sizeof(addr)) == 0)
{
break;
}
}
if (listening_port == bind_port_range_end)
{
listening_port = 0;
close(listen_fd);
throw std::runtime_error(std::string("bind: ") + strerror(errno));
throw std::runtime_error(std::string("getsockname: ") + strerror(errno));
}
listening_port = ntohs(addr.sin_port);
}
else
{
addr.sin_port = htons(bind_port);
if (bind(listen_fd, (sockaddr*)&addr, sizeof(addr)) < 0)
{
close(listen_fd);
throw std::runtime_error(std::string("bind: ") + strerror(errno));
}
if (bind_port == 0)
{
socklen_t len = sizeof(addr);
if (getsockname(listen_fd, (sockaddr *)&addr, &len) == -1)
{
close(listen_fd);
throw std::runtime_error(std::string("getsockname: ") + strerror(errno));
}
listening_port = ntohs(addr.sin_port);
}
else
{
listening_port = bind_port;
}
listening_port = bind_port;
}
if (listen(listen_fd, listen_backlog) < 0)

1
osd.h
View File

@ -203,7 +203,6 @@ class osd_t
bool run_primary = false;
std::string bind_address;
int bind_port, listen_backlog;
int bind_port_range_start = 11200, bind_port_range_end = 12000;
int client_queue_depth = 128;
bool allow_test_ops = true;
int receive_buffer_size = 9000;

View File

@ -237,7 +237,7 @@ void osd_t::repeer_pgs(osd_num_t peer_osd)
if (repeer)
{
// Repeer this pg
printf("Repeer PG %d because of OSD %lu\n", p.second.pg_num, peer_osd);
printf("[PG %u] Repeer because of OSD %lu\n", p.second.pg_num, peer_osd);
start_pg_peering(p.second.pg_num);
peering_state |= OSD_PEERING_PGS;
}

View File

@ -358,7 +358,7 @@ void pg_t::calc_object_states()
void pg_t::print_state()
{
printf(
"PG %u is %s%s%s%s%s%s%s%s%s (%lu objects)\n", pg_num,
"[PG %u] is %s%s%s%s%s%s%s%s%s (%lu objects)\n", pg_num,
(state & PG_OFFLINE) ? "offline" : "",
(state & PG_PEERING) ? "peering" : "",
(state & PG_INCOMPLETE) ? "incomplete" : "",