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"]); bind_port = stoull_full(config["bind_port"]);
if (bind_port <= 0 || bind_port > 65535) if (bind_port <= 0 || bind_port > 65535)
bind_port = 0; 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") if (config["immediate_commit"] == "all")
immediate_commit = IMMEDIATE_ALL; immediate_commit = IMMEDIATE_ALL;
else if (config["immediate_commit"] == "small") else if (config["immediate_commit"] == "small")
@ -175,46 +171,25 @@ void osd_t::bind_socket()
} }
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
if (bind_port == 0 && bind_port_range_start > 0 && addr.sin_port = htons(bind_port);
bind_port_range_end > bind_port_range_start && bind_port_range_end < 65535) 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); 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 else
{ {
addr.sin_port = htons(bind_port); listening_port = 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;
}
} }
if (listen(listen_fd, listen_backlog) < 0) if (listen(listen_fd, listen_backlog) < 0)

1
osd.h
View File

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

View File

@ -237,7 +237,7 @@ void osd_t::repeer_pgs(osd_num_t peer_osd)
if (repeer) if (repeer)
{ {
// Repeer this pg // 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); start_pg_peering(p.second.pg_num);
peering_state |= OSD_PEERING_PGS; peering_state |= OSD_PEERING_PGS;
} }

View File

@ -358,7 +358,7 @@ void pg_t::calc_object_states()
void pg_t::print_state() void pg_t::print_state()
{ {
printf( 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_OFFLINE) ? "offline" : "",
(state & PG_PEERING) ? "peering" : "", (state & PG_PEERING) ? "peering" : "",
(state & PG_INCOMPLETE) ? "incomplete" : "", (state & PG_INCOMPLETE) ? "incomplete" : "",