diff options
-rw-r--r-- | logd/src/logd/CMakeLists.txt | 3 | ||||
-rw-r--r-- | logd/src/logd/cmdbuf.cpp | 145 | ||||
-rw-r--r-- | logd/src/logd/cmdbuf.h | 27 | ||||
-rw-r--r-- | logd/src/logd/forward.cpp | 12 | ||||
-rw-r--r-- | logd/src/logd/forward.h | 3 | ||||
-rw-r--r-- | logd/src/logd/perform.cpp | 291 | ||||
-rw-r--r-- | logd/src/logd/perform.h | 42 | ||||
-rw-r--r-- | logd/src/logd/service.cpp | 146 | ||||
-rw-r--r-- | logd/src/logd/service.h | 68 | ||||
-rw-r--r-- | logd/src/logd/watch.cpp | 50 | ||||
-rw-r--r-- | logd/src/tests/forward/forward.cpp | 8 |
11 files changed, 11 insertions, 784 deletions
diff --git a/logd/src/logd/CMakeLists.txt b/logd/src/logd/CMakeLists.txt index 78892fdeca6..dc3a25799eb 100644 --- a/logd/src/logd/CMakeLists.txt +++ b/logd/src/logd/CMakeLists.txt @@ -1,13 +1,10 @@ # Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. vespa_add_library(logd STATIC SOURCES - cmdbuf.cpp conf.cpp conn.cpp forward.cpp metrics.cpp - perform.cpp - service.cpp state.cpp watch.cpp diff --git a/logd/src/logd/cmdbuf.cpp b/logd/src/logd/cmdbuf.cpp deleted file mode 100644 index b9836b5d8b0..00000000000 --- a/logd/src/logd/cmdbuf.cpp +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#include "cmdbuf.h" -#include "errhandle.h" -#include "perform.h" -#include <fcntl.h> -#include <unistd.h> - -#include <vespa/log/log.h> -LOG_SETUP(""); - -namespace logdemon { - -CmdBuf::CmdBuf() - : _size(1000), - _buf((char *)malloc(_size)), - _bp(_buf), - _left(_size) -{ } - -CmdBuf::~CmdBuf() -{ - free(_buf); -} - -bool -CmdBuf::hasCmd() -{ - char *p = _buf; - while (p < _bp) { - if (*p == '\n') return true; - p++; - } - return false; - -} - -void -CmdBuf::doCmd(Performer& via) -{ - char *p = _buf; - while (p < _bp) { - if (*p == '\n') { - *p = '\0'; - LOG(spam, "doing command: '%s'", _buf); - via.doCmd(_buf); - - ++p; - int len = p - _buf; - int movelen = _bp - p; - memmove(_buf, p, movelen); - _bp -= len; - _left += len; - - p = _buf; - continue; - } - p++; - } -} - - -void -CmdBuf::extend() -{ - _size *= 2; - int pos = _bp - _buf; - char *nbuf = (char *)realloc(_buf, _size); - if (nbuf == nullptr) { - free(_buf); - LOG(error, "could not allocate %d bytes", _size); - throw SomethingBad("realloc failed"); - } - _buf = nbuf; - _bp = _buf + pos; - _left = _size - pos; -} - -#ifndef O_NONBLOCK -#define O_NONBLOCK O_NDELAY -#endif - -void -CmdBuf::maybeRead(int fd) -{ - struct timeval notime; - notime.tv_sec = 0; - notime.tv_usec = 0; - - fd_set fdset; - FD_ZERO(&fdset); - FD_SET(fd, &fdset); - - while (select(fd + 1, &fdset, nullptr, nullptr, ¬ime) > 0) { - // usually loops just once - int oflags = fcntl(fd, F_GETFL); - int nbflags = oflags | O_NONBLOCK; - - if (fcntl(fd, F_SETFL, nbflags) != 0) { - LOG(error, "could not fcntl logserver socket: %s", strerror(errno)); - throw SomethingBad("fcntl failed"); - } - - ssize_t len = ::read(fd, _bp, _left); - if (len > 0) { - _bp += len; - _left -= len; - if (_left < 80) { - extend(); - } - } else if (len < 0) { - LOG(warning, "error reading from logserver socket: %s", strerror(errno)); - throw ConnectionException("error reading"); - } - fcntl(fd, F_SETFL, oflags); - if (len == 0) { - LOG(warning, "read 0 bytes from logserver socket"); - throw ConnectionException("eof on socket"); - break; - } - } - return; -} - - -bool -CmdBuf::readFile(int fd) -{ - ssize_t len = ::read(fd, _bp, _left); - if (len > 0) { - _bp += len; - _left -= len; - if (_left < 80) { - extend(); - } - return true; - } - if (len < 0) { - LOG(error, "error reading file: %s", strerror(errno)); - throw SomethingBad("read failed"); - } - return false; -} - -} // namespace diff --git a/logd/src/logd/cmdbuf.h b/logd/src/logd/cmdbuf.h deleted file mode 100644 index 0c3fd75d07e..00000000000 --- a/logd/src/logd/cmdbuf.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#pragma once - -namespace logdemon { - -class Performer; - -class CmdBuf -{ -private: - int _size; - char *_buf; - char *_bp; - int _left; - void extend(); -public: - CmdBuf(const CmdBuf& other) = delete; - CmdBuf& operator= (const CmdBuf& other) = delete; - CmdBuf(); - ~CmdBuf(); - bool hasCmd(); - void doCmd(Performer &via); - void maybeRead(int fd); - bool readFile(int fd); -}; - -} // namespace diff --git a/logd/src/logd/forward.cpp b/logd/src/logd/forward.cpp index 1abf6bffe58..4b666ef261e 100644 --- a/logd/src/logd/forward.cpp +++ b/logd/src/logd/forward.cpp @@ -10,6 +10,8 @@ #include <vespa/log/log.h> LOG_SETUP(""); +using LogLevel = ns_log::Logger::LogLevel; + namespace logdemon { Forwarder::Forwarder(Metrics &metrics) @@ -17,7 +19,6 @@ Forwarder::Forwarder(Metrics &metrics) _metrics(metrics), _forwardMap(), _levelparser(), - knownServices(), _badLines(0) {} Forwarder::~Forwarder() = default; @@ -117,8 +118,6 @@ Forwarder::parseline(const char *linestart, const char *lineend) LOG(spam, "bad logline no 3. tab: %.*s", llength, linestart); return false; } - int pid = strtol(fieldstart, &eod, 10); - // not checked - pid may not be a number after all // service fieldstart = tab + 1; @@ -168,12 +167,7 @@ Forwarder::parseline(const char *linestart, const char *lineend) if (found != _forwardMap.end()) { return found->second; } - - Service *svcp = knownServices.getService(service); - Component *cp = svcp->getComponent(component); - cp->remember(logtime, pid); - bool retval = cp->shouldForward(l); - return retval; + return false; // Unknown log level } LogLevel diff --git a/logd/src/logd/forward.h b/logd/src/logd/forward.h index 8549a0801a4..d9a81098ac7 100644 --- a/logd/src/logd/forward.h +++ b/logd/src/logd/forward.h @@ -1,7 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once -#include "service.h" +#include <vespa/log/log.h> #include <map> #include <unordered_set> @@ -38,7 +38,6 @@ private: } bool parseline(const char *linestart, const char *lineend); public: - Services knownServices; int _badLines; Forwarder(Metrics &metrics); ~Forwarder(); diff --git a/logd/src/logd/perform.cpp b/logd/src/logd/perform.cpp deleted file mode 100644 index 07afac88841..00000000000 --- a/logd/src/logd/perform.cpp +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#include "perform.h" -#include "cmdbuf.h" -#include <cassert> - -#include <vespa/log/log.h> -LOG_SETUP(""); - -namespace logdemon { - -namespace { - -bool -isPrefix(const char *prefix, const char *line) -{ - while (*prefix) { - if (*prefix++ != *line++) return false; - } - return true; -} - -} - -Performer::~Performer() = default; -ExternalPerformer::~ExternalPerformer() = default; - -void -ExternalPerformer::listStates(const char *service, const char *component) -{ - Service *svc = _services.getService(service); - Component *cmp = svc->getComponent(component); - - using ns_log::Logger; - - char buf[1024]; - int pos = snprintf(buf, 1024, "state %s %s ", service, component); - for (int i = 0; pos < 1000 && i < Logger::NUM_LOGLEVELS; i++) { - LogLevel level = static_cast<LogLevel>(i); - const char *levstate = "off"; - if (cmp->shouldLogAtAll(level)) { - if (cmp->shouldForward(level)) { - levstate = "forward"; - } else { - levstate = "store"; - } - } - pos += snprintf(buf+pos, 1024-pos, "%s=%s,", Logger::logLevelNames[i], levstate); - } - if (pos < 1000) { - buf[pos-1]='\n'; - _forwarder.forwardText(buf, pos); - } else { - LOG(warning, "buffer to small to list states[%s, %s]", service, component); - } -} - -void -ExternalPerformer::doCmd(char *line) -{ - if (isPrefix("list services", line)) { - for (const auto & entry : _services._services) { - char buf[1024]; - snprintf(buf, 1024, "service %s\n", entry.first.c_str()); - _forwarder.forwardText(buf, strlen(buf)); - } - return; - } - if (isPrefix("list components ", line)) { - const char *servstr = line+5+11; - Service *svc = _services.getService(servstr); - for (const auto & entry : svc->components()) { - const char * key = entry.first.c_str(); - char buf[1024]; - snprintf(buf, 1024, "component %s %s\n", servstr, key); - int len = strlen(buf); - if (len < 1000) { - _forwarder.forwardText(buf, len); - } else { - LOG(warning, "buffer too small to list component %s %s", servstr, key); - } - } - return; - } - if (isPrefix("list states ", line)) { - char *servstr = line+5+7; - char *compstr = strchr(servstr, ' '); - if (compstr == nullptr) { - Service *svc = _services.getService(servstr); - for (const auto & entry : svc->components()) { - listStates(servstr, entry.first.c_str()); - } - return; - } - *compstr++ = '\0'; - listStates(servstr, compstr); - return; - } - if (isPrefix("setallstates", line)) { - char *levmods = strchr(line, ' '); - if (levmods == nullptr) { - LOG(error, "bad command: %s", line); - } else { - std::string orig(line); - *levmods++ = '\0'; - doSetAllStates(levmods, orig.c_str()); - } - return; - } - if (isPrefix("setstate ", line)) { - char *servstr = line + 9; - char *compstr = strchr(servstr, ' '); - if (compstr == nullptr) { - LOG(error, "bad command: %s", line); - return; - } - *compstr++ = '\0'; - char *levmods = strchr(compstr, ' '); - if (levmods == nullptr) { - LOG(error, "bad command: %s %s", line, compstr); - return; - } - *levmods++ = '\0'; - - Service *svc = _services.getService(servstr); - Component *cmp = svc->getComponent(compstr); - if (doSetState(levmods, cmp, line) == nullptr) return; - - // maybe ??? - listStates(servstr, compstr); - return; - } - if (isPrefix("setdefaultstate ", line)) { - char *levmods = strchr(line, ' '); - *levmods++ = '\0'; - while (levmods) { - char *newval = strchr(levmods, '='); - if (!newval) { - LOG(error, "bad command %s: expected level=value, got %s", - line, levmods); - return; - } - *newval++ = '\0'; - - LogLevel level = _levelparser.parseLevel(levmods); - char *nextlev = strchr(newval, ','); - if (nextlev) *nextlev++ = '\0'; - if (strcmp(newval, "forward") == 0) { - Component::defaultDoForward(level); - } else if (strcmp(newval, "noforward") == 0) { - Component::defaultDontForward(level); - } else { - LOG(error, "bad command %s %s=%s: want forward/noforward", - line, levmods, newval); - return; - } - levmods = nextlev; - } - return; - } - LOG(error, "unknown command: %s", line); -} - -void -ExternalPerformer::doSetAllStates(char *levmods, const char *origline) { - while (levmods) { - char *newval = strchr(levmods, '='); - if (!newval) { - LOG(error, "bad command %s : expected level=value, got %s", origline, levmods); - return; - } - *newval++ = '\0'; - - LogLevel level = _levelparser.parseLevel(levmods); - char *nextlev = strchr(newval, ','); - if (nextlev) *nextlev++ = '\0'; - for (const auto & serviceEntry : _services._services) { - Service *svc = _services.getService(serviceEntry.first); - for (const auto & entry : svc->components()) { - Component *cmp = svc->getComponent(entry.first); - assert(cmp != 0); - - if (strcmp(newval, "forward") == 0) { - cmp->doForward(level); - cmp->doLogAtAll(level); - } else if (strcmp(newval, "noforward") == 0) { - cmp->dontForward(level); - } else if (strcmp(newval, "store") == 0) { - cmp->dontForward(level); - cmp->doLogAtAll(level); - } else if (strcmp(newval, "off") == 0) { - cmp->dontForward(level); - cmp->dontLogAtAll(level); - } else { - LOG(error, "bad command %s: want forward/store/off, got %s", origline, newval); - return; - } - } - } - - levmods = nextlev; - } -} - -char * -ExternalPerformer::doSetState(char *levmods, Component *cmp, char * line) { - while (levmods) { - char *newval = strchr(levmods, '='); - if (!newval) { - LOG(error, "bad command %s : expected level=value, got %s", line, levmods); - return nullptr; - } - *newval++ = '\0'; - - LogLevel level = _levelparser.parseLevel(levmods); - char *nextlev = strchr(newval, ','); - if (nextlev) *nextlev++ = '\0'; - if (strcmp(newval, "forward") == 0) { - cmp->doForward(level); - cmp->doLogAtAll(level); - } else if (strcmp(newval, "noforward") == 0) { - cmp->dontForward(level); - } else if (strcmp(newval, "store") == 0) { - cmp->dontForward(level); - cmp->doLogAtAll(level); - } else if (strcmp(newval, "off") == 0) { - cmp->dontForward(level); - cmp->dontLogAtAll(level); - } else { - LOG(error, "bad command %s %s=%s: want forward/store/off", line, levmods, newval); - return nullptr; - } - levmods = nextlev; - } - return levmods; -} - -void -InternalPerformer::doCmd(char *line) -{ - if (isPrefix("setstate ", line)){ - char *servstr = line + 9; - char *compstr = strchr(servstr, ' '); - if (compstr == nullptr) { - LOG(error, "bad internal command: %s", line); - return; - } - *compstr++ = '\0'; - char *levmods = strchr(compstr, ' '); - if (levmods == nullptr) { - LOG(error, "bad internal command: %s %s", line, compstr); - return; - } - *levmods++ = '\0'; - - // ignore services with slash in the name, invalid - if (strchr(servstr, '/') != nullptr) - return; - - Service *svc = _services.getService(servstr); - Component *cmp = svc->getComponent(compstr); - - while (levmods) { - char *newval = strchr(levmods, '='); - if (!newval) { - LOG(error, "bad internal %s %s: expected level=value, got %s", line, compstr, levmods); - return; - } - *newval++ = '\0'; - - LogLevel level = _levelparser.parseLevel(levmods); - char *nextlev = strchr(newval, ','); - if (nextlev) *nextlev++ = '\0'; - if (strcmp(newval, "forward") == 0) { - cmp->doForward(level); - } else if (strcmp(newval, "store") == 0) { - cmp->dontForward(level); - } else if (strcmp(newval, "off") == 0) { - cmp->dontForward(level); - } else { - LOG(error, "bad internal %s %s %s=%s: want forward/store/off", line, compstr, levmods, newval); - return; - } - levmods = nextlev; - } - return; - } - LOG(error, "unknown command: %s", line); -} - -} // namespace diff --git a/logd/src/logd/perform.h b/logd/src/logd/perform.h deleted file mode 100644 index 0303360fe49..00000000000 --- a/logd/src/logd/perform.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#pragma once - -#include "forward.h" - -namespace logdemon { - -class Performer -{ -protected: - LevelParser _levelparser; -public: - virtual void doCmd(char *line) = 0; - Performer() : _levelparser() {} - virtual ~Performer(); -}; - -class ExternalPerformer: public Performer -{ -private: - Forwarder& _forwarder; - Services& _services; - void listStates(const char *service, const char *component); -public: - void doCmd(char *line) override; - void doSetAllStates(char *levmods, const char * line); - char *doSetState(char *levmods, Component *cmp, char *line); - ExternalPerformer(Forwarder& fw, Services& s) - : _forwarder(fw), _services(s) {} - ~ExternalPerformer(); -}; - -class InternalPerformer: public Performer -{ - Services& _services; -public: - void doCmd(char *line) override; - InternalPerformer(Services& s) : _services(s) {} - ~InternalPerformer() {} -}; - -} // namespace diff --git a/logd/src/logd/service.cpp b/logd/src/logd/service.cpp deleted file mode 100644 index 7a4e3c97222..00000000000 --- a/logd/src/logd/service.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include "service.h" -#include <cassert> -#include <unistd.h> - -#include <vespa/log/log.h> -#include <vespa/log/control-file.h> -LOG_SETUP("logdemon"); - - -namespace logdemon { - -unsigned long Component::defFwd = (unsigned long)-1; - -Component::Component(const std::string & servicename, const std::string & name) - : _isforwarding(defFwd), _lastseen(0.0), _lastpid(0), - _myservice(servicename), _myname(name), - _logctlname(name.substr(std::min(name.size(), name.find('.')))) -{ - assert(ns_log::Logger::NUM_LOGLEVELS < 32); -} - -Component::~Component() = default; - -void -Component::doLogAtAll(LogLevel level) -{ - using ns_log::ControlFile; - - char lcfn[FILENAME_MAX]; - if (! ControlFile::makeName(_myservice.c_str(), lcfn, FILENAME_MAX)) { - LOG(debug, "no logcontrol file for service '%s'", _myservice.c_str()); - return; - } - try { - ControlFile foo(lcfn, ControlFile::READWRITE); - unsigned int *lstring = foo.getLevels(_logctlname.c_str()); - lstring[level] = CHARS_TO_UINT(' ', ' ', 'O', 'N'); - } catch (...) { - LOG(debug, "exception changing logcontrol for %s", _myservice.c_str()); - } -} - -void -Component::dontLogAtAll(LogLevel level) -{ - using ns_log::ControlFile; - - char lcfn[FILENAME_MAX]; - if (! ControlFile::makeName(_myservice.c_str(), lcfn, FILENAME_MAX)) { - LOG(debug, "no logcontrol file for service '%s'", _myservice.c_str()); - return; - } - try { - ControlFile foo(lcfn, ControlFile::READWRITE); - unsigned int *lstring = foo.getLevels(_logctlname.c_str()); - lstring[level] = CHARS_TO_UINT(' ', 'O', 'F', 'F'); - } catch (...) { - LOG(debug, "exception changing logcontrol for %s", _myservice.c_str()); - } -} - -bool -Component::shouldLogAtAll(LogLevel level) const -{ - using ns_log::ControlFile; - - char lcfn[FILENAME_MAX]; - if (! ControlFile::makeName(_myservice.c_str(), lcfn, FILENAME_MAX)) { - LOG(spam, "no logcontrol file for service '%s'", _myservice.c_str()); - return true; - } - try { - ControlFile foo(lcfn, ControlFile::READWRITE); - unsigned int *lstring = foo.getLevels(_logctlname.c_str()); - return (lstring[level] == CHARS_TO_UINT(' ', ' ', 'O', 'N')); - } catch (...) { - LOG(debug, "exception checking logcontrol for %s", _myservice.c_str()); - } - return true; -} - -Service::Service(const std::string & name) - : _myname(name), - _components() -{ -} - -Service::~Service() = default; - -Component * -Service::getComponent(const std::string & comp) { - auto found = _components.find(comp); - if (found == _components.end()) { - _components[comp] = std::make_unique<Component>(_myname, comp); - found = _components.find(comp); - } - return found->second.get(); -} - -Service * -Services::getService(const std::string & serv) { - auto found = _services.find(serv); - if (found == _services.end()) { - _services[serv] = std::make_unique<Service>(serv); - found = _services.find(serv); - } - return found->second.get(); -} - -Services::Services() = default; -Services::~Services() = default; - -void -Services::dumpState(int fildesc) -{ - using ns_log::Logger; - - for (const auto & serviceEntry : _services) { - const Service & svc = *serviceEntry.second; - const char * service = serviceEntry.first.c_str(); - for (const auto & entry : svc.components()) { - const Component & cmp = *entry.second; - const char * key = entry.first.c_str(); - char buf[1024]; - int pos = snprintf(buf, 1024, "setstate %s %s ", service, key); - for (int i = 0; pos < 1000 && i < Logger::NUM_LOGLEVELS; i++) { - LogLevel l = static_cast<LogLevel>(i); - pos += snprintf(buf+pos, 1024-pos, "%s=%s,", Logger::logLevelNames[i], - cmp.shouldForward(l) ? "forward" : "store"); - } - if (pos < 1000) { - buf[pos-1]='\n'; - ssize_t writeRes = write(fildesc, buf, pos); - if (writeRes != pos) { - LOG(warning, "Write failed, res=%zd, should be %d: %s", - writeRes, pos, strerror(errno)); - } - } else { - LOG(warning, "buffer to small to dumpstate[%s, %s]", service, key); - } - } - } -} - -} diff --git a/logd/src/logd/service.h b/logd/src/logd/service.h deleted file mode 100644 index e27387c6cae..00000000000 --- a/logd/src/logd/service.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#pragma once - -#include <logd/config-logd.h> -#include <vespa/log/log.h> -#include <unordered_map> - -namespace logdemon { - -typedef ns_log::Logger::LogLevel LogLevel; - -class Component -{ - unsigned long _isforwarding; - double _lastseen; - int _lastpid; - std::string _myservice; - std::string _myname; - std::string _logctlname; - - static unsigned long defFwd; -public: - static void defaultDoForward(LogLevel level) { defFwd |= (1 << level); } - static void defaultDontForward(LogLevel level) { defFwd &= ~(1 << level); } - - void doForward(LogLevel level) { _isforwarding |= (1 << level); } - void dontForward(LogLevel level) { _isforwarding &= ~(1 << level); } - bool shouldForward(LogLevel level) const { - return ((_isforwarding & (1 << level)) != 0); - } - void doLogAtAll(LogLevel level); - void dontLogAtAll(LogLevel level); - bool shouldLogAtAll(LogLevel level) const; - Component(const std::string & servicename, const std::string & name); - ~Component(); - void remember(double t, int p) { _lastseen = t; _lastpid = p; } - double lastSeen() const { return _lastseen; } - double lastPid() const { return _lastpid; } - const std::string & getLogCtlName() const { return _logctlname; } -}; - -class Service -{ -public: - using ComponentMap = std::unordered_map<std::string, std::unique_ptr<Component>>; - Service(const Service& other) = delete; - Service& operator= (const Service& other) = delete; - Service(const std::string & name); - ~Service(); - Component *getComponent(const std::string & comp); - const ComponentMap & components() const { return _components; } -private: - std::string _myname; - ComponentMap _components; -}; - -class Services -{ -public: - std::unordered_map<std::string, std::unique_ptr<Service>> _services; - Service *getService(const std::string & serv); - Services(); - ~Services(); - void dumpState(int fildesc); -}; - -} // namespace - diff --git a/logd/src/logd/watch.cpp b/logd/src/logd/watch.cpp index fc1937e5693..b95b58a4564 100644 --- a/logd/src/logd/watch.cpp +++ b/logd/src/logd/watch.cpp @@ -2,11 +2,8 @@ #include "watch.h" #include "errhandle.h" -#include "service.h" #include "forward.h" #include "conf.h" -#include "perform.h" -#include "cmdbuf.h" #include <glob.h> #include <unistd.h> #include <fcntl.h> @@ -90,15 +87,13 @@ class StateSaver { public: StateSaver(); ~StateSaver(); - void saveState(const donecache&, Services&); - bool loadState(donecache&, Forwarder&); - void doFullsave() { _cachecounter = 300; } + void saveState(const donecache&); + bool loadState(donecache&); private: int _savefd; - int _cachecounter; }; -void StateSaver::saveState(const donecache& already, Services& currentserv) +void StateSaver::saveState(const donecache& already) { if (_savefd < 0) { // cannot save state @@ -110,41 +105,22 @@ void StateSaver::saveState(const donecache& already, Services& currentserv) LOG(error, "error writing to donecachefile: %s", strerror(errno)); close(_savefd); _savefd = -1; - } else if (++_cachecounter > 300) { - currentserv.dumpState(_savefd); - off_t here = lseek(_savefd, (off_t)0, SEEK_CUR); - LOG(debug, "cached already %d/%d %d, trunc at %d", - (int)already.st_dev, (int)already.st_ino, - (int)already.offset, (int)here); - if (here == (off_t)-1) { - LOG(error, "lseek failed: %s", strerror(errno)); - } else if (ftruncate(_savefd, here) < 0) { - LOG(error, "ftruncate %d=%d failed: %s", _savefd, (int)here, strerror(errno)); - } - _cachecounter = 0; } } bool -StateSaver::loadState(donecache& already, Forwarder& fwd) +StateSaver::loadState(donecache& already) { if (_savefd >= 0 && read(_savefd, &already, sizeof(already)) == sizeof(already)) { - InternalPerformer iperf(fwd.knownServices); - CmdBuf filebuf; - while (filebuf.readFile(_savefd)) { - while (filebuf.hasCmd()) { - filebuf.doCmd(iperf); - } - } return true; } else { return false; } } -StateSaver::StateSaver() : _savefd(-1), _cachecounter(300) +StateSaver::StateSaver() : _savefd(-1) { _savefd = open("var/db/vespa/logd.donestate", O_RDWR|O_CREAT, 0664); if (_savefd < 0) { @@ -177,11 +153,8 @@ Watcher::watchfile() throw SomethingBad("too long filename in watchfile"); } - ExternalPerformer performer(_forwarder, _forwarder.knownServices); - CmdBuf cmdbuf; - StateSaver dcf; - if (dcf.loadState(already, _forwarder)) { + if (dcf.loadState(already)) { already.valid = true; } @@ -312,22 +285,13 @@ Watcher::watchfile() } } - dcf.saveState(already, _forwarder.knownServices); + dcf.saveState(already); if (_confsubscriber.checkAvailable()) { LOG(debug, "new config available, doing reconfigure"); return; } - if (_confsubscriber.useLogserver()) { - cmdbuf.maybeRead(_forwarder.getLogserverFD()); - while (cmdbuf.hasCmd()) { - cmdbuf.doCmd(performer); - // in case forwarding changes - dcf.doFullsave(); - } - } - if (catcher.receivedStopSignal()) { throw SigTermException("caught signal"); } diff --git a/logd/src/tests/forward/forward.cpp b/logd/src/tests/forward/forward.cpp index e541297208b..16bea8f27fc 100644 --- a/logd/src/tests/forward/forward.cpp +++ b/logd/src/tests/forward/forward.cpp @@ -69,12 +69,4 @@ TEST_FF("require that forwarder does not forward if not set", Forwarder(m), Forw f2.verifyForward(false); } -TEST("test that non-dotted logctlname is correctly parsed") { - EXPECT_EQUAL("", Component("a.b.c", "x").getLogCtlName()); -} - -TEST("test that dotted logctlname is correctly parsed") { - EXPECT_EQUAL(".y", Component("a.b.c", "x.y").getLogCtlName()); -} - TEST_MAIN() { TEST_RUN_ALL(); } |