Jelajahi Sumber

HPCC-19760 Add index part crc to remote read request

Signed-off-by: Jake Smith <jake.smith@lexisnexisrisk.com>
Jake Smith 7 tahun lalu
induk
melakukan
e528974315

+ 11 - 8
common/remote/sockfile.cpp

@@ -2054,10 +2054,11 @@ class CRemoteFilteredKeyIO : public CRemoteFilteredFileIOBase
 public:
     // Really a stream, but life (maybe) easier elsewhere if looks like a file
     // Sometime should refactor to be based on ISerialStream instead - or maybe IRowStream.
-    CRemoteFilteredKeyIO(SocketEndpoint &ep, const char *filename, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, unsigned __int64 chooseN)
+    CRemoteFilteredKeyIO(SocketEndpoint &ep, const char *filename, unsigned crc, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, unsigned __int64 chooseN)
         : CRemoteFilteredFileIOBase(ep, filename, actual, projected, fieldFilters, chooseN)
     {
         request.appendf(",\n \"kind\" : \"indexread\"");
+        request.appendf(",\n \"crc\" : \"%u\"", crc);
     }
 };
 
@@ -2066,10 +2067,11 @@ class CRemoteFilteredKeyCountIO : public CRemoteFilteredFileIOBase
 public:
     // Really a stream, but life (maybe) easier elsewhere if looks like a file
     // Sometime should refactor to be based on ISerialStream instead - or maybe IRowStream.
-    CRemoteFilteredKeyCountIO(SocketEndpoint &ep, const char *filename, IOutputMetaData *actual, const RowFilter &fieldFilters, unsigned __int64 rowLimit)
+    CRemoteFilteredKeyCountIO(SocketEndpoint &ep, const char *filename, unsigned crc, IOutputMetaData *actual, const RowFilter &fieldFilters, unsigned __int64 rowLimit)
         : CRemoteFilteredFileIOBase(ep, filename, actual, actual, fieldFilters, rowLimit)
     {
         request.appendf(",\n \"kind\" : \"indexcount\"");
+        request.appendf(",\n \"crc\" : \"%u\"", crc);
     }
 };
 
@@ -2083,16 +2085,17 @@ class CRemoteKey : public CSimpleInterfaceOf<IIndexLookup>
     bool pending = false;
     SocketEndpoint ep;
     StringAttr filename;
+    unsigned crc;
     Linked<IOutputMetaData> actual, projected;
     RowFilter fieldFilters;
 
 public:
-    CRemoteKey(SocketEndpoint &_ep, const char *_filename, IOutputMetaData *_actual, IOutputMetaData *_projected, const RowFilter &_fieldFilters, unsigned __int64 rowLimit)
-        : ep(_ep), filename(_filename), actual(_actual), projected(_projected)
+    CRemoteKey(SocketEndpoint &_ep, const char *_filename, unsigned _crc, IOutputMetaData *_actual, IOutputMetaData *_projected, const RowFilter &_fieldFilters, unsigned __int64 rowLimit)
+        : ep(_ep), filename(_filename), crc(_crc), actual(_actual), projected(_projected)
     {
         for (unsigned f=0; f<_fieldFilters.numFilterFields(); f++)
             fieldFilters.addFilter(OLINK(_fieldFilters.queryFilter(f)));
-        iRemoteFileIO.setown(new CRemoteFilteredKeyIO(ep, filename, actual, projected, fieldFilters, rowLimit));
+        iRemoteFileIO.setown(new CRemoteFilteredKeyIO(ep, filename, crc, actual, projected, fieldFilters, rowLimit));
         if (!iRemoteFileIO)
             throw MakeStringException(0, "Unable to open remote key part: '%s'", filename.get());
         strm.setown(createFileSerialStream(iRemoteFileIO));
@@ -2111,7 +2114,7 @@ public:
     }
     virtual unsigned __int64 checkCount(unsigned __int64 limit) override
     {
-        Owned<IFileIO> iFileIO = new CRemoteFilteredKeyCountIO(ep, filename, actual, fieldFilters, limit);
+        Owned<IFileIO> iFileIO = new CRemoteFilteredKeyCountIO(ep, filename, crc, actual, fieldFilters, limit);
         unsigned __int64 result;
         iFileIO->read(0, sizeof(result), &result);
         return result;
@@ -2132,11 +2135,11 @@ public:
 };
 
 
-extern IIndexLookup *createRemoteFilteredKey(SocketEndpoint &ep, const char * filename, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, unsigned __int64 chooseN)
+extern IIndexLookup *createRemoteFilteredKey(SocketEndpoint &ep, const char * filename, unsigned crc, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, unsigned __int64 chooseN)
 {
     try
     {
-        return new CRemoteKey(ep, filename, actual, projected, fieldFilters, chooseN);
+        return new CRemoteKey(ep, filename, crc, actual, projected, fieldFilters, chooseN);
     }
     catch (IException *e)
     {

+ 1 - 1
common/remote/sockfile.hpp

@@ -88,7 +88,7 @@ interface IRemoteFileIO : extends IFileIO
 extern REMOTE_API IRemoteFileIO *createRemoteFilteredFile(SocketEndpoint &ep, const char * filename, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, bool compressed, bool grouped, unsigned __int64 chooseNLimit);
 
 interface IIndexLookup;
-extern REMOTE_API IIndexLookup *createRemoteFilteredKey(SocketEndpoint &ep, const char * filename, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, unsigned __int64 chooseNLimit);
+extern REMOTE_API IIndexLookup *createRemoteFilteredKey(SocketEndpoint &ep, const char * filename, unsigned crc, IOutputMetaData *actual, IOutputMetaData *projected, const RowFilter &fieldFilters, unsigned __int64 chooseNLimit);
 
 
 // client only

+ 3 - 3
thorlcr/activities/indexread/thindexreadslave.cpp

@@ -160,6 +160,8 @@ public:
                 bool canSerializeTypeInfo = actualFormat->queryTypeInfo()->canSerialize() && projectedFormat->queryTypeInfo()->canSerialize();
                 bool usesBlobs = 0 != (helper->getFlags() & TIRusesblob);
 
+                unsigned crc=0;
+                part.getCrc(crc);
                 if (canSerializeTypeInfo && !usesBlobs && !localMerge)
                 {
                     for (unsigned copy=0; copy<part.numCopies(); copy++)
@@ -198,7 +200,7 @@ public:
                             else
                                 actualFilter.appendFilters(fieldFilters);
 
-                            Owned<IIndexLookup> indexLookup = createRemoteFilteredKey(ep, lPath, actualFormat, projectedFormat, actualFilter, remoteLimit);
+                            Owned<IIndexLookup> indexLookup = createRemoteFilteredKey(ep, lPath, crc, actualFormat, projectedFormat, actualFilter, remoteLimit);
                             if (indexLookup)
                             {
                                 try
@@ -223,8 +225,6 @@ public:
 
                 Owned<IDelayedFile> lfile = queryThor().queryFileCache().lookup(*this, logicalFilename, part);
 
-                unsigned crc=0;
-                part.getCrc(crc);
                 RemoteFilename rfn;
                 part.getFilename(0, rfn);
                 StringBuffer path;