Ok Thanks , ACK from me.
-AVM
On 11/7/2016 8:00 PM, Hans Nordeback wrote:
>
> Hi Mahesh,
>
> one more comment below/Thanks HansN
>
>
> On 11/07/2016 08:16 AM, A V Mahesh wrote:
>> Hi Hans N,
>>
>> ACK with following minor comments .
>>
>> -AVM
>>
>>
>> On 10/27/2016 8:55 PM, Hans Nordeback wrote:
>>> osaf/libs/core/common/daemon.c | 38 ++++++
>>> osaf/services/infrastructure/dtms/transport/tests/Makefile.am | 3 +-
>>> osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc
>>> | 4 +-
>>> osaf/services/infrastructure/dtms/transport/transport_monitor.cc |
>>> 62 +++++++--
>>> osaf/services/infrastructure/dtms/transport/transport_monitor.h | 2 +
>>> 5 files changed, 92 insertions(+), 17 deletions(-)
>>>
>>>
>>> diff --git a/osaf/libs/core/common/daemon.c
>>> b/osaf/libs/core/common/daemon.c
>>> --- a/osaf/libs/core/common/daemon.c
>>> +++ b/osaf/libs/core/common/daemon.c
>>> @@ -56,6 +56,7 @@ static const char* internal_version_id_;
>>> extern void __gcov_flush(void) __attribute__((weak));
>>> +static char fifo_file[NAME_MAX];
>> [AVM] can we change the _POSIX_NAME_MAX instead of NAME_MAX
>> including existing
> [HansN] NAME_MAX is specified in LSB 5 and is 255 _POSIX_NAME_MAX is
> 14, I suggest that we keep NAME_MAX
>>
>>> static char __pidfile[NAME_MAX];
>>> static char __tracefile[NAME_MAX];
>>> static char __runas_username[UT_NAMESIZE];
>>> @@ -118,6 +119,37 @@ static int __create_pidfile(const char*
>>> return rc;
>>> }
>>> +static void create_fifofile(const char* fifofile)
>>> +{
>>> + mode_t mask;
>>> +
>>> + mask = umask(0);
>>> +
>>> + if (mkfifo(fifofile, 0666) == -1) {
>>> + if (errno == EEXIST ) {
>>> + syslog(LOG_INFO, "mkfifo already exists: %s %s",
>>> fifofile, strerror(errno));
>>> + } else {
>>> + syslog(LOG_WARNING, "mkfifo failed: %s %s", fifofile,
>>> strerror(errno));
>>> + umask(mask);
>>> + return;
>>> + }
>>> + }
>>> +
>>> + int fd = -1;
>>> +
>>> + do {
>>> + fd = open(fifofile, O_NONBLOCK|O_RDONLY);
>>> +
>>> + } while (fd == -1 && errno == EINTR);
>>> +
>>> + if (fd == -1) {
>>> + syslog(LOG_WARNING, "open fifo failed: %s %s", fifofile,
>>> strerror(errno));
>>> + }
>>> +
>>> + umask(mask);
>>> + return;
>>> +}
>> [AVM] can we optimize the mkfifo & open in to single `open` with
>> option `a` (Open the file for writing only. If the file does not
>> exist, create a new empty file)
>>
>>
>>> +
>>> static int level2mask(const char *level)
>>> {
>>> if (strncmp("notice", level, 6) == 0) {
>>> @@ -133,6 +165,7 @@ static int level2mask(const char *level)
>>> static void __set_default_options(const char *progname)
>>> {
>>> /* Set the default option values */
>>> + snprintf(fifo_file, sizeof(fifo_file), PKGLOCALSTATEDIR
>>> "/%s.fifo", progname);
>>> snprintf(__pidfile, sizeof(__pidfile), PKGPIDDIR "/%s.pid",
>>> progname);
>>> snprintf(__tracefile, sizeof(__tracefile), PKGLOGDIR "/%s",
>>> progname);
>>> if (strlen(__runas_username) == 0) {
>>> @@ -316,6 +349,8 @@ void daemonize(int argc, char *argv[])
>>> exit(EXIT_FAILURE);
>>> }
>>> + create_fifofile(fifo_file);
>>> +
>>> /* Create the process PID file */
>>> if (__create_pidfile(__pidfile) != 0)
>>> exit(EXIT_FAILURE);
>>> @@ -425,6 +460,9 @@ void daemon_exit(void)
>>> {
>>> syslog(LOG_NOTICE, "exiting for shutdown");
>>> + /* Lets remove any such file if it already exists */
>>> + unlink(fifo_file);
>>> +
>>> if (__gcov_flush) {
>>> __gcov_flush();
>>> }
>>> diff --git
>>> a/osaf/services/infrastructure/dtms/transport/tests/Makefile.am
>>> b/osaf/services/infrastructure/dtms/transport/tests/Makefile.am
>>> --- a/osaf/services/infrastructure/dtms/transport/tests/Makefile.am
>>> +++ b/osaf/services/infrastructure/dtms/transport/tests/Makefile.am
>>> @@ -42,4 +42,5 @@ transport_test_SOURCES = \
>>> transport_test_LDADD = \
>>> $(GTEST_DIR)/lib/libgtest.la \
>>> - $(GTEST_DIR)/lib/libgtest_main.la
>>> + $(GTEST_DIR)/lib/libgtest_main.la \
>>> + $(top_builddir)/osaf/libs/core/libopensaf_core.la
>>> diff --git
>>> a/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc
>>>
>>> b/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc
>>>
>>>
>>> ---
>>> a/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc
>>> +++
>>> b/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc
>>> @@ -82,14 +82,14 @@ class TransportMonitorTest : public ::te
>>> 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);
>>> + EXPECT_EQ(mock_osaf_poll.invocations, 0);
>>> }
>>> 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);
>>> + EXPECT_EQ(mock_osaf_poll.invocations, 0);
>>> }
>>> TEST_F(TransportMonitorTest, WaitForExistingPid) {
>>> diff --git
>>> a/osaf/services/infrastructure/dtms/transport/transport_monitor.cc
>>> b/osaf/services/infrastructure/dtms/transport/transport_monitor.cc
>>> --- a/osaf/services/infrastructure/dtms/transport/transport_monitor.cc
>>> +++ b/osaf/services/infrastructure/dtms/transport/transport_monitor.cc
>>> @@ -20,11 +20,17 @@
>>> #endif
>>> #include
>>> "osaf/services/infrastructure/dtms/transport/transport_monitor.h"
>>> #include <sys/stat.h>
>>> +#include <sys/types.h>
>>> +#include <fcntl.h>
>>> #include <cstdio>
>>> #include <fstream>
>>> -#include "./configmake.h"
>>> +#include <vector>
>>> +#include "logtrace.h"
>>> +#include "osaf_time.h"
>>> #include "osaf/libs/core/common/include/osaf_poll.h"
>>> #include "osaf/libs/core/cplusplus/base/getenv.h"
>>> +#include "osaf/libs/core/cplusplus/base/file_notify.h"
>>> +
>>> TransportMonitor::TransportMonitor(int term_fd)
>>> : term_fd_{term_fd},
>>> @@ -41,21 +47,26 @@ TransportMonitor::~TransportMonitor() {
>>> pid_t TransportMonitor::WaitForDaemon(const std::string&
>>> daemon_name,
>>> int64_t seconds_to_wait) {
>>> + std::vector<int> user_fds {term_fd_};
>>> 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};
>>> + base::FileNotify file_notify;
>>> + base::FileNotify::FileNotifyErrors rc =
>>> + file_notify.WaitForFileCreation(pidfile, user_fds,
>>> + seconds_to_wait *
>>> kMillisPerSec);
>>> +
>>> + if (rc == base::FileNotify::FileNotifyErrors::kOK) {
>>> + if (!(std::ifstream{pidfile} >> pid).fail()) {
>>> + if (IsDir(proc_path_ + std::to_string(pid))) {
>>> + return pid;
>>> + }
>>> + }
>>> }
>>> - return pid;
>>> + return pid_t{-1};
>>> }
>>> bool TransportMonitor::Sleep(int64_t seconds_to_wait) {
>>> - return osaf_poll_one_fd(term_fd_, seconds_to_wait * 1000) != 0;
>>> + return osaf_poll_one_fd(term_fd_, seconds_to_wait *
>>> kMillisPerSec) != 0;
>>> }
>>> bool TransportMonitor::IsDir(const std::string& path) {
>>> @@ -65,20 +76,43 @@ bool TransportMonitor::IsDir(const std::
>>> }
>>> void TransportMonitor::RotateMdsLogs(pid_t pid_to_watch) {
>>> + int fifo_fd{-1};
>>> + std::vector<int> user_fds {term_fd_};
>>> + base::FileNotify file_notify;
>>> std::string pid_path{proc_path_ + std::to_string(pid_to_watch)};
>>> +
>>> + if (pid_to_watch != pid_t{0}) {
>>> + do {
>>> + fifo_fd = open(fifo_file_.c_str(), O_WRONLY|O_NONBLOCK);
>>> + } while (fifo_fd == -1 && errno == EINTR);
>>> +
>>> + if (fifo_fd == -1) {
>>> + LOG_WA("open fifo file failed");
>>> + } else {
>>> + user_fds.emplace_back(fifo_fd);
>>> + }
>>> + }
>>> +
>>> 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;
>>> + base::FileNotify::FileNotifyErrors rc =
>>> + file_notify.WaitForFileDeletion(
>>> + pid_path,
>>> + user_fds, kLogRotationIntervalInSeconds *
>>> kMillisPerSec);
>>> + if (rc != base::FileNotify::FileNotifyErrors::kTimeOut) {
>>> + close(fifo_fd);
>>> + return;
>>> + } else {
>>> + TRACE("Timeout received, continuing...");
>>> }
>>> } else {
>>> - if (Sleep(kLogRotationIntervalInSeconds))
>>> + if (Sleep(kLogRotationIntervalInSeconds)) {
>>> return;
>>> + }
>>> }
>>> }
>>> }
>>> diff --git
>>> a/osaf/services/infrastructure/dtms/transport/transport_monitor.h
>>> b/osaf/services/infrastructure/dtms/transport/transport_monitor.h
>>> --- a/osaf/services/infrastructure/dtms/transport/transport_monitor.h
>>> +++ b/osaf/services/infrastructure/dtms/transport/transport_monitor.h
>>> @@ -21,6 +21,7 @@
>>> #include <unistd.h>
>>> #include <cstdint>
>>> #include <string>
>>> +#include "./configmake.h"
>>> #include "osaf/libs/core/cplusplus/base/macros.h"
>>> // This class is responsible for monitoring the osafdtmd process
>>> and rotating
>>> @@ -80,6 +81,7 @@ class TransportMonitor {
>>> static uint64_t FileSize(const std::string& path);
>>> int term_fd_;
>>> + const std::string fifo_file_ {PKGLOCALSTATEDIR "/osafdtmd.fifo"};
>>> const std::string pkgpiddir_;
>>> const std::string proc_path_;
>>> const std::string mds_log_file_;
>>
>
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel