From 2a640ba2e83fb3b900d22d9f0e79dfb4488a9e08 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 21 Apr 2020 00:10:59 +0300 Subject: [PATCH] Remove range port selection (leads to races) --- osd.cpp | 49 ++++++++++++---------------------------------- osd.h | 1 - osd_peering.cpp | 2 +- osd_peering_pg.cpp | 2 +- 4 files changed, 14 insertions(+), 40 deletions(-) diff --git a/osd.cpp b/osd.cpp index 35bfd8e2..e9724d60 100644 --- a/osd.cpp +++ b/osd.cpp @@ -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) diff --git a/osd.h b/osd.h index 96af32ce..da79273f 100644 --- a/osd.h +++ b/osd.h @@ -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; diff --git a/osd_peering.cpp b/osd_peering.cpp index 784e0e24..5e6ebae0 100644 --- a/osd_peering.cpp +++ b/osd_peering.cpp @@ -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; } diff --git a/osd_peering_pg.cpp b/osd_peering_pg.cpp index e554070b..f208efa6 100644 --- a/osd_peering_pg.cpp +++ b/osd_peering_pg.cpp @@ -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" : "",