diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /slobrok/src/apps |
Publish
Diffstat (limited to 'slobrok/src/apps')
-rw-r--r-- | slobrok/src/apps/check_slobrok/.gitignore | 4 | ||||
-rw-r--r-- | slobrok/src/apps/check_slobrok/CMakeLists.txt | 7 | ||||
-rw-r--r-- | slobrok/src/apps/check_slobrok/check_slobrok.cpp | 115 | ||||
-rw-r--r-- | slobrok/src/apps/sbcmd/.gitignore | 3 | ||||
-rw-r--r-- | slobrok/src/apps/sbcmd/CMakeLists.txt | 8 | ||||
-rw-r--r-- | slobrok/src/apps/sbcmd/sbcmd.cpp | 199 | ||||
-rw-r--r-- | slobrok/src/apps/slobrok/.gitignore | 3 | ||||
-rw-r--r-- | slobrok/src/apps/slobrok/CMakeLists.txt | 10 | ||||
-rw-r--r-- | slobrok/src/apps/slobrok/slobrok.cpp | 114 |
9 files changed, 463 insertions, 0 deletions
diff --git a/slobrok/src/apps/check_slobrok/.gitignore b/slobrok/src/apps/check_slobrok/.gitignore new file mode 100644 index 00000000000..28d7034bd09 --- /dev/null +++ b/slobrok/src/apps/check_slobrok/.gitignore @@ -0,0 +1,4 @@ +/.depend +/Makefile +/check_slobrok +slobrok_check_slobrok_app diff --git a/slobrok/src/apps/check_slobrok/CMakeLists.txt b/slobrok/src/apps/check_slobrok/CMakeLists.txt new file mode 100644 index 00000000000..638f1c8c9d1 --- /dev/null +++ b/slobrok/src/apps/check_slobrok/CMakeLists.txt @@ -0,0 +1,7 @@ +# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(slobrok_check_slobrok_app + SOURCES + check_slobrok.cpp + INSTALL bin + DEPENDS +) diff --git a/slobrok/src/apps/check_slobrok/check_slobrok.cpp b/slobrok/src/apps/check_slobrok/check_slobrok.cpp new file mode 100644 index 00000000000..294cbe844c7 --- /dev/null +++ b/slobrok/src/apps/check_slobrok/check_slobrok.cpp @@ -0,0 +1,115 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/fastos/fastos.h> + +#include <vespa/log/log.h> +LOG_SETUP("check_slobrok"); + +#include <vespa/fnet/frt/frt.h> + +#include <string> +#include <sstream> + + +class Slobrok_Checker : public FastOS_Application +{ +private: + FRT_Supervisor *_supervisor; + FRT_Target *_target; + + Slobrok_Checker(const Slobrok_Checker &); + Slobrok_Checker &operator=(const Slobrok_Checker &); + +public: + Slobrok_Checker() : _supervisor(NULL), _target(NULL) {} + virtual ~Slobrok_Checker(); + int usage(); + void initRPC(const char *spec); + void finiRPC(); + virtual int Main(); +}; + + +Slobrok_Checker::~Slobrok_Checker() +{ + LOG_ASSERT(_supervisor == NULL); + LOG_ASSERT(_target == NULL); +} + + +int +Slobrok_Checker::usage() +{ + fprintf(stderr, "usage: %s <port>\n", _argv[0]); + return 1; +} + + +void +Slobrok_Checker::initRPC(const char *spec) +{ + _supervisor = new FRT_Supervisor(); + _target = _supervisor->GetTarget(spec); + _supervisor->Start(); +} + + +void +Slobrok_Checker::finiRPC() +{ + if (_target != NULL) { + _target->SubRef(); + _target = NULL; + } + if (_supervisor != NULL) { + _supervisor->ShutDown(true); + delete _supervisor; + _supervisor = NULL; + } +} + + +int +Slobrok_Checker::Main() +{ + if (_argc != 2) { + return usage(); + } + int port = atoi(_argv[1]); + if (port == 0) { + initRPC(_argv[1]); + } else { + std::ostringstream tmp; + tmp << "tcp/localhost:"; + tmp << port; + initRPC(tmp.str().c_str()); + } + + FRT_RPCRequest *req = _supervisor->AllocRPCRequest(); + + req->SetMethodName("slobrok.system.version"); + _target->InvokeSync(req, 5.0); + int failed = 0; + + if (req->IsError()) { + printf("vespa_slobrok %d: %s\n", + req->GetErrorCode(), req->GetErrorMessage()); + failed = 1; + } else { + FRT_Values &answer = *(req->GetReturn()); + const char *atypes = answer.GetTypeString(); + if (strcmp(atypes, "s") == 0) { + printf("vespa_slobrok-%s OK\n", answer[0]._string._str); + } else { + printf("vespa_slobrok bad rpc return type %s\n", atypes); + failed = 1; + } + } + finiRPC(); + return failed; +} + +int main(int argc, char **argv) +{ + Slobrok_Checker sb_checker; + return sb_checker.Entry(argc, argv); +} diff --git a/slobrok/src/apps/sbcmd/.gitignore b/slobrok/src/apps/sbcmd/.gitignore new file mode 100644 index 00000000000..c035466f4f9 --- /dev/null +++ b/slobrok/src/apps/sbcmd/.gitignore @@ -0,0 +1,3 @@ +/.depend +/Makefile +/sbcmd diff --git a/slobrok/src/apps/sbcmd/CMakeLists.txt b/slobrok/src/apps/sbcmd/CMakeLists.txt new file mode 100644 index 00000000000..3eea280ac55 --- /dev/null +++ b/slobrok/src/apps/sbcmd/CMakeLists.txt @@ -0,0 +1,8 @@ +# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(slobrok_sbcmd_app + SOURCES + sbcmd.cpp + OUTPUT_NAME sbcmd + INSTALL bin + DEPENDS +) diff --git a/slobrok/src/apps/sbcmd/sbcmd.cpp b/slobrok/src/apps/sbcmd/sbcmd.cpp new file mode 100644 index 00000000000..3ba4182de98 --- /dev/null +++ b/slobrok/src/apps/sbcmd/sbcmd.cpp @@ -0,0 +1,199 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/fastos/fastos.h> + +#include <vespa/log/log.h> +LOG_SETUP("sb-cmd"); + +#include <vespa/fnet/frt/frt.h> + +#include <string> +#include <sstream> + + +class Slobrok_CMD : public FastOS_Application +{ +private: + FRT_Supervisor *_supervisor; + FRT_Target *_target; + + Slobrok_CMD(const Slobrok_CMD &); + Slobrok_CMD &operator=(const Slobrok_CMD &); + +public: + Slobrok_CMD() : _supervisor(NULL), _target(NULL) {} + virtual ~Slobrok_CMD(); + int usage(); + void initRPC(const char *spec); + void finiRPC(); + virtual int Main(); +}; + + +Slobrok_CMD::~Slobrok_CMD() +{ + LOG_ASSERT(_supervisor == NULL); + LOG_ASSERT(_target == NULL); +} + + +int +Slobrok_CMD::usage() +{ + fprintf(stderr, "usage: %s <port|spec> <cmd> [args]\n", _argv[0]); + fprintf(stderr, "with cmd one of:\n"); + fprintf(stderr, " slobrok.callback.listNamesServed\n"); + fprintf(stderr, " slobrok.internal.listManagedRpcServers\n"); + fprintf(stderr, " slobrok.admin.listAllRpcServers\n"); + fprintf(stderr, " slobrok.lookupRpcServer {pattern}\n"); + fprintf(stderr, " slobrok.registerRpcServer name {spec}\n"); + fprintf(stderr, " slobrok.unregisterRpcServer {name} {spec}\n"); + fprintf(stderr, " slobrok.admin.addPeer {name} {spec}\n"); + fprintf(stderr, " slobrok.admin.removePeer {name} {spec}\n"); + fprintf(stderr, " slobrok.system.stop\n"); + fprintf(stderr, " slobrok.system.version\n"); + fprintf(stderr, " system.stop\n"); + return 1; +} + + +void +Slobrok_CMD::initRPC(const char *spec) +{ + _supervisor = new FRT_Supervisor(); + _target = _supervisor->GetTarget(spec); + _supervisor->Start(); +} + + +void +Slobrok_CMD::finiRPC() +{ + if (_target != NULL) { + _target->SubRef(); + _target = NULL; + } + if (_supervisor != NULL) { + _supervisor->ShutDown(true); + delete _supervisor; + _supervisor = NULL; + } +} + + +int +Slobrok_CMD::Main() +{ + if (_argc < 3) { + return usage(); + } + int port = atoi(_argv[1]); + if (port == 0) { + initRPC(_argv[1]); + } else { + std::ostringstream tmp; + tmp << "tcp/localhost:"; + tmp << port; + initRPC(tmp.str().c_str()); + } + + bool threeTables = false; + bool twoTables = false; + + FRT_RPCRequest *req = _supervisor->AllocRPCRequest(); + + req->SetMethodName(_argv[2]); + if (strcmp(_argv[2], "slobrok.admin.listAllRpcServers") == 0) { + threeTables = true; + // no params + } else if (strcmp(_argv[2], "slobrok.internal.listManagedRpcServers") == 0) { + twoTables = true; + // no params + } else if (strcmp(_argv[2], "slobrok.callback.listNamesServed") == 0 + || strcmp(_argv[2], "slobrok.internal.listManagedRpcServers") == 0 + || strcmp(_argv[2], "slobrok.admin.listAllRpcServers") == 0 + || strcmp(_argv[2], "slobrok.system.stop") == 0 + || strcmp(_argv[2], "slobrok.system.version") == 0 + || strcmp(_argv[2], "system.stop") == 0) + { + // no params + } else if (strcmp(_argv[2], "slobrok.lookupRpcServer") == 0 + && _argc == 4) + { + twoTables = true; + // one param + req->GetParams()->AddString(_argv[3]); + } else if ((strcmp(_argv[2], "slobrok.registerRpcServer") == 0 + || strcmp(_argv[2], "slobrok.unregisterRpcServer") == 0 + || strcmp(_argv[2], "slobrok.admin.addPeer") == 0 + || strcmp(_argv[2], "slobrok.admin.removePeer") == 0) + && _argc == 5) + { + // two params + req->GetParams()->AddString(_argv[3]); + req->GetParams()->AddString(_argv[4]); + } else { + finiRPC(); + return usage(); + } + _target->InvokeSync(req, 5.0); + + if (req->IsError()) { + fprintf(stderr, "sb-cmd error %d: %s\n", + req->GetErrorCode(), req->GetErrorMessage()); + } else { + FRT_Values &answer = *(req->GetReturn()); + const char *atypes = answer.GetTypeString(); + if (threeTables + && strcmp(atypes, "SSS") == 0 + && answer[0]._string_array._len > 0 + && answer[0]._string_array._len == answer[1]._string_array._len + && answer[0]._string_array._len == answer[2]._string_array._len) + { + for (uint32_t j = 0; j < answer[0]._string_array._len; j++) { + printf("%s\t%s\t%s\n", + answer[0]._string_array._pt[j]._str, + answer[1]._string_array._pt[j]._str, + answer[2]._string_array._pt[j]._str); + } + } else if (twoTables + && strcmp(atypes, "SS") == 0 + && answer[0]._string_array._len > 0 + && answer[0]._string_array._len == answer[1]._string_array._len) + { + for (uint32_t j = 0; j < answer[0]._string_array._len; j++) { + printf("%s\t%s\n", + answer[0]._string_array._pt[j]._str, + answer[1]._string_array._pt[j]._str); + } + } else { + fprintf(stderr, "sb-cmd OK, returntypes '%s'\n", atypes); + uint32_t idx = 0; + while (atypes != NULL && *atypes != '\0') { + switch (*atypes) { + case 's': + printf(" string = '%s'\n", answer[idx]._string._str); + break; + case 'S': + printf(" strings [%d]\n", answer[idx]._string_array._len); + for (uint32_t j = 0; j < answer[idx]._string_array._len; j++) { + printf("\t'%s'\n", answer[idx]._string_array._pt[j]._str); + } + break; + default: + printf(" unknown type %c\n", *atypes); + } + ++atypes; + ++idx; + } + } + } + req->SubRef(); + finiRPC(); + return 0; +} + +int main(int argc, char **argv) +{ + Slobrok_CMD sb_cmd; + return sb_cmd.Entry(argc, argv); +} diff --git a/slobrok/src/apps/slobrok/.gitignore b/slobrok/src/apps/slobrok/.gitignore new file mode 100644 index 00000000000..e0038c324fb --- /dev/null +++ b/slobrok/src/apps/slobrok/.gitignore @@ -0,0 +1,3 @@ +/.depend +/Makefile +/slobrok diff --git a/slobrok/src/apps/slobrok/CMakeLists.txt b/slobrok/src/apps/slobrok/CMakeLists.txt new file mode 100644 index 00000000000..1a735a366e4 --- /dev/null +++ b/slobrok/src/apps/slobrok/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(slobrok_app + SOURCES + slobrok.cpp + OUTPUT_NAME slobrok + INSTALL bin + DEPENDS + slobrok_slobrokserver + slobrok +) diff --git a/slobrok/src/apps/slobrok/slobrok.cpp b/slobrok/src/apps/slobrok/slobrok.cpp new file mode 100644 index 00000000000..53d2a61001c --- /dev/null +++ b/slobrok/src/apps/slobrok/slobrok.cpp @@ -0,0 +1,114 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/fastos/fastos.h> +#include <vespa/log/log.h> +LOG_SETUP("slobrok"); + +#include <vespa/fnet/fnet.h> + +#include <vespa/slobrok/server/sbenv.h> + +/** + * @brief namespace for the actual slobrok application. + **/ +namespace slobrok { + +class App : public FastOS_Application +{ +public: + int Main(); +}; + +static std::unique_ptr<SBEnv> mainobj; + +extern "C" { +static void sigtermhandler(int signo); +}; + +static void +sigtermhandler(int signo) +{ + (void) signo; + if (mainobj) { + mainobj->shutdown(); + } +} + +static void +hook_sigterm(void) +{ + struct sigaction act; + act.sa_handler = sigtermhandler; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + sigaction(SIGTERM, &act, NULL); +} + + +int +App::Main() +{ + uint32_t portnum = 2773; + uint32_t statePort = 0; + vespalib::string cfgId; + + int argi = 1; + const char* optArg; + char c; + while ((c = GetOpt("c:s:p:", optArg, argi)) != -1) { + switch (c) { + case 'c': + cfgId = std::string(optArg); + break; + case 's': + statePort = atoi(optArg); + break; + case 'p': + portnum = atoi(optArg); + break; + default: + LOG(error, "unknown option letter '%c'", c); + return 1; + } + } + int res = 1; + try { + if (cfgId.empty()) { + LOG(debug, "no config id specified"); + ConfigShim shim(portnum); + mainobj.reset(new SBEnv(shim)); + } else { + ConfigShim shim(portnum, statePort, cfgId); + mainobj.reset(new SBEnv(shim)); + } + hook_sigterm(); + res = mainobj->MainLoop(); + } catch (const config::ConfigTimeoutException &e) { + LOG(error, "config timeout during construction : %s", e.what()); + EV_STOPPING("slobrok", "config timeout during construction"); + return 1; + } catch (const vespalib::PortListenException &e) { + LOG(error, "Failed listening to network port(%d) with protocol(%s): '%s'", + e.get_port(), e.get_protocol().c_str(), e.what()); + EV_STOPPING("slobrok", "could not listen to our network port"); + return 1; + } catch (const std::exception & e) { + LOG(error, "unknown exception during construction : %s", e.what()); + EV_STOPPING("slobrok", "unknown exception during construction"); + return 2; + } catch (...) { + LOG(error, "unknown exception during construction"); + EV_STOPPING("slobrok", "unknown exception during construction"); + return 3; + } + mainobj.reset(); + return res; +} + +} // namespace slobrok + +int +main(int argc, char **argv) +{ + slobrok::App slobrok; + return slobrok.Entry(argc, argv); +} |