Added a cynara backend option (passed as a primary backend 18/49218/1
authorr.kubiak <r.kubiak@samsung.com>
Thu, 8 Oct 2015 13:32:24 +0000 (15:32 +0200)
committerr.kubiak <r.kubiak@samsung.com>
Thu, 8 Oct 2015 14:22:27 +0000 (16:22 +0200)
option -P) cache-size, to control the client side of cynara
caache (default is 1000). This size is in cynara objects
not kilo-mega/bytes.

Change-Id: Ia02053990d01d37a00f8d78ab743d60a7a0e758b

include/nether_CynaraBackend.h
include/nether_Types.h
include/nether_Utils.h
src/nether_CynaraBackend.cpp
src/nether_Utils.cpp

index 3825d41813c2ad035c766ae4ec55842e633d31cc..4dd52b1a6505260333073353443cbe068679b0e2 100644 (file)
@@ -53,9 +53,12 @@ class NetherCynaraBackend : public NetherPolicyBackend
                static void checkCallback(cynara_check_id check_id, cynara_async_call_cause cause, int response, void *data);
 
        private:
+               void parseBackendArgs();
+               void setCacheSize(const size_t newCacheSize);
                cynara_async *cynaraContext;
                NetherDescriptorStatus currentCynaraDescriptorStatus;
                int currentCynaraDescriptor;
+               cynara_async_configuration *cynaraConfig;
                std::vector<u_int32_t> responseQueue;
                int cynaraLastResult;
 };
index a862da4e3dabd649d1002b378eb46dbb36681b03..57cae363c6703025c4e60ad1fbf4cfda6af837b1 100644 (file)
@@ -32,6 +32,7 @@
 #include <sstream>
 #include <memory>
 #include <cstdint>
+#include <vector>
 
 #include <sys/types.h>
 #include <unistd.h>
index 2d01abe74cbf3e4eb6f13e27d4e51849593de763..146accedda0ca5f4fd3e64936fa805e6c219e248 100644 (file)
@@ -44,5 +44,5 @@ std::string transportToString(const NetherTransportType transportType);
 std::string protocolToString(const NetherProtocolType protocolType);
 std::string packetToString(const NetherPacket &packet);
 template<typename ... Args> std::string stringFormat(const char* format, Args ... args);
-
+std::vector<std::string> tokenize(const std::string &str, const std::string &delimiters);
 #endif // NETHER_UTILS_H
index 097d56d07d2d77a5b2f6b093eca1e29e3fae1a5a..224b0e86582d4ba8e5c1322516447d0330c858e7 100644 (file)
@@ -23,6 +23,9 @@
  */
 
 #include "nether_CynaraBackend.h"
+#include "nether_Utils.h"
+
+using namespace std;
 
 #ifdef HAVE_CYNARA
 
@@ -39,18 +42,23 @@ const std::string cynaraErrorCodeToString(int cynaraErrorCode)
 
 NetherCynaraBackend::NetherCynaraBackend(const NetherConfig &netherConfig)
        :   NetherPolicyBackend(netherConfig), currentCynaraDescriptor(0),
-               cynaraLastResult(CYNARA_API_UNKNOWN_ERROR)
+               cynaraLastResult(CYNARA_API_UNKNOWN_ERROR), cynaraConfig(nullptr)
 {
        responseQueue.reserve(1024);
+       if (netherConfig.primaryBackendArgs.length() != 0)
+       {
+               parseBackendArgs();
+       }
 }
 
 NetherCynaraBackend::~NetherCynaraBackend()
 {
+       cynara_async_configuration_destroy(cynaraConfig);
 }
 
 bool NetherCynaraBackend::initialize()
 {
-       cynaraLastResult  = cynara_async_initialize(&cynaraContext, NULL, &statusCallback, this);
+       cynaraLastResult  = cynara_async_initialize(&cynaraContext, cynaraConfig, &statusCallback, this);
        if(cynaraLastResult != CYNARA_API_SUCCESS)
        {
                LOGE("Failed to initialize cynara client " << cynaraErrorCodeToString(cynaraLastResult));
@@ -180,4 +188,37 @@ bool NetherCynaraBackend::processEvents()
        LOGW("cynara_async_process failed " << cynaraErrorCodeToString(ret));
        return (false);
 }
+
+void NetherCynaraBackend::setCacheSize(const size_t newCacheSize)
+{
+       int ret;
+
+       if ((ret = cynara_async_configuration_create (&cynaraConfig)) != CYNARA_API_SUCCESS)
+       {
+               LOGE("cynara_async_configuration_create failed: " << cynaraErrorCodeToString(ret));
+       }
+
+       if ((ret = cynara_async_configuration_set_cache_size(cynaraConfig, newCacheSize)) != CYNARA_API_SUCCESS)
+       {
+               LOGE("cynara_async_configuration_set_cache_size failed: " << cynaraErrorCodeToString(ret));
+       }
+
+       LOGD("new cache size: " << newCacheSize);
+}
+
+void NetherCynaraBackend::parseBackendArgs()
+{
+       vector<string> valueNamePairs = tokenize(netherConfig.primaryBackendArgs,";");
+
+       for (vector<string>::iterator it = valueNamePairs.begin(); it != valueNamePairs.end(); ++it)
+       {
+               vector<string> valueNamePair = tokenize(*it, "=");
+
+               if (valueNamePair[0] == "cache-size")
+               {
+                       std::string::size_type sz;
+                       setCacheSize (stoi (valueNamePair[1], &sz, 10));
+               }
+       }
+}
 #endif
index 2d231eb04e24f9162eef88bf9687479596753ebd..7726dd698bc8445af4a8e0e9ddd834ddb5a6e6aa 100644 (file)
@@ -172,3 +172,20 @@ std::string packetToString(const NetherPacket &packet)
        stream << packet.remotePort;
        return (stream.str());
 }
+
+// http://stackoverflow.com/questions/236129/split-a-string-in-c
+std::vector<std::string> tokenize(const std::string &str, const std::string &delimiters)
+{
+    std::vector<std::string> v;
+    typename std::string::size_type start = 0;
+    auto pos = str.find_first_of(delimiters, start);
+    while(pos != std::string::npos) {
+        if(pos != start) // ignore empty tokens
+            v.emplace_back(str, start, pos - start);
+        start = pos + 1;
+        pos = str.find_first_of(delimiters, start);
+    }
+    if(start < str.length()) // ignore trailing delimiter
+        v.emplace_back(str, start, str.length() - start); // add what's left of the string
+    return v;
+}