Skip to content

Commit

Permalink
rgw: allow beast frontend to listen on specific IP address
Browse files Browse the repository at this point in the history
This patch allows the beast frontend to listen on a specific
IP address rather than *. e.g., with below configuration:

rgw frontends = beast port=1.2.3.4:8080

rgw server will listen on 1.2.3.4 only.

Signed-off-by: Yuan Zhou <yuan.zhou@intel.com>
  • Loading branch information
zhouyuan committed Jan 23, 2018
1 parent ee7d2dd commit efa7f4d
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 9 deletions.
34 changes: 27 additions & 7 deletions src/rgw/rgw_asio_frontend.cc
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ class Connection {

class AsioFrontend {
RGWProcessEnv env;
RGWFrontendConfig* conf;
boost::asio::io_service service;

tcp::acceptor acceptor;
Expand All @@ -208,8 +209,8 @@ class AsioFrontend {
void accept(boost::system::error_code ec);

public:
AsioFrontend(const RGWProcessEnv& env)
: env(env), acceptor(service), peer_socket(service) {}
AsioFrontend(const RGWProcessEnv& env, RGWFrontendConfig* conf)
: env(env), conf(conf), acceptor(service), peer_socket(service) {}

int init();
int run();
Expand All @@ -221,10 +222,28 @@ class AsioFrontend {

int AsioFrontend::init()
{
auto ep = tcp::endpoint{tcp::v4(), static_cast<unsigned short>(env.port)};
ldout(ctx(), 4) << "frontend listening on " << ep << dendl;
std::string port_str;
conf->get_val("port", "80", &port_str);

unsigned short port;
boost::asio::ip::address addr; // default to 'any'
boost::system::error_code ec;

auto colon = port_str.find(':');
if (colon != port_str.npos) {
addr = boost::asio::ip::make_address(port_str.substr(0, colon), ec);
if (ec) {
lderr(ctx()) << "failed to parse address '" << port_str << "': " << ec.message() << dendl;
return -ec.value();
}
port = std::stoul(port_str.substr(colon + 1), nullptr, 0);
} else {
port = std::stoul(port_str, nullptr, 0);
}

tcp::endpoint ep = {addr, port};
ldout(ctx(), 4) << "frontend listening on " << ep << dendl;

acceptor.open(ep.protocol(), ec);
if (ec) {
lderr(ctx()) << "failed to open socket: " << ec.message() << dendl;
Expand Down Expand Up @@ -336,11 +355,12 @@ void AsioFrontend::unpause(RGWRados* const store,

class RGWAsioFrontend::Impl : public AsioFrontend {
public:
Impl(const RGWProcessEnv& env) : AsioFrontend(env) {}
Impl(const RGWProcessEnv& env, RGWFrontendConfig* conf) : AsioFrontend(env, conf) {}
};

RGWAsioFrontend::RGWAsioFrontend(const RGWProcessEnv& env)
: impl(new Impl(env))
RGWAsioFrontend::RGWAsioFrontend(const RGWProcessEnv& env,
RGWFrontendConfig* conf)
: impl(new Impl(env, conf))
{
}

Expand Down
2 changes: 1 addition & 1 deletion src/rgw/rgw_asio_frontend.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class RGWAsioFrontend : public RGWFrontend {
class Impl;
std::unique_ptr<Impl> impl;
public:
RGWAsioFrontend(const RGWProcessEnv& env);
RGWAsioFrontend(const RGWProcessEnv& env, RGWFrontendConfig* conf);
~RGWAsioFrontend() override;

int init() override;
Expand Down
2 changes: 1 addition & 1 deletion src/rgw/rgw_main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ int main(int argc, const char **argv)
std::string uri_prefix;
config->get_val("prefix", "", &uri_prefix);
RGWProcessEnv env{ store, &rest, olog, port, uri_prefix, auth_registry };
fe = new RGWAsioFrontend(env);
fe = new RGWAsioFrontend(env, config);
}
#endif /* WITH_RADOSGW_BEAST_FRONTEND */
#if defined(WITH_RADOSGW_FCGI_FRONTEND)
Expand Down

0 comments on commit efa7f4d

Please sign in to comment.