From 05fd4aa756acd99f36b0f2dbe3e0058bffefe506 Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Fri, 16 Mar 2012 15:53:48 +0000
Subject: [PATCH] Task #2669: Sync NFS before unlinking the nfsKey as well.

---
 LCS/Stream/include/Stream/SocketStream.h |  2 ++
 LCS/Stream/src/SocketStream.cc           | 28 +++++++++++++++---------
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/LCS/Stream/include/Stream/SocketStream.h b/LCS/Stream/include/Stream/SocketStream.h
index 1f77cf751c2..238be586b30 100644
--- a/LCS/Stream/include/Stream/SocketStream.h
+++ b/LCS/Stream/include/Stream/SocketStream.h
@@ -64,6 +64,8 @@ class SocketStream : public FileDescriptorBasedStream
 
     void accept(time_t timeout);
 
+    static void syncNFS();
+
     static std::string readkey(const string &nfskey, time_t &timeout);
     static void writekey(const string &nfskey, uint16 port);
     static void deletekey(const string &nfskey);
diff --git a/LCS/Stream/src/SocketStream.cc b/LCS/Stream/src/SocketStream.cc
index d69c98c5b4c..d920a5d754d 100644
--- a/LCS/Stream/src/SocketStream.cc
+++ b/LCS/Stream/src/SocketStream.cc
@@ -261,24 +261,30 @@ void SocketStream::setReadBufferSize(size_t size)
 }
 
 
-std::string SocketStream::readkey(const std::string &nfskey, time_t &timeout)
+void SocketStream::syncNFS()
 {
-  for(;;) {
-    // sync NFS
-    DIR *dir = opendir(".");
+  // sync NFS
+  DIR *dir = opendir(".");
 
-    if (!dir)
-      throw SystemCallException("opendir", errno, THROW_ARGS);
+  if (!dir)
+    throw SystemCallException("opendir", errno, THROW_ARGS);
 
-    if (!readdir(dir))
-      throw SystemCallException("readdir", errno, THROW_ARGS);
+  if (!readdir(dir))
+    throw SystemCallException("readdir", errno, THROW_ARGS);
 
-    if (closedir(dir) != 0)
-      throw SystemCallException("closedir", errno, THROW_ARGS);
+  if (closedir(dir) != 0)
+    throw SystemCallException("closedir", errno, THROW_ARGS);
+}
 
+
+std::string SocketStream::readkey(const std::string &nfskey, time_t &timeout)
+{
+  for(;;) {
     char portStr[16];
     ssize_t len;
 
+    syncNFS();
+
     len = readlink(nfskey.c_str(), portStr, sizeof portStr - 1); // reserve 1 character to insert \0 below
 
     if (len >= 0) {
@@ -313,6 +319,8 @@ void SocketStream::writekey(const std::string &nfskey, uint16 port)
 
 void SocketStream::deletekey(const std::string &nfskey)
 {
+  syncNFS();
+
   if (unlink(nfskey.c_str()) < 0)
     throw SystemCallException("unlink", errno, THROW_ARGS);
 }
-- 
GitLab