Prechádzať zdrojové kódy

Merge pull request #15905 from jakesmith/HPCC-27378-foreign-dali-problems

HPCC-27378 Fix bare-metal foreign issues (regression from HPCC-27249)

Reviewed-By: Gavin Halliday <gavin.halliday@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 3 rokov pred
rodič
commit
7dbed6557d

+ 3 - 1
dali/base/daaudit.hpp

@@ -18,7 +18,9 @@
 #ifndef DAAUDIT_HPP
 #define DAAUDIT_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/daclient.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jlib.hpp"
 #include "jexcept.hpp"

+ 3 - 1
dali/base/daclient.hpp

@@ -18,7 +18,9 @@
 #ifndef DACLIENT_HPP
 #define DACLIENT_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 72 - 28
dali/base/dacoven.cpp

@@ -15,7 +15,8 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
+#include <string>
+#include <utility>
 #include "platform.h"
 #include <time.h>
 #include "jlib.hpp"
@@ -155,6 +156,74 @@ public:
 
 };
 
+static void checkDaliVersionInfo(ICommunicator *comm, CDaliVersion &serverVersion, CDaliVersion &minClientVersion)
+{
+    CMessageBuffer mb;
+    mb.append(MCR_GET_VERSION_INFO);
+    mb.append(ClientVersion);
+    mb.append(MinServerVersion);
+    if (!comm->sendRecv(mb, RANK_RANDOM, MPTAG_DALI_COVEN_REQUEST, VERSION_REQUEST_TIMEOUT))    
+        throw makeStringException(-1, "failed retrieving version information from server, legacy server?");
+    if (!mb.length())
+        throw makeStringException(-1, "Failed to receive server information (probably communicating to legacy server)");
+    StringAttr serverVersionStr, minClientVersionStr;
+    mb.read(serverVersionStr);
+    serverVersion.set(serverVersionStr), 
+    mb.read(minClientVersionStr);
+
+    CDaliVersion clientV(ClientVersion);
+    minClientVersion.set(minClientVersionStr);
+    if (clientV.compare(minClientVersion) < 0)
+    {
+        StringBuffer s("Client version ");
+        s.append(ClientVersion).append(", server requires minimum client version ").append(minClientVersionStr);
+        throw createClientException(DCERR_version_incompatibility, s.str());
+    }
+    CDaliVersion minServerV(MinServerVersion);
+    if (serverVersion.compare(minServerV) < 0)
+    {
+        StringBuffer s("Server version ");
+        s.append(serverVersionStr).append(", client requires minimum server version ").append(MinServerVersion);
+        throw createClientException(DCERR_version_incompatibility, s.str());
+    }
+}
+
+static CTimeLimitedCache<std::string, std::pair<CDaliVersion, CDaliVersion>> *foreignDaliVersionCache = nullptr;
+MODULE_INIT(INIT_PRIORITY_STANDARD)
+{
+    foreignDaliVersionCache = new CTimeLimitedCache<std::string, std::pair<CDaliVersion, CDaliVersion>>(1000*60*5); // 5mins
+    return true;
+}
+MODULE_EXIT()
+{
+    delete foreignDaliVersionCache;
+}
+
+static CriticalSection foreignDaliVersionCacheCrit;
+void checkForeignDaliVersionInfo(const INode *foreignDali, CDaliVersion &serverVersion, CDaliVersion &minClientVersion)
+{
+    StringBuffer foreignDaliStr;
+    foreignDali->endpoint().getUrlStr(foreignDaliStr);
+
+    CriticalBlock b(foreignDaliVersionCacheCrit);
+    std::pair<CDaliVersion, CDaliVersion> result;
+    if (foreignDaliVersionCache->get(foreignDaliStr.str(), result))
+    {
+        serverVersion = result.first;
+        minClientVersion = result.second;
+    }
+    else
+    {
+        SocketEndpoint ep = foreignDali->endpoint();
+        if (ep.port==0)
+            ep.port = DALI_SERVER_PORT;
+        Owned<IGroup> grp = createIGroup(1, &ep);
+        Owned<ICommunicator> comm = createCommunicator(grp, true);
+
+        checkDaliVersionInfo(comm, serverVersion, minClientVersion);
+        foreignDaliVersionCache->add(foreignDaliStr.str(), { serverVersion, minClientVersion });
+    }
+}
 
 class CCovenBase: implements ICoven, public CInterface
 {
@@ -186,33 +255,8 @@ public:
         }
         else
         {
-            CMessageBuffer mb;
-            mb.append(MCR_GET_VERSION_INFO);
-            mb.append(ClientVersion);
-            mb.append(MinServerVersion);
-            if (!comm->sendRecv(mb, RANK_RANDOM, MPTAG_DALI_COVEN_REQUEST, VERSION_REQUEST_TIMEOUT))
-                throw MakeStringException(-1, "failed retrieving version information from server, legacy server?");
-            if (!mb.length())
-                throw MakeStringException(-1, "Failed to receive server information (probably communicating to legacy server)");
-            StringAttr serverVersion, minClientVersion;
-            mb.read(serverVersion);
-            _ServerVersion.set(serverVersion), 
-            mb.read(minClientVersion);
-
-            CDaliVersion clientV(ClientVersion), minClientV(minClientVersion);
-            if (clientV.compare(minClientV) < 0)
-            {
-                StringBuffer s("Client version ");
-                s.append(ClientVersion).append(", server requires minimum client version ").append(minClientVersion);
-                throw createClientException(DCERR_version_incompatibility, s.str());
-            }
-            CDaliVersion minServerV(MinServerVersion);
-            if (_ServerVersion.compare(minServerV) < 0)
-            {
-                StringBuffer s("Server version ");
-                s.append(serverVersion).append(", client requires minimum server version ").append(MinServerVersion);
-                throw createClientException(DCERR_version_incompatibility, s.str());
-            }
+            CDaliVersion minClientV;
+            checkDaliVersionInfo(comm, _ServerVersion, minClientV);
         }
     }
     ~CCovenBase()

+ 4 - 1
dali/base/dacoven.hpp

@@ -18,7 +18,9 @@
 #ifndef DACOVEN_HPP
 #define DACOVEN_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 
@@ -71,6 +73,7 @@ extern da_decl bool isCovenActive();
 extern da_decl const CDaliVersion &queryDaliServerVersion();
 extern da_decl bool verifyCovenConnection(unsigned timeout=5*60*1000);
 extern da_decl DALI_UID getGlobalUniqueIds(unsigned num,SocketEndpoint *_foreignnode);
+extern da_decl void checkForeignDaliVersionInfo(const INode *foreignDali, CDaliVersion &serverVersion, CDaliVersion &minClientVersion);
 
 
 #endif

+ 0 - 1
dali/base/dacsds.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include <typeinfo>
 #include "jlib.hpp"

+ 15 - 3
dali/base/dadfs.cpp

@@ -16,7 +16,6 @@
 ############################################################################## */
 
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jlib.hpp"
 #include "jfile.hpp"
@@ -10840,9 +10839,12 @@ public:
                 Owned<IPropertyTree> tree = getNamedPropTree(sroot,queryDfsXmlBranchName(DXB_File),"@name",tail.str(),false);
                 if (tree)
                 {
-                    //NB: for new clients, only clients specifically asking for remap
+#ifdef _CONTAINERIZED
+                    // This is for bare-metal clients using ~foreign pointing at a containerized/k8s setup,
+                    // asking for the returned meta data to be remapped to point to the dafilesrv service.
                     if (hasMask(opts, GetFileTreeOpts::remapToService))
                         remapGroupsToDafilesrv(tree, &queryNamedGroupStore());
+#endif
 
                     Owned<IFileDescriptor> fdesc = deserializeFileDescriptorTree(tree,&queryNamedGroupStore(),IFDSF_EXCLUDE_CLUSTERNAMES);
                     mb.append((int)1); // 1 == standard file
@@ -11288,7 +11290,6 @@ IPropertyTree *CDistributedFileDirectory::getFileTree(const char *lname, IUserDe
     bool expandnodes = hasMask(opts, GetFileTreeOpts::expandNodes);
     bool appendForeign = hasMask(opts, GetFileTreeOpts::appendForeign);
 
-    bool getFileTree2Support = queryDaliServerVersion().compare("3.17") >= 0;
     // this accepts either a foreign dali node or a foreign lfn
     Owned<INode> fnode;
     CDfsLogicalFileName dlfn;
@@ -11304,6 +11305,17 @@ IPropertyTree *CDistributedFileDirectory::getFileTree(const char *lname, IUserDe
     }
     if (isLocalDali(foreigndali))
         foreigndali = NULL;
+
+    bool getFileTree2Support;
+    if (!foreigndali)
+        getFileTree2Support = queryDaliServerVersion().compare("3.17") >= 0;
+    else
+    {
+        CDaliVersion serverVersion, minClientVersion;
+        checkForeignDaliVersionInfo(foreigndali, serverVersion, minClientVersion);
+        getFileTree2Support = serverVersion.compare("3.17") >= 0;
+    }
+
     CMessageBuffer mb;
 
     if (getFileTree2Support)

+ 3 - 1
dali/base/dadfs.hpp

@@ -26,7 +26,9 @@
 #ifndef DADFS_HPP
 #define DADFS_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/dadiags.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jlib.hpp"
 #include "dacoven.hpp"

+ 3 - 1
dali/base/dadiags.hpp

@@ -18,7 +18,9 @@
 #ifndef DADIAGS_HPP
 #define DADIAGS_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/dafdesc.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "portlist.h"
 #include "jlib.hpp"

+ 3 - 1
dali/base/dafdesc.hpp

@@ -18,7 +18,9 @@
 #ifndef DAFDESC_HPP
 #define DAFDESC_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/dalock.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jlib.hpp"
 #include "jsuperhash.hpp"

+ 3 - 1
dali/base/dalock.hpp

@@ -18,7 +18,9 @@
 #ifndef DALOCK_HPP
 #define DALOCK_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/danqs.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jlib.hpp"
 #include "jsuperhash.hpp"

+ 3 - 1
dali/base/danqs.hpp

@@ -18,7 +18,9 @@
 #ifndef DANQS_HPP
 #define DANQS_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/dasds.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jhash.hpp"
 #include "jlib.hpp"

+ 0 - 2
dali/base/dasess.cpp

@@ -15,8 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
-
 #include <string>
 #include <unordered_map>
 

+ 3 - 1
dali/base/dasess.hpp

@@ -18,7 +18,9 @@
 #ifndef DASESS_HPP
 #define DASESS_HPP
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 1
dali/base/dasubs.cpp

@@ -15,7 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
 #include "platform.h"
 #include "jlib.hpp"
 #include "jmisc.hpp"

+ 3 - 1
dali/base/dasubs.hpp

@@ -20,7 +20,9 @@
 
 #include "dasess.hpp"
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 0 - 2
dali/base/dautils.cpp

@@ -15,8 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-#define da_decl DECL_EXPORT
-
 #include "platform.h"
 #include "jlib.hpp"
 #include "jstring.hpp"

+ 3 - 1
dali/base/dautils.hpp

@@ -27,7 +27,9 @@
 #include "mpbase.hpp"
 #include "dasess.hpp"
 
-#ifndef da_decl
+#ifdef DALI_EXPORTS
+#define da_decl DECL_EXPORT
+#else
 #define da_decl DECL_IMPORT
 #endif
 

+ 1 - 1
system/jlib/jhash.hpp

@@ -620,7 +620,7 @@ public:
  */
 
 template <class KEYTYPE, class VALUETYPE>
-class jlib_decl CTimeLimitedCache
+class CTimeLimitedCache
 {
 public:
     CTimeLimitedCache<KEYTYPE, VALUETYPE>(unsigned timeoutMs=defaultCacheTimeoutMs)