Hi,
The FIFO is created for each daemon (reading and non blocking), perhaps it 
should be created for osafdtmd only, or?
/Thanks HansN

-----Original Message-----
From: Hans Nordeback [mailto:hans.nordeb...@ericsson.com] 
Sent: den 22 oktober 2016 14:54
To: Anders Widell <anders.wid...@ericsson.com>; mahesh.va...@oracle.com; 
ramesh.bet...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: [devel] [PATCH 3 of 3] dtm: Use inotify to improve response time for 
transport monitor process V3 [#2091]

 osaf/libs/core/common/daemon.c                                              |  
26 ++++
 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            |  
59 +++++++--
 osaf/services/infrastructure/dtms/transport/transport_monitor.h             |  
 2 +
 5 files changed, 77 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 __fifofile[NAME_MAX];
 static char __pidfile[NAME_MAX];
 static char __tracefile[NAME_MAX];
 static char __runas_username[UT_NAMESIZE]; @@ -118,6 +119,28 @@ static int 
__create_pidfile(const char* 
        return rc;
 }
 
+static void __create_fifofile(const char* fifofile) {
+       mode_t mask;
+
+       /* Lets remove any such file if it already exists */
+       unlink(fifofile);
+       mask = umask(0);
+
+       if (mkfifo(fifofile, 0666) == -1) {
+               syslog(LOG_WARNING, "mkfifo failed: %s %s", fifofile, 
strerror(errno));
+               umask(mask);
+               return;
+       }
+
+       if (open(fifofile, O_NONBLOCK|O_RDONLY) == -1) {
+               syslog(LOG_WARNING, "open fifo failed: %s %s", fifofile, 
strerror(errno));
+       }
+
+       umask(mask);
+       return;
+}
+
 static int level2mask(const char *level)  {
        if (strncmp("notice", level, 6) == 0) { @@ -133,6 +156,7 @@ static int 
level2mask(const char *level)  static void __set_default_options(const char 
*progname)  {
        /* Set the default option values */
+       snprintf(__fifofile, sizeof(__fifofile), PKGLOCALSTATEDIR "/%s.fifo", 
+progname);
        snprintf(__pidfile, sizeof(__pidfile), PKGPIDDIR "/%s.pid", progname);
        snprintf(__tracefile, sizeof(__tracefile), PKGLOGDIR "/%s", progname);
        if (strlen(__runas_username) == 0) {
@@ -320,6 +344,8 @@ void daemonize(int argc, char *argv[])
        if (__create_pidfile(__pidfile) != 0)
                exit(EXIT_FAILURE);
 
+       __create_fifofile(__fifofile);
+
        /* Cancel certain signals */
        signal(SIGCHLD, SIG_DFL);       /* A child process dies */
        signal(SIGTSTP, SIG_IGN);       /* Various TTY signals */
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_monito
+++ r_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,18 @@
 #endif
 #include "osaf/services/infrastructure/dtms/transport/transport_monitor.h"
 #include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/stat.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 +48,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, seconds_to_wait * kMillisPerSec,
+                                      user_fds);
+
+  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 +77,39 @@ 
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 ((fifo_fd = open(fifo_file_.c_str(), O_WRONLY|O_NONBLOCK)) == -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,
+              kLogRotationIntervalInSeconds * kMillisPerSec,
+              user_fds);
+      if (rc != base::FileNotify::FileNotifyErrors::kTimeOut) {
+        close(fifo_fd);
+        return;
+      } else {
+        TRACE("Timeout received, continuing...");
       }
     } else {
-      if (Sleep(kLogRotationIntervalInSeconds))
+      if (Sleep(kLogRotationIntervalInSeconds)) {
+        close(fifo_fd);
         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_;

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to