Hi Anders Widell, My initial comment
1) cleanup required in opensaf.spec.in opensaf.spec.in:%{_pkgclcclidir}/osaf-transport-monitor opensaf.spec.in:%{_pkgclcclidir}/osaf-transport-monitor 2) update opensafd.in with osaftransportd osaf/services/infrastructure/nid/scripts/opensafd.in: killall -s KILL osaf-transport-monitor >/dev/null 2>&1 osaf/services/infrastructure/nid/scripts/opensafd.in: if [ "$cmd" != "$pkgclcclidir/osaf-dtm" ] && [ "$cmd" != "$pkgclcclidir/osaf-transport-monitor" ]; then osaf/services/infrastructure/nid/scripts/opensafd.in: killall -s KILL osaf-transport-monitor >/dev/null 2>&1 2) need to add osaftransportd added to opensaf.spec.in , and the location can be _pkglibdir -AVM On 9/21/2016 8:03 PM, Anders Widell wrote: > configure.ac > | 3 +- > osaf/services/infrastructure/dtms/Makefile.am > | 3 +- > osaf/services/infrastructure/dtms/scripts/Makefile.am > | 3 +- > osaf/services/infrastructure/dtms/scripts/osaf-transport-monitor.in > | 82 ------- > osaf/services/infrastructure/dtms/scripts/osaf-transport.in > | 22 +- > osaf/services/infrastructure/dtms/transport/Makefile.am > | 41 +++ > osaf/services/infrastructure/dtms/transport/main.cc > | 52 ++++ > osaf/services/infrastructure/dtms/transport/tests/Makefile.am > | 45 ++++ > osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.cc > | 34 +++ > osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.h > | 23 ++ > osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.cc > | 26 ++ > osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.h > | 38 +++ > osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc > | 109 ++++++++++ > osaf/services/infrastructure/dtms/transport/transport_monitor.cc > | 95 ++++++++ > osaf/services/infrastructure/dtms/transport/transport_monitor.h > | 92 ++++++++ > 15 files changed, 571 insertions(+), 97 deletions(-) > > > Convert the osaf-transport-monitor shell script into a daemon called > osaftransportd. The functionality of this new daemon is (should be) exactly > the > same as the functionality of the shell script that it replaces. > > diff --git a/configure.ac b/configure.ac > --- a/configure.ac > +++ b/configure.ac > @@ -784,10 +784,11 @@ AC_CONFIG_FILES([ > osaf/services/infrastructure/Makefile > osaf/services/infrastructure/dtms/Makefile > osaf/services/infrastructure/dtms/dtm/Makefile > + osaf/services/infrastructure/dtms/transport/Makefile > + osaf/services/infrastructure/dtms/transport/tests/Makefile > osaf/services/infrastructure/dtms/scripts/Makefile > osaf/services/infrastructure/dtms/scripts/osaf-dtm > osaf/services/infrastructure/dtms/scripts/osaf-transport > - osaf/services/infrastructure/dtms/scripts/osaf-transport-monitor > osaf/services/infrastructure/dtms/config/Makefile > osaf/services/infrastructure/dtms/include/Makefile > osaf/services/infrastructure/fm/Makefile > diff --git a/osaf/services/infrastructure/dtms/Makefile.am > b/osaf/services/infrastructure/dtms/Makefile.am > --- a/osaf/services/infrastructure/dtms/Makefile.am > +++ b/osaf/services/infrastructure/dtms/Makefile.am > @@ -18,5 +18,4 @@ include $(top_srcdir)/Makefile.common > > MAINTAINERCLEANFILES = Makefile.in > > -SUBDIRS = config dtm include scripts > - > +SUBDIRS = config dtm transport include scripts > diff --git a/osaf/services/infrastructure/dtms/scripts/Makefile.am > b/osaf/services/infrastructure/dtms/scripts/Makefile.am > --- a/osaf/services/infrastructure/dtms/scripts/Makefile.am > +++ b/osaf/services/infrastructure/dtms/scripts/Makefile.am > @@ -20,5 +20,4 @@ MAINTAINERCLEANFILES = Makefile.in > > nodist_pkgclccli_SCRIPTS = \ > $(top_builddir)/osaf/services/infrastructure/dtms/scripts/osaf-dtm \ > - > $(top_builddir)/osaf/services/infrastructure/dtms/scripts/osaf-transport \ > - > $(top_builddir)/osaf/services/infrastructure/dtms/scripts/osaf-transport-monitor > + $(top_builddir)/osaf/services/infrastructure/dtms/scripts/osaf-transport > diff --git > a/osaf/services/infrastructure/dtms/scripts/osaf-transport-monitor.in > b/osaf/services/infrastructure/dtms/scripts/osaf-transport-monitor.in > deleted file mode 100644 > --- a/osaf/services/infrastructure/dtms/scripts/osaf-transport-monitor.in > +++ /dev/null > @@ -1,82 +0,0 @@ > -#!/bin/sh > -# > -# (C) Copyright 2010 The OpenSAF Foundation > -# > -# This program is distributed in the hope that it will be useful, but > -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > -# or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > -# under the GNU Lesser General Public License Version 2.1, February 1999. > -# The complete license can be accessed from the following location: > -# http://opensource.org/licenses/lgpl-license.php > -# See the Copying file included with the OpenSAF distribution for full > -# licensing terms. > -# > -# Author(s): Oracle > -# > - > -osafdirfile=@sysconfdir@/@PACKAGE_NAME@/osafdir.conf > - > -# Source LSB functions library > -. /lib/lsb/init-functions > - > -if [ ! -r $osafdirfile ]; then > - logger -t $osafprog "can't read $osafdirfile, exiting." > - exit 6 > -else > - . $osafdirfile > - . $pkgsysconfdir/nid.conf > -fi > - > -if [ ! "$MDS_TRANSPORT" = "TIPC" ] ; then > - osafprog="osafdtmd" > - > - #Read the pid of dtmd. > - count=0 > - while true > - do > - if [ $count -eq 15 ] ; then > - logger -s -t $osafprog "dtmd failed to come up. " > - $pkglibdir/opensaf_reboot 0 > - exit 0; > - fi > - > - pidval=`cat $pkgpiddir/$osafprog.pid` > - if ! test -d /proc/$pidval ; then > - #dtmd may not have been spawned yet, wait for it. > - sleep 1 > - count=$(($count + 1)) > - else > - #found the pid > - break; > - fi > - done > -fi > - > -#start monitoring dtmd pid and rotate MDS logs > -echo "Running Permanent loop to clean MDS Logs..." > -while true > -do > - MDS_LOG_FILE=$pkglogdir/mds.log > - FILESIZE=`du -sk "$MDS_LOG_FILE" 2>/dev/null | cut -f1` > - if [ 5000 -lt 0$FILESIZE ]; then > - rm -f "$MDS_LOG_FILE.old" > - mv -f "$MDS_LOG_FILE" "$MDS_LOG_FILE.old" > - fi > - > - if [ ! "$MDS_TRANSPORT" = "TIPC" ] ; then > - count=0 > - while [ $count -le 15 ] > - do > - if ! test -d /proc/$pidval ; then > - logger -s -t $osafprog "$osafprog Process down, > Rebooting the node" > - $pkglibdir/opensaf_reboot 0 > - exit 0; > - fi > - #logger "osafdtmd PID : $pidval monitor count = $count" > - sleep 1 > - count=$(($count + 1)) > - done > - else > - sleep 15 > - fi > -done > diff --git a/osaf/services/infrastructure/dtms/scripts/osaf-transport.in > b/osaf/services/infrastructure/dtms/scripts/osaf-transport.in > --- a/osaf/services/infrastructure/dtms/scripts/osaf-transport.in > +++ b/osaf/services/infrastructure/dtms/scripts/osaf-transport.in > @@ -13,7 +13,9 @@ > ### END INIT INFO > > osafdirfile=@sysconfdir@/@PACKAGE_NAME@/osafdir.conf > - > +osafprog="osaftransportd" > +initscript=`basename $0` > + > # Source LSB functions library > . /lib/lsb/init-functions > > @@ -29,9 +31,9 @@ NIDSERV=TRANSPORT > MANAGE_TIPC=${OPENSAF_MANAGE_TIPC:="yes"} > RETVAL=0 > > -if [ ! "$MDS_TRANSPORT" = "TIPC" ] ; then > - osafprog="osafdtmd" > -fi > +binary=$pkglibdir/$osafprog > +pidfile=$pkgpiddir/$osafprog.pid > +lockfile=$lockdir/$initscript > > start() { > [ -p $NIDFIFO ] || return 1 > @@ -47,14 +49,14 @@ start() { > lsmod | grep tipc > RETVAL=$? > if [ $RETVAL -ne 0 ]; then > - logger -t osaf-transport -s "TIPC module not > loaded to OpenSAF requirements, returning..." > + logger -t $osafprog -s "TIPC module not loaded > to OpenSAF requirements, returning..." > echo "$NID_MAGIC:$NIDSERV:$DAEMON_START_FAILED" > > $NIDFIFO > return $RETVAL > else > ls $pkglocalstatedir/node_id > RETVAL=$? > if [ $RETVAL -ne 0 ]; then > - logger -t osaf-transport -s > "$pkglocalstatedir/node_id not available whic is OpenSAF requirements, > returning..." > + logger -t $osafprog -s > "$pkglocalstatedir/node_id not available whic is OpenSAF requirements, > returning..." > echo > "$NID_MAGIC:$NIDSERV:$DAEMON_START_FAILED" > $NIDFIFO > return $RETVAL > fi > @@ -64,7 +66,7 @@ start() { > RETVAL=0 > echo "$NID_MAGIC:$NIDSERV:$DAEMON_STARTED" > $NIDFIFO > > - $pkgclcclidir/osaf-transport-monitor & > + start_daemon -p $pidfile $binary $args > RETVAL=$? > if [ $RETVAL -ne 0 ]; then > echo "Unable to start running Permanent loop to clean > MDS Logs..." > @@ -76,8 +78,8 @@ start() { > if [ $RETVAL -ne 0 ]; then > echo "$NID_MAGIC:$NIDSERV:$DAEMON_START_FAILED" > > $NIDFIFO > fi > - #Fot TCP osaf-transport-monitor start will be moved to osaf-dtm > process to make this script restart on fault > - $pkgclcclidir/osaf-transport-monitor & > + #Fot TCP osaftransportd start will be moved to osaf-dtm process > to make this script restart on fault > + start_daemon -p $pidfile $binary $args > RETVAL=$? > if [ $RETVAL -ne 0 ]; then > echo "Unable to start running Permanent loop to clean > MDS Logs..." > @@ -88,7 +90,7 @@ start() { > > stop() { > if [ ! "$MDS_TRANSPORT" = "TIPC" ]; then > - killall -s KILL osaf-transport-monitor >/dev/null 2>&1 > + killproc -p $pidfile $osafprog > $pkgclcclidir/osaf-dtm stop > fi > RETVAL=$? > diff --git a/osaf/services/infrastructure/dtms/transport/Makefile.am > b/osaf/services/infrastructure/dtms/transport/Makefile.am > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/Makefile.am > @@ -0,0 +1,41 @@ > +# -*- OpenSAF -*- > +# > +# (C) Copyright 2016 The OpenSAF Foundation > +# > +# This program is distributed in the hope that it will be useful, but > +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > +# or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > +# under the GNU Lesser General Public License Version 2.1, February 1999. > +# The complete license can be accessed from the following location: > +# http://opensource.org/licenses/lgpl-license.php > +# See the Copying file included with the OpenSAF distribution for full > +# licensing terms. > +# > +# Author(s): Ericsson AB > +# > + > +include $(top_srcdir)/Makefile.common > + > +MAINTAINERCLEANFILES = Makefile.in > + > +DEFAULT_INCLUDES = > + > +SUBDIRS = tests > + > +noinst_HEADERS = \ > + transport_monitor.h > + > +osaf_execbindir = $(pkglibdir) > +osaf_execbin_PROGRAMS = osaftransportd > + > +osaftransportd_CXXFLAGS =$(AM_CXXFLAGS) > + > +osaftransportd_CPPFLAGS = \ > + $(AM_CPPFLAGS) > + > +osaftransportd_SOURCES = \ > + transport_monitor.cc \ > + main.cc > + > +osaftransportd_LDADD = \ > + $(top_builddir)/osaf/libs/core/libopensaf_core.la > diff --git a/osaf/services/infrastructure/dtms/transport/main.cc > b/osaf/services/infrastructure/dtms/transport/main.cc > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/main.cc > @@ -0,0 +1,52 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef _GNU_SOURCE > +#define _GNU_SOURCE > +#endif > +#include <unistd.h> > +#include <cstdlib> > +#include "osaf/libs/core/common/include/daemon.h" > +#include "osaf/libs/core/include/ncssysf_def.h" > +#include "osaf/services/infrastructure/dtms/transport/transport_monitor.h" > + > +constexpr static const int kDaemonStartWaitTimeInSeconds = 15; > + > +int main(int argc, char** argv) { > + opensaf_reboot_prepare(); > + daemonize(argc, argv); > + int term_fd; > + daemon_sigterm_install(&term_fd); > + TransportMonitor monitor{term_fd}; > + pid_t pid = pid_t{0}; > + if (!monitor.use_tipc()) { > + pid = monitor.WaitForDaemon("osafdtmd", kDaemonStartWaitTimeInSeconds); > + } > + const char* msg; > + if (pid != pid_t{-1}) { > + monitor.RotateMdsLogs(pid); > + msg = "osafdtmd Process down, Rebooting the node"; > + } else { > + msg = "osafdtmd failed to start"; > + } > + if (!monitor.Sleep(0)) { > + opensaf_reboot(0, nullptr, msg); > + } else { > + daemon_exit(); > + } > + return EXIT_FAILURE; > +} > diff --git a/osaf/services/infrastructure/dtms/transport/tests/Makefile.am > b/osaf/services/infrastructure/dtms/transport/tests/Makefile.am > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/tests/Makefile.am > @@ -0,0 +1,45 @@ > +# -*- OpenSAF -*- > +# > +# (C) Copyright 2016 The OpenSAF Foundation > +# > +# This program is distributed in the hope that it will be useful, but > +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > +# or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > +# under the GNU Lesser General Public License Version 2.1, February 1999. > +# The complete license can be accessed from the following location: > +# http://opensource.org/licenses/lgpl-license.php > +# See the Copying file included with the OpenSAF distribution for full > +# licensing terms. > +# > +# Author(s): Ericsson AB > +# > + > +include $(top_srcdir)/Makefile.common > + > +MAINTAINERCLEANFILES = Makefile.in > + > +DEFAULT_INCLUDES = > + > +TESTS = transport_test > + > +check_PROGRAMS = $(TESTS) > + > +transport_test_CXXFLAGS =$(AM_CXXFLAGS) > + > +transport_test_CPPFLAGS = \ > + $(AM_CPPFLAGS) \ > + -I$(GTEST_DIR)/include > + > +transport_test_LDFLAGS = \ > + -pthread -lrt \ > + $(top_builddir)/osaf/libs/core/cplusplus/base/libbase_la-getenv.o \ > + > $(top_builddir)/osaf/services/infrastructure/dtms/transport/osaftransportd-transport_monitor.o > + > +transport_test_SOURCES = \ > + transport_monitor_test.cc \ > + mock_logtrace.cc \ > + mock_osaf_poll.cc > + > +transport_test_LDADD = \ > + $(GTEST_DIR)/lib/libgtest.la \ > + $(GTEST_DIR)/lib/libgtest_main.la > diff --git > a/osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.cc > b/osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.cc > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.cc > @@ -0,0 +1,34 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#include "osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.h" > + > +void _logtrace_log(const char *file, unsigned int line, int priority, > + const char *format, ...) { > + (void) file; > + (void) line; > + (void) priority; > + (void) format; > +} > + > +void _logtrace_trace(const char *file, unsigned int line, unsigned int > category, > + const char *format, ...) { > + (void) file; > + (void) line; > + (void) category; > + (void) format; > +} > diff --git > a/osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.h > b/osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.h > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/tests/mock_logtrace.h > @@ -0,0 +1,23 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TESTS_MOCK_LOGTRACE_H_ > +#define OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TESTS_MOCK_LOGTRACE_H_ > + > +#include "osaf/libs/core/common/include/logtrace.h" > + > +#endif // OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TESTS_MOCK_LOGTRACE_H_ > diff --git > a/osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.cc > b/osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.cc > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.cc > @@ -0,0 +1,26 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#include "osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.h" > +#include <cstdint> > + > +MockOsafPoll mock_osaf_poll; > + > +int osaf_poll_one_fd(int fd, int64_t timeout) { > + ++mock_osaf_poll.invocations; > + return mock_osaf_poll.return_value; > +} > diff --git > a/osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.h > b/osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.h > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.h > @@ -0,0 +1,38 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TESTS_MOCK_OSAF_POLL_H_ > +#define OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TESTS_MOCK_OSAF_POLL_H_ > + > +#include "osaf/libs/core/common/include/osaf_poll.h" > + > +struct MockOsafPoll { > + MockOsafPoll() : > + return_value{0}, > + invocations{0} { > + } > + void reset() { > + return_value = 0; > + invocations = 0; > + } > + int return_value; > + int invocations; > +}; > + > +extern MockOsafPoll mock_osaf_poll; > + > +#endif // > OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TESTS_MOCK_OSAF_POLL_H_ > diff --git > a/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc > b/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc > new file mode 100644 > --- /dev/null > +++ > b/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc > @@ -0,0 +1,109 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef _GNU_SOURCE > +#define _GNU_SOURCE > +#endif > +#include <unistd.h> > +#include <cstdlib> > +#include <fstream> > +#include <string> > +#include "gtest/gtest.h" > +#include "osaf/services/infrastructure/dtms/transport/tests/mock_osaf_poll.h" > +#include "osaf/services/infrastructure/dtms/transport/transport_monitor.h" > + > +class TransportMonitorTest : public ::testing::Test { > + protected: > + TransportMonitorTest() : > + tmpdir_{}, > + monitor_{nullptr} { > + } > + > + virtual ~TransportMonitorTest() { > + } > + > + virtual void SetUp() { > + char tmpdir[] = "/tmp/transport_monitor_test_XXXXXX"; > + char* result = mkdtemp(tmpdir); > + ASSERT_NE(result, nullptr); > + tmpdir_ = result; > + int retval = setenv("pkgpiddir", tmpdir_.c_str(), 1); > + ASSERT_EQ(retval, 0); > + retval = setenv("pkglogdir", tmpdir_.c_str(), 1); > + ASSERT_EQ(retval, 0); > + mock_osaf_poll.reset(); > + monitor_ = new TransportMonitor(0); > + } > + > + virtual void TearDown() { > + delete monitor_; > + monitor_ = nullptr; > + std::string cmd = std::string("rm -f ") + tmpdir_ + std::string("/*"); > + int result = system(cmd.c_str()); > + ASSERT_EQ(result, 0); > + result = rmdir(tmpdir_.c_str()); > + ASSERT_EQ(result, 0); > + result = unsetenv("pkglogdir"); > + ASSERT_EQ(result, 0); > + result = unsetenv("pkgpiddir"); > + ASSERT_EQ(result, 0); > + } > + > + void CreatePidFile(const char* daemon_name, pid_t pid, bool newline) { > + std::ofstream str(tmpdir_ + std::string("/") + std::string(daemon_name) > + + std::string(".pid")); > + ASSERT_TRUE(str.good()); > + str << pid; > + ASSERT_TRUE(str.good()); > + if (newline) str << "\n"; > + ASSERT_TRUE(str.good()); > + str.close(); > + ASSERT_TRUE(str.good()); > + } > + > + std::string tmpdir_; > + TransportMonitor* monitor_; > +}; > + > +TEST_F(TransportMonitorTest, WaitForNonexistentDaemonName) { > + pid_t pid = monitor_->WaitForDaemon("name_does_not_exist", 17); > + EXPECT_EQ(pid, pid_t{-1}); > + EXPECT_EQ(mock_osaf_poll.invocations, 17); > +} > + > +TEST_F(TransportMonitorTest, WaitForNonexistentDaemonPid) { > + CreatePidFile("pid_does_not_exist", 1234567890, false); > + pid_t pid = monitor_->WaitForDaemon("pid_does_not_exist", 1); > + EXPECT_EQ(pid, pid_t{-1}); > + EXPECT_EQ(mock_osaf_poll.invocations, 1); > +} > + > +TEST_F(TransportMonitorTest, WaitForExistingPid) { > + pid_t mypid = getpid(); > + CreatePidFile("existing", mypid, false); > + pid_t pid = monitor_->WaitForDaemon("existing", 1); > + EXPECT_EQ(pid, mypid); > + EXPECT_EQ(mock_osaf_poll.invocations, 0); > +} > + > +TEST_F(TransportMonitorTest, WaitForExistingPidWithNewline) { > + pid_t mypid = getpid(); > + CreatePidFile("existing", mypid, true); > + pid_t pid = monitor_->WaitForDaemon("existing", 1); > + EXPECT_EQ(pid, mypid); > + EXPECT_EQ(mock_osaf_poll.invocations, 0); > +} > diff --git a/osaf/services/infrastructure/dtms/transport/transport_monitor.cc > b/osaf/services/infrastructure/dtms/transport/transport_monitor.cc > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/transport_monitor.cc > @@ -0,0 +1,95 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef _GNU_SOURCE > +#define _GNU_SOURCE > +#endif > +#include "osaf/services/infrastructure/dtms/transport/transport_monitor.h" > +#include <sys/stat.h> > +#include <cstdio> > +#include <fstream> > +#include "./configmake.h" > +#include "osaf/libs/core/common/include/osaf_poll.h" > +#include "osaf/libs/core/cplusplus/base/getenv.h" > + > +TransportMonitor::TransportMonitor(int term_fd) > + : term_fd_{term_fd}, > + pkgpiddir_{base::GetEnv<std::string>("pkgpiddir", PKGPIDDIR)}, > + proc_path_{"/proc/"}, > + mds_log_file_{base::GetEnv<std::string>("pkglogdir", PKGLOGDIR) > + + "/mds.log"}, > + old_mds_log_file_{mds_log_file_ + ".old"}, > + use_tipc_{base::GetEnv<std::string>("MDS_TRANSPORT", "TCP") == "TIPC"} > { > +} > + > +TransportMonitor::~TransportMonitor() { > +} > + > +pid_t TransportMonitor::WaitForDaemon(const std::string& daemon_name, > + int64_t seconds_to_wait) { > + std::string pidfile = pkgpiddir_ + "/" + daemon_name + ".pid"; > + pid_t pid = pid_t{-1}; > + for (int64_t count = 0; count != seconds_to_wait; ++count) { > + if (!(std::ifstream{pidfile} >> pid).fail() > + && IsDir(proc_path_ + std::to_string(pid))) > + break; > + pid = pid_t{-1}; > + if (Sleep(1)) > + return pid_t{-1}; > + } > + return pid; > +} > + > +bool TransportMonitor::Sleep(int64_t seconds_to_wait) { > + return osaf_poll_one_fd(term_fd_, seconds_to_wait * 1000) != 0; > +} > + > +bool TransportMonitor::IsDir(const std::string& path) { > + struct stat stat_buf; > + int stat_result = stat(path.c_str(), &stat_buf); > + return stat_result == 0 && S_ISDIR(stat_buf.st_mode) != 0; > +} > + > +void TransportMonitor::RotateMdsLogs(pid_t pid_to_watch) { > + std::string pid_path{proc_path_ + std::to_string(pid_to_watch)}; > + for (;;) { > + if (FileSize(mds_log_file_) > kMaxFileSize) { > + unlink(old_mds_log_file()); > + rename(mds_log_file(), old_mds_log_file()); > + } > + if (pid_to_watch != pid_t{0}) { > + for (int64_t i = 0; i != kLogRotationIntervalInSeconds; ++i) { > + if (!IsDir(pid_path) || Sleep(1)) > + return; > + } > + } else { > + if (Sleep(kLogRotationIntervalInSeconds)) > + return; > + } > + } > +} > + > +uint64_t TransportMonitor::FileSize(const std::string& path) { > + struct stat stat_buf; > + uint64_t file_size; > + if (stat(path.c_str(), &stat_buf) == 0 && S_ISREG(stat_buf.st_mode) != 0) { > + file_size = static_cast<uint64_t>(stat_buf.st_blocks) * 512; > + } else { > + file_size = 0; > + } > + return file_size; > +} > diff --git a/osaf/services/infrastructure/dtms/transport/transport_monitor.h > b/osaf/services/infrastructure/dtms/transport/transport_monitor.h > new file mode 100644 > --- /dev/null > +++ b/osaf/services/infrastructure/dtms/transport/transport_monitor.h > @@ -0,0 +1,92 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2016 The OpenSAF Foundation > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TRANSPORT_MONITOR_H_ > +#define OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TRANSPORT_MONITOR_H_ > + > +#include <unistd.h> > +#include <cstdint> > +#include <string> > +#include "osaf/libs/core/cplusplus/base/macros.h" > + > +// This class is responsible for monitoring the osafdtmd process and rotating > +// the MDS logs. > +class TransportMonitor { > + public: > + // @a term_fd is a file descriptor that will become readable when the > program > + // should exit because it has received the SIGTERM signal. > + explicit TransportMonitor(int term_fd); > + virtual ~TransportMonitor(); > + > + // Wait @a seconds_to_wait seconds for the OpenSAF daemon @daemon_name to > + // start. Return the process id of the daemon process, or pid_t{-1} if the > + // daemon didn't start within @a seconds_to wait or if we have received the > + // SIGTERM signal and should exit. > + pid_t WaitForDaemon(const std::string& daemon_name, int64_t > seconds_to_wait); > + > + // Run in a loop, rotating the MDS logs every kLogRotationIntervalInSeconds > + // seconds if the MDS log file size is larger than kMaxFileSize. If @a > + // pid_to_watch is non-zero, watch the process with that process id. > Return if > + // the process dies, or if we have received the SIGTERM signal and should > + // exit. > + void RotateMdsLogs(pid_t pid_to_watch); > + > + // Sleep for @a seconds_to_wait seconds, or until we have received the > SIGTERM > + // signal and should exit, whichever happens first. Return true if the > SIGTERM > + // signal has been received, and false otherwise. > + bool Sleep(int64_t seconds_to_wait); > + > + // Return true if OpenSAF has been configured to use the TIPC transport, > and > + // false if the TCP transport has been configured. > + bool use_tipc() const { > + return use_tipc_; > + } > + > + private: > + constexpr static const uint64_t kMaxFileSize = 5000 * uint64_t{1024}; > + constexpr static const int64_t kLogRotationIntervalInSeconds = 15; > + > + const char* pkgpiddir() const { > + return pkgpiddir_.c_str(); > + } > + > + const char* proc_path() const { > + return proc_path_.c_str(); > + } > + > + const char* mds_log_file() const { > + return mds_log_file_.c_str(); > + } > + > + const char* old_mds_log_file() const { > + return old_mds_log_file_.c_str(); > + } > + > + static bool IsDir(const std::string& path); > + static uint64_t FileSize(const std::string& path); > + > + int term_fd_; > + const std::string pkgpiddir_; > + const std::string proc_path_; > + const std::string mds_log_file_; > + const std::string old_mds_log_file_; > + const bool use_tipc_; > + > + DELETE_COPY_AND_MOVE_OPERATORS(TransportMonitor); > +}; > + > +#endif // OSAF_SERVICES_INFRASTRUCTURE_DTMS_TRANSPORT_TRANSPORT_MONITOR_H_ ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel