diff --git a/LCS/Stream/include/Stream/SocketStream.h b/LCS/Stream/include/Stream/SocketStream.h index 221647558a0191b61c5ae4b192144752efb52342..4cdf821a9b7901ea8548d7d865e227f5a6ebad6e 100644 --- a/LCS/Stream/include/Stream/SocketStream.h +++ b/LCS/Stream/include/Stream/SocketStream.h @@ -46,7 +46,7 @@ class SocketStream : public FileDescriptorBasedStream }; SocketStream(const std::string &hostname, uint16 _port, Protocol, Mode, - time_t deadline = 0, const std::string &nfskey = "", bool doAccept = true); + time_t deadline = 0, bool doAccept = true); virtual ~SocketStream(); FileDescriptorBasedStream *detach(); @@ -73,16 +73,9 @@ class SocketStream : public FileDescriptorBasedStream private: const std::string hostname; uint16 port; - const std::string nfskey; int listen_sk; void accept(time_t timeout); - - static void syncNFS(); - - static std::string readkey(const std::string &nfskey, time_t deadline); - static void writekey(const std::string &nfskey, uint16 port); - static void deletekey(const std::string &nfskey); }; EXCEPTION_CLASS(TimeOutException, LOFAR::Exception); diff --git a/LCS/Stream/src/PortBroker.cc b/LCS/Stream/src/PortBroker.cc index 9b592a6cd2ab6162b2c8025a3a52e55bf4dd2091..fb07012c961d98267e0fdd410494e71f03992c89 100644 --- a/LCS/Stream/src/PortBroker.cc +++ b/LCS/Stream/src/PortBroker.cc @@ -62,7 +62,7 @@ PortBroker &PortBroker::instance() PortBroker::PortBroker( uint16 port ) : - SocketStream( "0.0.0.0", port, TCP, Server, 0, "", false ), + SocketStream( "0.0.0.0", port, TCP, Server, 0, false ), itsDone(false) { } diff --git a/LCS/Stream/src/SocketStream.cc b/LCS/Stream/src/SocketStream.cc index 00c1911b3a8dce5e50c9dbe3da0a0e1de7021add..7a0325e5cb56d9fae5595b30e16d10a15aa7f1d5 100644 --- a/LCS/Stream/src/SocketStream.cc +++ b/LCS/Stream/src/SocketStream.cc @@ -74,13 +74,12 @@ namespace { }; SocketStream::SocketStream(const std::string &hostname, uint16 _port, Protocol protocol, - Mode mode, time_t deadline, const std::string &nfskey, bool doAccept) + Mode mode, time_t deadline, bool doAccept) : protocol(protocol), mode(mode), hostname(hostname), port(_port), - nfskey(nfskey), listen_sk(-1) { const std::string description = str(boost::format("%s:%s:%s") @@ -116,9 +115,6 @@ SocketStream::SocketStream(const std::string &hostname, uint16 _port, Protocol p int retval; struct addrinfo *result; - if (mode == Client && nfskey != "") - port = boost::lexical_cast<uint16>(readkey(nfskey, deadline)); - if (mode == Server && autoPort) port = MINPORT + static_cast<unsigned short>((MAXPORT - MINPORT) * erand48(randomState.xsubi)); // erand48() not thread safe, but not a problem. @@ -252,27 +248,6 @@ void SocketStream::reaccept(time_t deadline) void SocketStream::accept(time_t deadline) { - if (nfskey != "") - writekey(nfskey, port); - - // make sure the key will be deleted - struct D { - ~D() { - if (nfskey != "") { - ScopedDelayCancellation dc; // unlink is a cancellation point - - try { - deletekey(nfskey); - } catch (Exception &ex) { - LOG_ERROR_STR("Exception in destructor: " << ex); - } - } - } - - const std::string nfskey; - } onDestruct = { nfskey }; - (void)onDestruct; - if (deadline > 0) { fd_set fds; @@ -308,72 +283,6 @@ void SocketStream::setReadBufferSize(size_t size) } -void SocketStream::syncNFS() -{ - // sync NFS - DIR *dir = opendir("."); - - if (!dir) - THROW_SYSCALL("opendir"); - - struct dirent entry; - struct dirent *result; - if (readdir_r(dir, &entry, &result) != 0 || !result) - THROW_SYSCALL("readdir_r"); - - if (closedir(dir) != 0) - THROW_SYSCALL("closedir"); -} - - -std::string SocketStream::readkey(const std::string &nfskey, time_t deadline) -{ - 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) { - portStr[len] = 0; - return std::string(portStr); - } - - if (deadline > 0 && deadline <= time(0)) - THROW(TimeOutException, "client socket"); - - if (usleep(999999) < 0) { // near 1 sec; max portably safe arg val - // interrupted by a signal handler -- abort to allow this thread to - // be forced to continue after receiving a SIGINT, as with any other - // system call - THROW_SYSCALL("usleep"); - } - } -} - -void SocketStream::writekey(const std::string &nfskey, uint16 port) -{ - char portStr[16]; - - snprintf(portStr, sizeof portStr, "%hu", port); - - // Symlinks can be atomically created over NFS - if (symlink(portStr, nfskey.c_str()) < 0) - THROW_SYSCALL("symlink"); -} - - -void SocketStream::deletekey(const std::string &nfskey) -{ - syncNFS(); - - if (unlink(nfskey.c_str()) < 0) - THROW_SYSCALL("unlink"); -} - - void SocketStream::setTimeout(double timeout) { ASSERT(timeout >= 0.0); diff --git a/LCS/Stream/src/StreamFactory.cc b/LCS/Stream/src/StreamFactory.cc index e5a3b71765e40bdd2932dc6deb1a92c513299029..25bdeb364c34225bb290f10e97a03862469c3eb9 100644 --- a/LCS/Stream/src/StreamFactory.cc +++ b/LCS/Stream/src/StreamFactory.cc @@ -49,12 +49,8 @@ namespace LOFAR return new SocketStream(split[1].c_str(), boost::lexical_cast<unsigned short>(split[2]), SocketStream::UDP, asServer ? SocketStream::Server : SocketStream::Client, deadline); else if (split.size() == 3 && split[0] == "tcp") return new SocketStream(split[1].c_str(), boost::lexical_cast<unsigned short>(split[2]), SocketStream::TCP, asServer ? SocketStream::Server : SocketStream::Client, deadline); - else if (split.size() == 3 && split[0] == "udpkey") - return new SocketStream(split[1].c_str(), 0, SocketStream::UDP, asServer ? SocketStream::Server : SocketStream::Client, deadline, split[2].c_str()); else if (split.size() == 4 && split[0] == "tcpbroker") return asServer ? static_cast<Stream*>(new PortBroker::ServerStream(split[3])) : static_cast<Stream*>(new PortBroker::ClientStream(split[1], boost::lexical_cast<unsigned short>(split[2]), split[3])); - else if (split.size() == 3 && split[0] == "tcpkey") - return new SocketStream(split[1].c_str(), 0, SocketStream::TCP, asServer ? SocketStream::Server : SocketStream::Client, deadline, split[2].c_str()); else if (split.size() > 1 && split[0] == "file") { // don't use split[1] to allow : in filenames const std::string filename = descriptor.substr(5);