summaryrefslogtreecommitdiffstats
path: root/slobrok/src/apps
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /slobrok/src/apps
Publish
Diffstat (limited to 'slobrok/src/apps')
-rw-r--r--slobrok/src/apps/check_slobrok/.gitignore4
-rw-r--r--slobrok/src/apps/check_slobrok/CMakeLists.txt7
-rw-r--r--slobrok/src/apps/check_slobrok/check_slobrok.cpp115
-rw-r--r--slobrok/src/apps/sbcmd/.gitignore3
-rw-r--r--slobrok/src/apps/sbcmd/CMakeLists.txt8
-rw-r--r--slobrok/src/apps/sbcmd/sbcmd.cpp199
-rw-r--r--slobrok/src/apps/slobrok/.gitignore3
-rw-r--r--slobrok/src/apps/slobrok/CMakeLists.txt10
-rw-r--r--slobrok/src/apps/slobrok/slobrok.cpp114
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);
+}