Browse Source

Add the 'Database Updates' test for Drogon (#4504)

An Tao 6 years ago
parent
commit
f994930eb8

+ 7 - 0
frameworks/C++/drogon/README.md

@@ -12,6 +12,9 @@ This is the [Drogon](https://github.com/an-tao/drogon) portion of a [benchmarkin
 * [Fortune Without ORM](drogon_benchmark/controllers/FortuneCtrlRaw.cc)
 * [Multiple Database Queries ORM](drogon_benchmark/controllers/QueriesCtrl.cc)
 * [Multiple Database Queries Without ORM](drogon_benchmark/controllers/QueriesCtrlRaw.cc)
+* [Database Updates ORM](drogon_benchmark/controllers/UpdatesCtrl.cc)
+* [Database Updates Without ORM](drogon_benchmark/controllers/UpdatesCtrlRaw.cc)
+
 
 ## Test URLs
 ### JSON
@@ -34,3 +37,7 @@ http://localhost:8080/fortunes
 ### Multiple Database Queries
 
 http://localhost:8080/queries
+
+### Database Updates
+
+http://localhost:8080/updates

+ 2 - 0
frameworks/C++/drogon/benchmark_config.json

@@ -8,6 +8,7 @@
         "db_url": "/db",
         "fortune_url": "/fortunes",
         "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
         "port": 8080,
         "approach": "Realistic",
         "classification": "Fullstack",
@@ -28,6 +29,7 @@
         "db_url": "/db",
         "fortune_url": "/fortunes",
         "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
         "port": 8080,
         "approach": "Realistic",
         "classification": "Fullstack",

+ 1 - 1
frameworks/C++/drogon/drogon-raw.dockerfile

@@ -34,7 +34,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout cf29b0805007ebcd8d6591aa7945ce2ca4c1371f
+RUN git checkout 1e1bcbf781d9e2cf3a9d4110ef6fc6875c41a1bd
 
 RUN ./build.sh
 

+ 1 - 1
frameworks/C++/drogon/drogon.dockerfile

@@ -34,7 +34,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout cf29b0805007ebcd8d6591aa7945ce2ca4c1371f
+RUN git checkout 1e1bcbf781d9e2cf3a9d4110ef6fc6875c41a1bd
 
 RUN ./build.sh
 

+ 7 - 0
frameworks/C++/drogon/drogon_benchmark/config-raw.json

@@ -124,6 +124,13 @@
         "http_methods": [
           "get"
         ]
+      },
+      {
+        "path": "/updates",
+        "controller": "UpdatesCtrlRaw",
+        "http_methods": [
+          "get"
+        ]
       }
     ],
     //idle_connection_timeout: defaults to 60 seconds, the lifetime 

+ 7 - 0
frameworks/C++/drogon/drogon_benchmark/config.json

@@ -140,6 +140,13 @@
         "http_methods": [
           "get"
         ]
+      },
+      {
+        "path": "/updates",
+        "controller": "UpdatesCtrl",
+        "http_methods": [
+          "get"
+        ]
       }
     ],
     //idle_connection_timeout: defaults to 60 seconds, the lifetime 

+ 61 - 0
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrl.cc

@@ -0,0 +1,61 @@
+#include "UpdatesCtrl.h"
+#include "models/World.h"
+#include <stdlib.h>
+
+using namespace drogon_model::hello_world;
+
+void UpdatesCtrl::asyncHandleHttpRequest(const HttpRequestPtr &req, const std::function<void(const HttpResponsePtr &)> &callback)
+{
+    //write your application logic here
+    static std::once_flag once;
+    std::call_once(once, []() {
+        srand(time(NULL));
+    });
+    int queries = 1;
+    auto &parameter = req->getParameter("queries");
+    if (!parameter.empty())
+    {
+        queries = atoi(parameter.c_str());
+        if (queries > 500)
+            queries = 500;
+        else if (queries < 1)
+            queries = 1;
+    }
+    auto json = std::make_shared<Json::Value>();
+    json->resize(0);
+    auto callbackPtr = std::shared_ptr<std::function<void(const HttpResponsePtr &)>>(new std::function<void(const HttpResponsePtr &)>(callback));
+    auto counter = std::make_shared<int>(queries);
+    auto client = app().getFastDbClient();
+    drogon::orm::Mapper<World> mapper(client);
+
+    for (int i = 0; i < queries; i++)
+    {
+        World::PrimaryKeyType id = rand() % 10000 + 1;
+        mapper.findByPrimaryKey(id,
+                                [callbackPtr, counter, json, client](World w) mutable {
+                                    w.setRandomnumber(rand() % 10000 + 1);
+                                    drogon::orm::Mapper<World> mapper(client);
+                                    mapper.update(w,
+                                                  [w, json = std::move(json), counter = std::move(counter), callbackPtr](const size_t count) {
+                                                      json->append(w.toJson());
+                                                      (*counter)--;
+                                                      if ((*counter) == 0)
+                                                      {
+                                                          (*callbackPtr)(HttpResponse::newHttpJsonResponse(*json));
+                                                      }
+                                                  },
+                                                  [callbackPtr](const DrogonDbException &e) {
+                                                      Json::Value ret;
+                                                      ret["result"] = "error!";
+                                                      auto resp = HttpResponse::newHttpJsonResponse(ret);
+                                                      (*callbackPtr)(resp);
+                                                  });
+                                },
+                                [callbackPtr](const DrogonDbException &e) {
+                                    Json::Value ret;
+                                    ret["result"] = "error!";
+                                    auto resp = HttpResponse::newHttpJsonResponse(ret);
+                                    (*callbackPtr)(resp);
+                                });
+    }
+}

+ 12 - 0
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrl.h

@@ -0,0 +1,12 @@
+#pragma once
+#include <drogon/HttpSimpleController.h>
+using namespace drogon;
+class UpdatesCtrl : public drogon::HttpSimpleController<UpdatesCtrl>
+{
+  public:
+    virtual void asyncHandleHttpRequest(const HttpRequestPtr &req, const std::function<void(const HttpResponsePtr &)> &callback) override;
+    PATH_LIST_BEGIN
+    //list path definitions here;
+    //PATH_ADD("/path","filter1","filter2",HttpMethod1,HttpMethod2...);
+    PATH_LIST_END
+};

+ 61 - 0
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc

@@ -0,0 +1,61 @@
+#include "UpdatesCtrlRaw.h"
+using namespace drogon::orm;
+void UpdatesCtrlRaw::asyncHandleHttpRequest(const HttpRequestPtr &req, const std::function<void(const HttpResponsePtr &)> &callback)
+{
+    //write your application logic here
+    static std::once_flag once;
+    std::call_once(once, []() {
+        srand(time(NULL));
+    });
+    int queries = 1;
+    auto &parameter = req->getParameter("queries");
+    if (!parameter.empty())
+    {
+        queries = atoi(parameter.c_str());
+        if (queries > 500)
+            queries = 500;
+        else if (queries < 1)
+            queries = 1;
+    }
+    auto json = std::make_shared<Json::Value>();
+    json->resize(0);
+    auto callbackPtr = std::shared_ptr<std::function<void(const HttpResponsePtr &)>>(new std::function<void(const HttpResponsePtr &)>(callback));
+    auto counter = std::make_shared<int>(queries);
+    auto client = app().getFastDbClient();
+    for (int i = 0; i < queries; i++)
+    {
+        int id = rand() % 10000 + 1;
+        *client << "select randomnumber from world where id=$1" << id >>
+            [callbackPtr, counter, json, id, client](const Result &r) mutable {
+                auto randId = rand() % 10000 + 1;
+                *client << "update world set randomnumber=$1 where id=$2"
+                        << randId
+                        << id >>
+                    [id, json = std::move(json), randId, counter = std::move(counter), callbackPtr](const Result &r) mutable {
+                        (*counter)--;
+
+                        Json::Value j;
+                        j["id"] = id;
+                        j["randomnumber"] = randId;
+                        json->append(std::move(j));
+
+                        if ((*counter) == 0)
+                        {
+                            (*callbackPtr)(HttpResponse::newHttpJsonResponse(*json));
+                        }
+                    } >>
+                    [callbackPtr](const DrogonDbException &e) {
+                        Json::Value ret;
+                        ret["result"] = "error!";
+                        auto resp = HttpResponse::newHttpJsonResponse(ret);
+                        (*callbackPtr)(resp);
+                    };
+            } >>
+            [callbackPtr](const DrogonDbException &e) {
+                Json::Value ret;
+                ret["result"] = "error!";
+                auto resp = HttpResponse::newHttpJsonResponse(ret);
+                (*callbackPtr)(resp);
+            };
+    }
+}

+ 12 - 0
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.h

@@ -0,0 +1,12 @@
+#pragma once
+#include <drogon/HttpSimpleController.h>
+using namespace drogon;
+class UpdatesCtrlRaw:public drogon::HttpSimpleController<UpdatesCtrlRaw>
+{
+public:
+    virtual void asyncHandleHttpRequest(const HttpRequestPtr& req,const std::function<void (const HttpResponsePtr &)> & callback) override;
+    PATH_LIST_BEGIN
+    //list path definitions here;
+    //PATH_ADD("/path","filter1","filter2",HttpMethod1,HttpMethod2...);
+    PATH_LIST_END
+};