Przeglądaj źródła

Merge pull request #14017 from richardkchapman/cassandra-cloud

HPCC-24494 Cassandra plugin fails in debug builds

Reviewed-by: Gavin Halliday <ghalliday@hpccsystems.com>
Merged-by: Gavin Halliday <ghalliday@hpccsystems.com>
Gavin Halliday 4 lat temu
rodzic
commit
f49116abd4

+ 3 - 0
plugins/cassandra/CMakeLists.txt

@@ -70,6 +70,9 @@ if(USE_CASSANDRA)
       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy")
     endif ()
   endif()
+  if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
+    remove_definitions (-fsanitize=undefined -fno-sanitize=alignment -fsanitize-trap=undefined)
+  endif()
   set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cpp-driver/cmake/modules/")
   set(CASS_ROOT_DIR "${PROJECT_SOURCE_DIR}/cpp-driver")
   add_subdirectory(cpp-driver ${PROJECT_BINARY_DIR}/cassandra)

+ 9 - 9
plugins/cassandra/cassandraembed.cpp

@@ -349,7 +349,7 @@ CassandraPrepared *CassandraClusterSession::prepareStatement(const char *query,
     preparedCache.setValue(query, cached); // NOTE - this links parameter
     return cached.getClear();
 }
-CassandraStatementInfo *CassandraClusterSession::createStatementInfo(const char *script, unsigned numParams, CassBatchType batchMode, unsigned pageSize) const
+CassandraStatementInfo *CassandraClusterSession::createStatementInfo(const char *script, unsigned numParams, OptionalCassBatchType batchMode, unsigned pageSize) const
 {
     Owned<CassandraPrepared> prepared = prepareStatement(script, false); // We could make tracing selectable
     return new CassandraStatementInfo(session, prepared, numParams, batchMode, pageSize, semaphore, maxRetries);
@@ -499,7 +499,7 @@ void CassandraRetryingFuture::signaller(CassFuture *future, void *data)
 
 //----------------------
 
-CassandraStatementInfo::CassandraStatementInfo(CassandraSession *_session, CassandraPrepared *_prepared, unsigned _numBindings, CassBatchType _batchMode, unsigned pageSize, Semaphore *_semaphore, unsigned _maxRetries)
+CassandraStatementInfo::CassandraStatementInfo(CassandraSession *_session, CassandraPrepared *_prepared, unsigned _numBindings, OptionalCassBatchType _batchMode, unsigned pageSize, Semaphore *_semaphore, unsigned _maxRetries)
     : session(_session), prepared(_prepared), numBindings(_numBindings), batchMode(_batchMode), semaphore(_semaphore), maxRetries(_maxRetries)
 {
     assertex(prepared && *prepared);
@@ -545,8 +545,8 @@ bool CassandraStatementInfo::next()
 }
 void CassandraStatementInfo::startStream()
 {
-    if (batchMode != (CassBatchType) -1)
-        batch.setown(new CassandraBatch(batchMode));
+    if (batchMode != OptionalCassBatchType::nobatch)
+        batch.setown(new CassandraBatch((CassBatchType) batchMode));
     statement.setown(new CassandraStatement(cass_prepared_bind(*prepared)));
     inBatch = true;
 }
@@ -1320,7 +1320,7 @@ class CassandraEmbedFunctionContext : public CInterfaceOf<IEmbedFunctionContext>
 {
 public:
     CassandraEmbedFunctionContext(const IContextLogger &_logctx, const IThorActivityContext *_activityCtx, unsigned _flags, const char *options)
-      : logctx(_logctx), activityCtx(_activityCtx), flags(_flags), nextParam(0), numParams(0), batchMode((CassBatchType) -1), pageSize(0)
+      : logctx(_logctx), activityCtx(_activityCtx), flags(_flags), nextParam(0), numParams(0), batchMode(OptionalCassBatchType::nobatch), pageSize(0)
     {
         StringArray opts;
         opts.appendList(options, ",");
@@ -1332,11 +1332,11 @@ public:
             {
                 const char *val=opt+6;
                 if (stricmp(val, "LOGGED")==0)
-                    batchMode = CASS_BATCH_TYPE_LOGGED;
+                    batchMode = OptionalCassBatchType::logged;
                 else if (stricmp(val, "UNLOGGED")==0)
-                    batchMode = CASS_BATCH_TYPE_UNLOGGED;
+                    batchMode = OptionalCassBatchType::unlogged;
                 else if (stricmp(val, "COUNTER")==0)
-                    batchMode = CASS_BATCH_TYPE_COUNTER;
+                    batchMode = OptionalCassBatchType::counter;
                 opts.remove(idx);
             }
             else if (strnicmp(opt, "pagesize=", 9)==0)
@@ -1939,7 +1939,7 @@ protected:
     unsigned nextParam;
     unsigned numParams;
     StringBuffer queryString;
-    CassBatchType batchMode;
+    OptionalCassBatchType batchMode;
     unsigned pageSize;
 };
 

+ 11 - 3
plugins/cassandra/cassandraembed.hpp

@@ -26,6 +26,14 @@
 
 namespace cassandraembed {
 
+enum class OptionalCassBatchType
+{
+    logged = CASS_BATCH_TYPE_LOGGED,
+    unlogged = CASS_BATCH_TYPE_UNLOGGED,
+    counter = CASS_BATCH_TYPE_COUNTER,
+    nobatch = 255
+};
+
 __declspec(noreturn) extern void UNSUPPORTED(const char *feature) __attribute__((noreturn));
 __declspec(noreturn) extern void failx(const char *msg, ...) __attribute__((format(printf, 1, 2), noreturn));
 __declspec(noreturn) extern void fail(const char *msg) __attribute__((noreturn));
@@ -120,7 +128,7 @@ public:
     void connect();
     void disconnect();
     CassandraPrepared *prepareStatement(const char *query, bool trace) const;
-    CassandraStatementInfo *createStatementInfo(const char *script, unsigned numParams, CassBatchType batchMode, unsigned pageSize) const;
+    CassandraStatementInfo *createStatementInfo(const char *script, unsigned numParams, OptionalCassBatchType batchMode, unsigned pageSize) const;
     void executeAsync(CIArrayOf<CassandraStatement> &batch, const char *what) const;
 
 private:
@@ -432,7 +440,7 @@ private:
 class CASSANDRAEMBED_API CassandraStatementInfo : public CInterface
 {
 public:
-    CassandraStatementInfo(CassandraSession *_session, CassandraPrepared *_prepared, unsigned _numBindings, CassBatchType _batchMode, unsigned pageSize, Semaphore *_semaphore, unsigned _maxRetries);
+    CassandraStatementInfo(CassandraSession *_session, CassandraPrepared *_prepared, unsigned _numBindings, OptionalCassBatchType _batchMode, unsigned pageSize, Semaphore *_semaphore, unsigned _maxRetries);
     ~CassandraStatementInfo();
     void stop();
     bool next();
@@ -469,7 +477,7 @@ protected:
     Semaphore *semaphore;
     unsigned maxRetries;
     bool inBatch;
-    CassBatchType batchMode;
+    OptionalCassBatchType batchMode;
 };
 
 extern CASSANDRAEMBED_API bool getBooleanResult(const RtlFieldInfo *field, const CassValue *value);