]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
configure serial consistency as well
authorRazvan Becheriu <ravan@isc.org>
Mon, 11 Mar 2019 09:24:33 +0000 (11:24 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Thu, 21 Mar 2019 08:42:25 +0000 (09:42 +0100)
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_parser.yy
src/lib/cql/cql_connection.cc
src/lib/cql/cql_connection.h
src/lib/cql/cql_exchange.cc
src/lib/database/database_connection.cc
src/lib/database/dbaccess_parser.cc
src/lib/database/tests/database_connection_unittest.cc

index 81c817c36d1cf76d784afc5109d70886a10310ff..5c684e3467007805c95122f3f119fda84bed2c88 100644 (file)
@@ -495,6 +495,17 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"serial-consistency\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::LEASE_DATABASE:
+    case isc::dhcp::Parser4Context::HOSTS_DATABASE:
+    case isc::dhcp::Parser4Context::CONFIG_DATABASE:
+        return isc::dhcp::Dhcp4Parser::make_SERIAL_CONSISTENCY(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("serial-consistency", driver.loc_);
+    }
+}
+
 \"reconnect-wait-time\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LEASE_DATABASE:
index 8959ba40ce3de8a464cf1cdbef2520eb505519af..7efdeb93d3f5ecc8cd881aae326a5be4edf8811f 100644 (file)
@@ -91,6 +91,7 @@ using namespace std;
   CONTACT_POINTS "contact-points"
   KEYSPACE "keyspace"
   CONSISTENCY "consistency"
+  SERIAL_CONSISTENCY "serial-consistency"
   MAX_RECONNECT_TRIES "max-reconnect-tries"
   RECONNECT_WAIT_TIME "reconnect-wait-time"
   REQUEST_TIMEOUT "request-timeout"
@@ -714,6 +715,7 @@ database_map_param: database_type
                   | tcp_nodelay
                   | keyspace
                   | consistency
+                  | serial_consistency
                   | unknown_map_entry
                   ;
 
@@ -826,6 +828,14 @@ consistency: CONSISTENCY {
     ctx.leave();
 };
 
+serial_consistency: SERIAL_CONSISTENCY {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+    ElementPtr c(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("serial-consistency", c);
+    ctx.leave();
+};
+
 max_reconnect_tries: MAX_RECONNECT_TRIES COLON INTEGER {
     ElementPtr n(new IntElement($3, ctx.loc2pos(@3)));
     ctx.stack_.back()->set("max-reconnect-tries", n);
index eb468a304df1422181860ae169052defd06a2f9a..f463ef3d50ff6314ba0fa9d6c0d52784811a0c50 100644 (file)
@@ -690,6 +690,17 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"serial-consistency\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::LEASE_DATABASE:
+    case isc::dhcp::Parser6Context::HOSTS_DATABASE:
+    case isc::dhcp::Parser6Context::CONFIG_DATABASE:
+        return isc::dhcp::Dhcp6Parser::make_SERIAL_CONSISTENCY(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("serial-consistency", driver.loc_);
+    }
+}
+
 \"reconnect-wait-time\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
index ee6bef68c9909c41a00318481722baa535dcca2a..e1aabb6d491a05ec216620c14edcd5079a27d394 100644 (file)
@@ -78,6 +78,7 @@ using namespace std;
   RECONNECT_WAIT_TIME "reconnect-wait-time"
   KEYSPACE "keyspace"
   CONSISTENCY "consistency"
+  SERIAL_CONSISTENCY "serial-consistency"
   REQUEST_TIMEOUT "request-timeout"
   TCP_KEEPALIVE "tcp-keepalive"
   TCP_NODELAY "tcp-nodelay"
@@ -634,6 +635,7 @@ database_map_param: database_type
                   | tcp_nodelay
                   | keyspace
                   | consistency
+                  | serial_consistency
                   | unknown_map_entry
                   ;
 
@@ -756,6 +758,14 @@ consistency: CONSISTENCY {
     ctx.leave();
 };
 
+serial_consistency: SERIAL_CONSISTENCY {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+    ElementPtr c(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("serial-consistency", c);
+    ctx.leave();
+};
+
 sanity_checks: SANITY_CHECKS {
     ElementPtr m(new MapElement(ctx.loc2pos(@1)));
     ctx.stack_.back()->set("sanity-checks", m);
index a54f643c35e19426724442c86e351c1f65a188ef..dcf8551d207b058ba524fd0d87b0e2ccb39227ac 100644 (file)
@@ -30,7 +30,8 @@ namespace db {
 
 CqlConnection::CqlConnection(const ParameterMap& parameters)
     : DatabaseConnection(parameters), statements_(), cluster_(NULL),
-      session_(NULL), consistency_(CASS_CONSISTENCY_QUORUM), schema_meta_(NULL),
+      session_(NULL), consistency_(CASS_CONSISTENCY_QUORUM),
+      serial_consistency_(CASS_CONSISTENCY_UNKNOWN), schema_meta_(NULL),
       keyspace_meta_(NULL), force_consistency_(true) {
 }
 
@@ -152,6 +153,15 @@ CqlConnection::openDatabase() {
         // No user. Fine, we'll use NULL.
     }
 
+    const char* serial_consistency = NULL;
+    std::string sserial_consistency;
+    try {
+        sserial_consistency = getParameter("serial-consistency");
+        serial_consistency = sserial_consistency.c_str();
+    } catch (...) {
+        // No user. Fine, we'll use NULL.
+    }
+
     const char* reconnect_wait_time = NULL;
     std::string sreconnect_wait_time;
     try {
@@ -225,8 +235,12 @@ CqlConnection::openDatabase() {
 
     if (consistency) {
         CassConsistency desired_consistency = CqlConnection::parseConsistency(sconsistency);
+        CassConsistency desired_serial_consistency = CASS_CONSISTENCY_UNKNOWN;
+        if (serial_consistency) {
+            desired_serial_consistency = CqlConnection::parseConsistency(sserial_consistency);
+        }
         if (desired_consistency != CASS_CONSISTENCY_UNKNOWN) {
-            setConsistency(true, desired_consistency);
+            setConsistency(true, desired_consistency, desired_serial_consistency);
         }
     }
 
@@ -379,9 +393,12 @@ CqlConnection::prepareStatements(StatementMap& statements) {
 }
 
 void
-CqlConnection::setConsistency(bool force, CassConsistency consistency) {
+CqlConnection::setConsistency(bool force,
+                              CassConsistency consistency,
+                              CassConsistency serial_consistency) {
     force_consistency_ = force;
     consistency_ = consistency;
+    serial_consistency_ = serial_consistency;
 }
 
 void
index bc066f8620fa6d07584682ad7645eec3addaef19..cd526a6b364fb2df1eb23efac95e4eab43e41ac1 100644 (file)
@@ -160,7 +160,9 @@ public:
     void openDatabase();
 
     /// @brief Set consistency
-    void setConsistency(bool force, CassConsistency consistency);
+    void setConsistency(bool force,
+                        CassConsistency consistency,
+                        CassConsistency serial_consistency);
 
     /// @brief Start transaction
     void startTransaction();
@@ -202,6 +204,9 @@ public:
     /// @brief CQL consistency
     CassConsistency consistency_;
 
+    /// @brief CQL serial consistency
+    CassConsistency serial_consistency_;
+
     // @brief Schema meta information, used for UDTs
     const CassSchemaMeta* schema_meta_;
 
index 41d82f5df09459c7e98c19ce535f31095a7dbb02..f9ab63eb4789ad2ed78f52998b598385141c8285 100644 (file)
@@ -811,6 +811,17 @@ CqlExchange::executeSelect(const CqlConnection& connection, const AnyArray& data
                           << tagged_statement.name_
                           << ", Cassandra error code: " << cass_error_desc(rc));
         }
+        if (connection.serial_consistency_ != CASS_CONSISTENCY_UNKNOWN) {
+            rc = cass_statement_set_serial_consistency(statement, connection.serial_consistency_);
+            if (rc != CASS_OK) {
+                cass_statement_free(statement);
+                isc_throw(DbOperationError,
+                          "CqlExchange::executeSelect(): unable to set statement "
+                          "serial consistency for statement "
+                              << tagged_statement.name_
+                              << ", Cassandra error code: " << cass_error_desc(rc));
+            }
+        }
     }
 
     CqlCommon::bindData(local_data, statement);
index 1922421e685431dbf786550bc3e2e6b5f4435cf9..c13484d193ccb865ea589cd8dc03163065bc5fc4 100644 (file)
@@ -195,6 +195,7 @@ DatabaseConnection::toElement(const ParameterMap& params) {
                    (keyword == "name") ||
                    (keyword == "contact-points") ||
                    (keyword == "consistency") ||
+                   (keyword == "serial-consistency") ||
                    (keyword == "keyspace")) {
             result->set(keyword, isc::data::Element::create(value));
         } else {
index 607e6d0a05065704b1b35798b3f4409731ac7c43..db1de0e564e4b3cc4b3b76b140bd08a328d30d71 100644 (file)
@@ -110,6 +110,7 @@ DbAccessParser::parse(std::string& access_string,
                 // contact-points
                 // keyspace
                 // consistency
+                // serial-consistency
                 values_copy[param.first] = param.second->stringValue();
             }
         } catch (const isc::data::TypeError& ex) {
index 11e5ff4231b98291cb7b314114e528f812dcc08a..ada22324791baaf230032c66c352c99e91aed9fe 100644 (file)
@@ -261,6 +261,7 @@ TEST(DatabaseConnection, toElementDbAccessStringValid) {
         "\"connect-timeout\" : 200, \n"
         "\"contact-points\": \"contact_str\", \n"
         "\"consistency\": \"quorum\", \n"
+        "\"serial-consistency\": \"serial\", \n"
         "\"host\": \"host_str\", \n"
         "\"keyspace\": \"keyspace_str\", \n"
         "\"lfc-interval\" : 100, \n"