You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@resilientdb.apache.org by ha...@apache.org on 2026/01/07 17:05:50 UTC
(incubator-resilientdb) branch development created (now 893a8025)
This is an automated email from the ASF dual-hosted git repository.
harishgokul01 pushed a change to branch development
in repository https://gitbox.apache.org/repos/asf/incubator-resilientdb.git
at 893a8025 Update Bazel configurations and service files
This branch includes the following new commits:
new 893a8025 Update Bazel configurations and service files
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(incubator-resilientdb) 01/01: Update Bazel configurations and service files
Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
harishgokul01 pushed a commit to branch development
in repository https://gitbox.apache.org/repos/asf/incubator-resilientdb.git
commit 893a8025ad21ca56c258dc90a75c40fd5610bf0a
Author: bchou9 <bc...@gmail.com>
AuthorDate: Wed Jan 7 17:05:44 2026 +0000
Update Bazel configurations and service files
- Added new Bazel configuration for GraphQL ecosystem.
- Updated existing Bazel configurations to include profiling options.
- Modified .gitignore to exclude additional database files.
- Refactored CrowService to comment out unused routes and removed txn_client_ member.
- Updated service configuration files to use JSON format for replica information.
- Introduced scripts for starting and stopping replicas.
- Added new dependencies for JSON handling in the project.
---
.bazelrc | 2 +
.gitignore | 3 +-
ecosystem/graphql/.bazelrc | 3 +
ecosystem/graphql/WORKSPACE | 29 ++
.../graphql/service/http_server/crow_service.cpp | 578 ++++++++++-----------
.../graphql/service/http_server/crow_service.h | 1 -
.../service/http_server/server_config.config | 27 +-
.../service/tools/config/interface/client.config | 11 +-
.../service/tools/config/interface/service.config | 11 +-
ecosystem/graphql/third_party/BUILD | 7 +
.../graphql/third_party/{BUILD => json.BUILD} | 23 +-
service/tools/config/interface/service.config | 17 +-
service/tools/config/server.config | 24 +-
service/tools/config/server/server.config | 18 +-
service/tools/kv/server_tools/generate_config.sh | 2 +-
service/tools/kv/server_tools/start_replica.sh | 61 +++
service/tools/kv/server_tools/stop_replica.sh | 31 ++
17 files changed, 497 insertions(+), 351 deletions(-)
diff --git a/.bazelrc b/.bazelrc
index cc3d1af5..ecfcecae 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -1,4 +1,6 @@
build --cxxopt='-std=c++17' --copt=-O3 --jobs=40
+
+build:profile --cxxopt='-std=c++17' --copt="-g" --copt="-fno-omit-frame-pointer" --cxxopt="-fno-omit-frame-pointer" --linkopt="-g" --strip=never --jobs=2
#build --action_env=PYTHON_BIN_PATH="/usr/bin/python3.10"
#build --action_env=PYTHON_LIB_PATH="/usr/include/python3.10"
diff --git a/.gitignore b/.gitignore
index 6d1b093f..be0ae77a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,4 +20,5 @@ apache_release
resdb/
100*_db/
gmon.out
-.history/
\ No newline at end of file
+.history/
+*_db/
\ No newline at end of file
diff --git a/ecosystem/graphql/.bazelrc b/ecosystem/graphql/.bazelrc
new file mode 100644
index 00000000..3d06b30e
--- /dev/null
+++ b/ecosystem/graphql/.bazelrc
@@ -0,0 +1,3 @@
+build --cxxopt='-std=c++17' --copt=-O3 --jobs=40
+
+build:profile --cxxopt='-std=c++17' --copt="-g" --copt="-fno-omit-frame-pointer" --cxxopt="-fno-omit-frame-pointer" --linkopt="-g" --strip=never --jobs=2
\ No newline at end of file
diff --git a/ecosystem/graphql/WORKSPACE b/ecosystem/graphql/WORKSPACE
index 8ebac612..f33c54d9 100644
--- a/ecosystem/graphql/WORKSPACE
+++ b/ecosystem/graphql/WORKSPACE
@@ -19,6 +19,22 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+ name = "hedron_compile_commands",
+ #Replace the commit hash (4f28899228fb3ad0126897876f147ca15026151e) with the latest commit hash from the repo
+ url = "https://github.com/hedronvision/bazel-compile-commands-extractor/archive/4f28899228fb3ad0126897876f147ca15026151e.tar.gz",
+ strip_prefix = "bazel-compile-commands-extractor-4f28899228fb3ad0126897876f147ca15026151e",
+)
+load("@hedron_compile_commands//:workspace_setup.bzl", "hedron_compile_commands_setup")
+hedron_compile_commands_setup()
+load("@hedron_compile_commands//:workspace_setup_transitive.bzl", "hedron_compile_commands_setup_transitive")
+hedron_compile_commands_setup_transitive()
+load("@hedron_compile_commands//:workspace_setup_transitive_transitive.bzl", "hedron_compile_commands_setup_transitive_transitive")
+hedron_compile_commands_setup_transitive_transitive()
+load("@hedron_compile_commands//:workspace_setup_transitive_transitive_transitive.bzl", "hedron_compile_commands_setup_transitive_transitive_transitive")
+hedron_compile_commands_setup_transitive_transitive_transitive()
+
+
http_archive(
name = "rules_foreign_cc",
sha256 = "69023642d5781c68911beda769f91fcbc8ca48711db935a75da7f6536b65047f",
@@ -238,6 +254,19 @@ http_archive(
],
)
+http_archive(
+ name = "nlohmann_json",
+ build_file = "//third_party:json.BUILD",
+ sha256 = "95651d7d1fcf2e5c3163c3d37df6d6b3e9e5027299e6bd050d157322ceda9ac9",
+ strip_prefix = "json-3.11.2",
+ url = "https://github.com/nlohmann/json/archive/refs/tags/v3.11.2.zip",
+)
+
+bind(
+ name = "json",
+ actual = "@nlohmann_json//:json",
+)
+
load("@com_resdb_nexres//:repositories.bzl", "nexres_repositories")
nexres_repositories()
diff --git a/ecosystem/graphql/service/http_server/crow_service.cpp b/ecosystem/graphql/service/http_server/crow_service.cpp
index e7054634..b45cd273 100644
--- a/ecosystem/graphql/service/http_server/crow_service.cpp
+++ b/ecosystem/graphql/service/http_server/crow_service.cpp
@@ -55,9 +55,7 @@ CrowService::CrowService(ResDBConfig client_config, ResDBConfig server_config,
server_config_(server_config),
port_num_(port_num),
kv_client_(client_config_),
- state_client_(client_config_),
- txn_client_(server_config_) {
- GetAllBlocks(100, true, false);
+ state_client_(client_config_) {
}
void CrowService::run() {
@@ -67,42 +65,42 @@ void CrowService::run() {
std::mutex mtx;
// Get all values
- CROW_ROUTE(app, "/v1/transactions")
- ([this](const crow::request &req, response &res) {
- uint64_t cur_time = std::chrono::duration_cast<std::chrono::milliseconds>(
- std::chrono::system_clock::now().time_since_epoch())
- .count();
-
- if (cur_time < last_db_scan_time + DB_SCAN_TIMEOUT_MS) {
- res.code = 503;
- res.set_header("Content-Type", "text/plain");
- res.end(
- "Get all transactions functionality on cooldown (" +
- std::to_string(last_db_scan_time + DB_SCAN_TIMEOUT_MS - cur_time) +
- " ms left)");
- } else {
- last_db_scan_time = cur_time;
-
- auto values = kv_client_.GetAllValues();
- if (values != nullptr) {
- // LOG(INFO) << "client getallvalues value = " << values->c_str();
-
- // Send updated blocks list to websocket
- if (users.size() > 0) {
- for (auto u : users) u->send_text("Update blocks");
- }
-
- num_transactions_++;
-
- res.set_header("Content-Type", "application/json");
- res.end(std::string(values->c_str()));
- } else {
- res.code = 500;
- res.set_header("Content-Type", "text/plain");
- res.end("getallvalues fail");
- }
- }
- });
+ // CROW_ROUTE(app, "/v1/transactions")
+ // ([this](const crow::request &req, response &res) {
+ // uint64_t cur_time = std::chrono::duration_cast<std::chrono::milliseconds>(
+ // std::chrono::system_clock::now().time_since_epoch())
+ // .count();
+
+ // if (cur_time < last_db_scan_time + DB_SCAN_TIMEOUT_MS) {
+ // res.code = 503;
+ // res.set_header("Content-Type", "text/plain");
+ // res.end(
+ // "Get all transactions functionality on cooldown (" +
+ // std::to_string(last_db_scan_time + DB_SCAN_TIMEOUT_MS - cur_time) +
+ // " ms left)");
+ // } else {
+ // last_db_scan_time = cur_time;
+
+ // auto values = kv_client_.GetAllValues();
+ // if (values != nullptr) {
+ // // LOG(INFO) << "client getallvalues value = " << values->c_str();
+
+ // // Send updated blocks list to websocket
+ // if (users.size() > 0) {
+ // for (auto u : users) u->send_text("Update blocks");
+ // }
+
+ // num_transactions_++;
+
+ // res.set_header("Content-Type", "application/json");
+ // res.end(std::string(values->c_str()));
+ // } else {
+ // res.code = 500;
+ // res.set_header("Content-Type", "text/plain");
+ // res.end("getallvalues fail");
+ // }
+ // }
+ // });
// Get value of specific id
CROW_ROUTE(app, "/v1/transactions/<string>")
@@ -192,91 +190,91 @@ void CrowService::run() {
return res;
});
- CROW_ROUTE(app, "/v1/blocks")
- ([this](const crow::request &req, response &res) {
- auto values = GetAllBlocks(100);
- res.set_header("Content-Type", "application/json");
- res.end(values);
- });
+ // CROW_ROUTE(app, "/v1/blocks")
+ // ([this](const crow::request &req, response &res) {
+ // auto values = GetAllBlocks(100);
+ // res.set_header("Content-Type", "application/json");
+ // res.end(values);
+ // });
// Retrieve blocks in batches of size of the int parameter
- CROW_ROUTE(app, "/v1/blocks/<int>")
- ([this](const crow::request &req, response &res, int batch_size) {
- auto values = GetAllBlocks(batch_size, false, true);
- if (values == "") {
- res.code = 500;
- res.set_header("Content-Type", "text/plain");
- res.end("get replica state fail");
- exit(1);
- };
- res.set_header("Content-Type", "application/json");
- res.end(values);
- });
+ // CROW_ROUTE(app, "/v1/blocks/<int>")
+ // ([this](const crow::request &req, response &res, int batch_size) {
+ // auto values = GetAllBlocks(batch_size, false, true);
+ // if (values == "") {
+ // res.code = 500;
+ // res.set_header("Content-Type", "text/plain");
+ // res.end("get replica state fail");
+ // exit(1);
+ // };
+ // res.set_header("Content-Type", "application/json");
+ // res.end(values);
+ // });
// Retrieve blocks within a range
- CROW_ROUTE(app, "/v1/blocks/<int>/<int>")
- ([this](const crow::request &req, response &res, int min_seq, int max_seq) {
- auto resp = txn_client_.GetTxn(min_seq, max_seq);
- absl::StatusOr<std::vector<std::pair<uint64_t, std::string>>> GetTxn(
- uint64_t min_seq, uint64_t max_seq);
- if (!resp.ok()) {
- LOG(ERROR) << "get replica state fail";
- res.code = 500;
- res.set_header("Content-Type", "text/plain");
- res.end("get replica state fail");
- exit(1);
- }
-
- std::string values = "[\n";
- bool first_iteration = true;
- for (auto &txn : *resp) {
- BatchUserRequest request;
- KVRequest kv_request;
-
- std::string cur_batch_str = "";
- if (request.ParseFromString(txn.second)) {
- LOG(INFO) << request.DebugString();
-
- if (!first_iteration) cur_batch_str.append(",");
- first_iteration = false;
-
- // id
- uint64_t seq = txn.first;
- cur_batch_str.append("{\"id\": " + std::to_string(seq));
-
- // number
- cur_batch_str.append(", \"number\": \"" + std::to_string(seq) + "\"");
-
- // transactions
- cur_batch_str.append(", \"transactions\": [");
- bool first_transaction = true;
- for (auto &sub_req : request.user_requests()) {
- kv_request.ParseFromString(sub_req.request().data());
- std::string kv_request_json = ParseKVRequest(kv_request);
-
- if (!first_transaction) cur_batch_str.append(",");
- first_transaction = false;
- cur_batch_str.append(kv_request_json);
- cur_batch_str.append("\n");
- }
- cur_batch_str.append("]"); // close transactions list
-
- // size
- cur_batch_str.append(", \"size\": " +
- std::to_string(request.ByteSizeLong()));
-
- // createdAt
- uint64_t createtime = request.createtime();
- cur_batch_str.append(", \"createdAt\": \"" +
- ParseCreateTime(createtime) + "\"");
- }
- cur_batch_str.append("}\n");
- values.append(cur_batch_str);
- }
- values.append("]\n");
- res.set_header("Content-Type", "application/json");
- res.end(values);
- });
+ // CROW_ROUTE(app, "/v1/blocks/<int>/<int>")
+ // ([this](const crow::request &req, response &res, int min_seq, int max_seq) {
+ // auto resp = txn_client_.GetTxn(min_seq, max_seq);
+ // absl::StatusOr<std::vector<std::pair<uint64_t, std::string>>> GetTxn(
+ // uint64_t min_seq, uint64_t max_seq);
+ // if (!resp.ok()) {
+ // LOG(ERROR) << "get replica state fail";
+ // res.code = 500;
+ // res.set_header("Content-Type", "text/plain");
+ // res.end("get replica state fail");
+ // exit(1);
+ // }
+ //
+ // std::string values = "[\n";
+ // bool first_iteration = true;
+ // for (auto &txn : *resp) {
+ // BatchUserRequest request;
+ // KVRequest kv_request;
+ //
+ // std::string cur_batch_str = "";
+ // if (request.ParseFromString(txn.second)) {
+ // LOG(INFO) << request.DebugString();
+ //
+ // if (!first_iteration) cur_batch_str.append(",");
+ // first_iteration = false;
+ //
+ // // id
+ // uint64_t seq = txn.first;
+ // cur_batch_str.append("{\"id\": " + std::to_string(seq));
+ //
+ // // number
+ // cur_batch_str.append(", \"number\": \"" + std::to_string(seq) + "\"");
+ //
+ // // transactions
+ // cur_batch_str.append(", \"transactions\": [");
+ // bool first_transaction = true;
+ // for (auto &sub_req : request.user_requests()) {
+ // kv_request.ParseFromString(sub_req.request().data());
+ // std::string kv_request_json = ParseKVRequest(kv_request);
+ //
+ // if (!first_transaction) cur_batch_str.append(",");
+ // first_transaction = false;
+ // cur_batch_str.append(kv_request_json);
+ // cur_batch_str.append("\n");
+ // }
+ // cur_batch_str.append("]"); // close transactions list
+ //
+ // // size
+ // cur_batch_str.append(", \"size\": " +
+ // std::to_string(request.ByteSizeLong()));
+ //
+ // // createdAt
+ // uint64_t createtime = request.createtime();
+ // cur_batch_str.append(", \"createdAt\": \"" +
+ // ParseCreateTime(createtime) + "\"");
+ // }
+ // cur_batch_str.append("}\n");
+ // values.append(cur_batch_str);
+ // }
+ // values.append("]\n");
+ // res.set_header("Content-Type", "application/json");
+ // res.end(values);
+ // });
CROW_ROUTE(app, "/blockupdatelistener")
.websocket()
@@ -297,181 +295,181 @@ void CrowService::run() {
});
// For metadata table on the Explorer
- CROW_ROUTE(app, "/populatetable")
- ([this](const crow::request &req, response &res) {
- absl::StatusOr<ReplicaState> state_or = state_client_.GetReplicaState();
- if (!state_or.ok()) {
- LOG(ERROR) << "get state fail";
- res.set_header("Content-Type", "application/json");
- res.end("");
- return;
- }
-
- ResConfigData config_data = (*state_or).replica_config();
- ResDBConfig server_config(config_data, ReplicaInfo(), KeyInfo(),
- CertificateInfo());
-
- uint32_t replica_num = server_config.GetReplicaNum();
- uint32_t worker_num = server_config.GetWorkerNum();
- uint32_t client_batch_num = server_config.ClientBatchNum();
- uint32_t max_process_txn = server_config.GetMaxProcessTxn();
- uint32_t client_batch_wait_time = server_config.ClientBatchWaitTimeMS();
- uint32_t input_worker_num = server_config.GetInputWorkerNum();
- uint32_t output_worker_num = server_config.GetOutputWorkerNum();
- int client_timeout_ms = server_config.GetClientTimeoutMs();
- int min_data_receive_num = server_config.GetMinDataReceiveNum();
- size_t max_malicious_replica_num =
- server_config.GetMaxMaliciousReplicaNum();
- int checkpoint_water_mark = server_config.GetCheckPointWaterMark();
-
- // Don't read the ledger if first commit time is known
- if (first_commit_time_ == 0) {
- // Get first block in the chain
- auto resp = txn_client_.GetTxn(1, 1);
- // absl::StatusOr<std::vector<std::pair<uint64_t, std::string>>> GetTxn(
- // uint64_t min_seq, uint64_t max_seq);
- if (!resp.ok()) {
- LOG(ERROR) << "get replica state fail";
- res.end("get replica state fail");
- };
-
- for (auto &txn : *resp) {
- BatchUserRequest request;
- KVRequest kv_request;
- if (request.ParseFromString(txn.second)) {
- // transactions
- for (auto &sub_req : request.user_requests()) {
- kv_request.ParseFromString(sub_req.request().data());
- std::string kv_request_json = ParseKVRequest(kv_request);
- }
-
- // see resilientdb/common/utils/utils.cpp
- first_commit_time_ = request.createtime() / 1000000;
- }
- }
- }
-
- uint64_t epoch_time =
- std::chrono::duration_cast<std::chrono::seconds>(
- std::chrono::system_clock::now().time_since_epoch())
- .count();
- uint64_t chain_age =
- first_commit_time_ == 0 ? 0 : epoch_time - first_commit_time_;
-
- auto block_num_resp = txn_client_.GetBlockNumbers();
- if (!block_num_resp.ok()) {
- LOG(ERROR) << "get number fail";
- exit(1);
- }
-
- std::string values = "";
- values.append(
- "[{ \"replicaNum\": " + std::to_string(replica_num) +
- ", \"workerNum\" : " + std::to_string(worker_num) +
- ", \"clientBatchNum\" : " + std::to_string(client_batch_num) +
- ", \"maxProcessTxn\" : " + std::to_string(max_process_txn) +
- ", \"clientBatchWaitTime\" : " +
- std::to_string(client_batch_wait_time) +
- ", \"inputWorkerNum\" : " + std::to_string(input_worker_num) +
- ", \"outputWorkerNum\" : " + std::to_string(output_worker_num) +
- ", \"clientTimeoutMs\" : " + std::to_string(client_timeout_ms) +
- ", \"minDataReceiveNum\" : " + std::to_string(min_data_receive_num) +
- ", \"maxMaliciousReplicaNum\" : " +
- std::to_string(max_malicious_replica_num) +
- ", \"checkpointWaterMark\" : " + std::to_string(checkpoint_water_mark) +
- ", \"transactionNum\" : " + std::to_string(num_transactions_) +
- ", \"blockNum\" : " + std::to_string(*block_num_resp) +
- ", \"chainAge\" : " + std::to_string(chain_age) + "}]");
- LOG(INFO) << std::string(values.c_str());
- res.set_header("Content-Type", "application/json");
- res.end(std::string(values.c_str()));
- });
+ // CROW_ROUTE(app, "/populatetable")
+ // ([this](const crow::request &req, response &res) {
+ // absl::StatusOr<ReplicaState> state_or = state_client_.GetReplicaState();
+ // if (!state_or.ok()) {
+ // LOG(ERROR) << "get state fail";
+ // res.set_header("Content-Type", "application/json");
+ // res.end("");
+ // return;
+ // }
+ //
+ // ResConfigData config_data = (*state_or).replica_config();
+ // ResDBConfig server_config(config_data, ReplicaInfo(), KeyInfo(),
+ // CertificateInfo());
+ //
+ // uint32_t replica_num = server_config.GetReplicaNum();
+ // uint32_t worker_num = server_config.GetWorkerNum();
+ // uint32_t client_batch_num = server_config.ClientBatchNum();
+ // uint32_t max_process_txn = server_config.GetMaxProcessTxn();
+ // uint32_t client_batch_wait_time = server_config.ClientBatchWaitTimeMS();
+ // uint32_t input_worker_num = server_config.GetInputWorkerNum();
+ // uint32_t output_worker_num = server_config.GetOutputWorkerNum();
+ // int client_timeout_ms = server_config.GetClientTimeoutMs();
+ // int min_data_receive_num = server_config.GetMinDataReceiveNum();
+ // size_t max_malicious_replica_num =
+ // server_config.GetMaxMaliciousReplicaNum();
+ // int checkpoint_water_mark = server_config.GetCheckPointWaterMark();
+ //
+ // // Don't read the ledger if first commit time is known
+ // if (first_commit_time_ == 0) {
+ // // Get first block in the chain
+ // auto resp = txn_client_.GetTxn(1, 1);
+ // // absl::StatusOr<std::vector<std::pair<uint64_t, std::string>>> GetTxn(
+ // // uint64_t min_seq, uint64_t max_seq);
+ // if (!resp.ok()) {
+ // LOG(ERROR) << "get replica state fail";
+ // res.end("get replica state fail");
+ // };
+ //
+ // for (auto &txn : *resp) {
+ // BatchUserRequest request;
+ // KVRequest kv_request;
+ // if (request.ParseFromString(txn.second)) {
+ // // transactions
+ // for (auto &sub_req : request.user_requests()) {
+ // kv_request.ParseFromString(sub_req.request().data());
+ // std::string kv_request_json = ParseKVRequest(kv_request);
+ // }
+ //
+ // // see resilientdb/common/utils/utils.cpp
+ // first_commit_time_ = request.createtime() / 1000000;
+ // }
+ // }
+ // }
+ //
+ // uint64_t epoch_time =
+ // std::chrono::duration_cast<std::chrono::seconds>(
+ // std::chrono::system_clock::now().time_since_epoch())
+ // .count();
+ // uint64_t chain_age =
+ // first_commit_time_ == 0 ? 0 : epoch_time - first_commit_time_;
+ //
+ // auto block_num_resp = txn_client_.GetBlockNumbers();
+ // if (!block_num_resp.ok()) {
+ // LOG(ERROR) << "get number fail";
+ // exit(1);
+ // }
+ //
+ // std::string values = "";
+ // values.append(
+ // "[{ \"replicaNum\": " + std::to_string(replica_num) +
+ // ", \"workerNum\" : " + std::to_string(worker_num) +
+ // ", \"clientBatchNum\" : " + std::to_string(client_batch_num) +
+ // ", \"maxProcessTxn\" : " + std::to_string(max_process_txn) +
+ // ", \"clientBatchWaitTime\" : " +
+ // std::to_string(client_batch_wait_time) +
+ // ", \"inputWorkerNum\" : " + std::to_string(input_worker_num) +
+ // ", \"outputWorkerNum\" : " + std::to_string(output_worker_num) +
+ // ", \"clientTimeoutMs\" : " + std::to_string(client_timeout_ms) +
+ // ", \"minDataReceiveNum\" : " + std::to_string(min_data_receive_num) +
+ // ", \"maxMaliciousReplicaNum\" : " +
+ // std::to_string(max_malicious_replica_num) +
+ // ", \"checkpointWaterMark\" : " + std::to_string(checkpoint_water_mark) +
+ // ", \"transactionNum\" : " + std::to_string(num_transactions_) +
+ // ", \"blockNum\" : " + std::to_string(*block_num_resp) +
+ // ", \"chainAge\" : " + std::to_string(chain_age) + "}]");
+ // LOG(INFO) << std::string(values.c_str());
+ // res.set_header("Content-Type", "application/json");
+ // res.end(std::string(values.c_str()));
+ // });
// Run the Crow app
app.port(port_num_).multithreaded().run();
}
-// If batch_size is 1, the function will not add the extra outer [] braces
-// Otherwise, a list of lists of blocks will be returned
-std::string CrowService::GetAllBlocks(int batch_size, bool increment_txn_count,
- bool make_sublists) {
- int min_seq = 1;
- bool full_batches = true;
-
- std::string values = "[\n";
- bool first_batch = true;
- while (full_batches) {
- std::string cur_batch_str = "";
- if (!first_batch) cur_batch_str.append(",\n");
- if (batch_size > 1 && make_sublists) cur_batch_str.append("[");
- first_batch = false;
-
- int max_seq = min_seq + batch_size - 1;
- auto resp = txn_client_.GetTxn(min_seq, max_seq);
- absl::StatusOr<std::vector<std::pair<uint64_t, std::string>>> GetTxn(
- uint64_t min_seq, uint64_t max_seq);
- if (!resp.ok()) {
- LOG(ERROR) << "get replica txn fail";
- return "";
- };
-
- int cur_size = 0;
- bool first_batch_element = true;
- for (auto &txn : *resp) {
- BatchUserRequest request;
- KVRequest kv_request;
- cur_size++;
- if (request.ParseFromString(txn.second)) {
- if (!first_batch_element) cur_batch_str.append(",");
-
- first_batch_element = false;
-
- // id
- uint64_t seq = txn.first;
- cur_batch_str.append("{\"id\": " + std::to_string(seq));
-
- // number
- cur_batch_str.append(", \"number\": \"" + std::to_string(seq) + "\"");
-
- // transactions
- cur_batch_str.append(", \"transactions\": [");
- bool first_transaction = true;
- for (auto &sub_req : request.user_requests()) {
- kv_request.ParseFromString(sub_req.request().data());
- std::string kv_request_json = ParseKVRequest(kv_request);
-
- if (!first_transaction) cur_batch_str.append(",");
- first_transaction = false;
- cur_batch_str.append(kv_request_json);
- cur_batch_str.append("\n");
-
- if (increment_txn_count) num_transactions_++;
- }
- cur_batch_str.append("]"); // close transactions list
-
- // size
- cur_batch_str.append(", \"size\": " +
- std::to_string(request.ByteSizeLong()));
-
- // createdAt
- uint64_t createtime = request.createtime();
- cur_batch_str.append(", \"createdAt\": \"" +
- ParseCreateTime(createtime) + "\"");
- }
- cur_batch_str.append("}\n");
- }
- full_batches = cur_size == batch_size;
- if (batch_size > 1 && make_sublists) cur_batch_str.append("]");
-
- if (cur_size > 0) values.append(cur_batch_str);
-
- min_seq += batch_size;
- }
-
- values.append("\n]\n");
-
- return values;
-}
+ // If batch_size is 1, the function will not add the extra outer [] braces
+ // Otherwise, a list of lists of blocks will be returned
+ // std::string CrowService::GetAllBlocks(int batch_size, bool increment_txn_count,
+ // bool make_sublists) {
+ // int min_seq = 1;
+ // bool full_batches = true;
+ //
+ // std::string values = "[\n";
+ // bool first_batch = true;
+ // while (full_batches) {
+ // std::string cur_batch_str = "";
+ // if (!first_batch) cur_batch_str.append(",\n");
+ // if (batch_size > 1 && make_sublists) cur_batch_str.append("[");
+ // first_batch = false;
+ //
+ // int max_seq = min_seq + batch_size - 1;
+ // auto resp = txn_client_.GetTxn(min_seq, max_seq);
+ // absl::StatusOr<std::vector<std::pair<uint64_t, std::string>>> GetTxn(
+ // uint64_t min_seq, uint64_t max_seq);
+ // if (!resp.ok()) {
+ // LOG(ERROR) << "get replica txn fail";
+ // return "";
+ // };
+ //
+ // int cur_size = 0;
+ // bool first_batch_element = true;
+ // for (auto &txn : *resp) {
+ // BatchUserRequest request;
+ // KVRequest kv_request;
+ // cur_size++;
+ // if (request.ParseFromString(txn.second)) {
+ // if (!first_batch_element) cur_batch_str.append(",");
+ //
+ // first_batch_element = false;
+ //
+ // // id
+ // uint64_t seq = txn.first;
+ // cur_batch_str.append("{\"id\": " + std::to_string(seq));
+ //
+ // // number
+ // cur_batch_str.append(", \"number\": \"" + std::to_string(seq) + "\"");
+ //
+ // // transactions
+ // cur_batch_str.append(", \"transactions\": [");
+ // bool first_transaction = true;
+ // for (auto &sub_req : request.user_requests()) {
+ // kv_request.ParseFromString(sub_req.request().data());
+ // std::string kv_request_json = ParseKVRequest(kv_request);
+ //
+ // if (!first_transaction) cur_batch_str.append(",");
+ // first_transaction = false;
+ // cur_batch_str.append(kv_request_json);
+ // cur_batch_str.append("\n");
+ //
+ // if (increment_txn_count) num_transactions_++;
+ // }
+ // cur_batch_str.append("]"); // close transactions list
+ //
+ // // size
+ // cur_batch_str.append(", \"size\": " +
+ // std::to_string(request.ByteSizeLong()));
+ //
+ // // createdAt
+ // uint64_t createtime = request.createtime();
+ // cur_batch_str.append(", \"createdAt\": \"" +
+ // ParseCreateTime(createtime) + "\"");
+ // }
+ // cur_batch_str.append("}\n");
+ // }
+ // full_batches = cur_size == batch_size;
+ // if (batch_size > 1 && make_sublists) cur_batch_str.append("]");
+ //
+ // if (cur_size > 0) values.append(cur_batch_str);
+ //
+ // min_seq += batch_size;
+ // }
+ //
+ // values.append("\n]\n");
+ //
+ // return values;
+ // }
// Helper function used by the blocks endpoints to create JSON strings
std::string CrowService::ParseKVRequest(const KVRequest &kv_request) {
diff --git a/ecosystem/graphql/service/http_server/crow_service.h b/ecosystem/graphql/service/http_server/crow_service.h
index 162968e2..b581cb7e 100644
--- a/ecosystem/graphql/service/http_server/crow_service.h
+++ b/ecosystem/graphql/service/http_server/crow_service.h
@@ -48,7 +48,6 @@ class CrowService {
uint16_t port_num_;
ResDBKVClient kv_client_;
resdb::ResDBStateAccessor state_client_;
- resdb::ResDBTxnAccessor txn_client_;
std::unordered_set<crow::websocket::connection *> users;
std::atomic_uint16_t num_transactions_ = 0;
std::atomic_uint64_t first_commit_time_ = 0;
diff --git a/ecosystem/graphql/service/http_server/server_config.config b/ecosystem/graphql/service/http_server/server_config.config
index 58551cc5..c1054dda 100644
--- a/ecosystem/graphql/service/http_server/server_config.config
+++ b/ecosystem/graphql/service/http_server/server_config.config
@@ -15,8 +15,25 @@
// specific language governing permissions and limitations
// under the License.
-
-1 127.0.0.1 10001
-2 127.0.0.1 10002
-3 127.0.0.1 10003
-4 127.0.0.1 10004
+{
+ replica_info : {
+ id:1,
+ ip:"127.0.0.1",
+ port: 10001,
+ },
+ replica_info : {
+ id:2,
+ ip:"127.0.0.1",
+ port: 10002,
+ },
+ replica_info : {
+ id:3,
+ ip:"127.0.0.1",
+ port: 10003,
+ },
+ replica_info : {
+ id:4,
+ ip:"127.0.0.1",
+ port: 10004,
+ }
+}
\ No newline at end of file
diff --git a/ecosystem/graphql/service/tools/config/interface/client.config b/ecosystem/graphql/service/tools/config/interface/client.config
index 1334de2b..6d338f8b 100644
--- a/ecosystem/graphql/service/tools/config/interface/client.config
+++ b/ecosystem/graphql/service/tools/config/interface/client.config
@@ -15,4 +15,13 @@
// specific language governing permissions and limitations
// under the License.
-5 127.0.0.1 10005
+{
+ "replica_info": [
+ {
+ "id": 5,
+ "ip": "127.0.0.1",
+ "port": 10005
+ },
+ ]
+}
+
diff --git a/ecosystem/graphql/service/tools/config/interface/service.config b/ecosystem/graphql/service/tools/config/interface/service.config
index 3d1f8e9c..6027aa7f 100644
--- a/ecosystem/graphql/service/tools/config/interface/service.config
+++ b/ecosystem/graphql/service/tools/config/interface/service.config
@@ -15,6 +15,15 @@
// specific language governing permissions and limitations
// under the License.
-5 127.0.0.1 10005
+{
+ "replica_info": [
+ {
+ "id": 5,
+ "ip": "127.0.0.1",
+ "port": 10005
+ },
+ ]
+}
+
diff --git a/ecosystem/graphql/third_party/BUILD b/ecosystem/graphql/third_party/BUILD
index 25da0d1f..f10e8899 100644
--- a/ecosystem/graphql/third_party/BUILD
+++ b/ecosystem/graphql/third_party/BUILD
@@ -35,3 +35,10 @@ cc_library(
"@rapidjson",
],
)
+
+cc_library(
+ name = "json",
+ deps = [
+ "@nlohmann_json//:json",
+ ],
+)
diff --git a/ecosystem/graphql/third_party/BUILD b/ecosystem/graphql/third_party/json.BUILD
similarity index 78%
copy from ecosystem/graphql/third_party/BUILD
copy to ecosystem/graphql/third_party/json.BUILD
index 25da0d1f..f0fd8e0b 100644
--- a/ecosystem/graphql/third_party/BUILD
+++ b/ecosystem/graphql/third_party/json.BUILD
@@ -16,22 +16,15 @@
# specific language governing permissions and limitations
# under the License.
#
-#
-
-package(default_visibility = ["//visibility:public"])
-load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make", "make")
+licenses(["notice"])
+exports_files(["LICENSE"])
-cc_library(
- name = "crow",
- deps = [
- "@com_crowcpp_crow//:crow",
- ],
-)
+package(default_visibility = ["//visibility:public"])
cc_library(
- name = "rapidjson",
- deps = [
- "@rapidjson",
- ],
-)
+ name = "json",
+ hdrs = glob(["single_include/nlohmann/*.hpp"]),
+ includes = ["single_include"],
+ visibility = ["//visibility:public"],
+)
\ No newline at end of file
diff --git a/service/tools/config/interface/service.config b/service/tools/config/interface/service.config
index a437dbc7..70bad59b 100644
--- a/service/tools/config/interface/service.config
+++ b/service/tools/config/interface/service.config
@@ -1,3 +1,4 @@
+
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
@@ -16,13 +17,11 @@
// under the License.
{
-"replica_info":[
-{
-"id":5,
-"ip":"127.0.0.1",
-"port":17005
-}
-]
+ "replica_info": [
+ {
+ "id": 5,
+ "ip": "127.0.0.1",
+ "port": 10005
+ },
+ ]
}
-
-
diff --git a/service/tools/config/server.config b/service/tools/config/server.config
index 756dc00f..a68d1cec 100644
--- a/service/tools/config/server.config
+++ b/service/tools/config/server.config
@@ -1,21 +1,5 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-1 127.0.0.1 20001
-2 127.0.0.1 20002
-3 127.0.0.1 20003
-4 127.0.0.1 20004
+1 127.0.0.1 10001
+2 127.0.0.1 10002
+3 127.0.0.1 10003
+4 127.0.0.1 10004
diff --git a/service/tools/config/server/server.config b/service/tools/config/server/server.config
index 9aa3e6fd..978deff8 100644
--- a/service/tools/config/server/server.config
+++ b/service/tools/config/server/server.config
@@ -46,10 +46,14 @@
enable_block_cache: true,
block_cache_capacity: 100
},
- require_txn_validation:true,
- enable_viewchange:false,
- enable_resview:true,
- enable_faulty_switch:false
-}
-
-
+ clientBatchNum: 100,
+ enable_viewchange: true,
+ enable_resview: true,
+ enable_faulty_switch: true,
+ recovery_enabled: true,
+ max_client_complaint_num: 10,
+ max_process_txn: 2048,
+ worker_num: 2,
+ input_worker_num: 1,
+ output_worker_num: 10
+}
\ No newline at end of file
diff --git a/service/tools/kv/server_tools/generate_config.sh b/service/tools/kv/server_tools/generate_config.sh
index 5f494434..14641d70 100755
--- a/service/tools/kv/server_tools/generate_config.sh
+++ b/service/tools/kv/server_tools/generate_config.sh
@@ -28,7 +28,7 @@ iplist=(
WORKSPACE=$PWD
CERT_PATH=$PWD/service/tools/data/cert/
CONFIG_PATH=$PWD/service/tools/config/
-PORT_BASE=20000
+PORT_BASE=10000
CLIENT_NUM=1
./service/tools/config/generate_config.sh ${WORKSPACE} ${CERT_PATH} ${CERT_PATH} ${CONFIG_PATH} ${CERT_PATH} ${CLIENT_NUM} ${PORT_BASE} ${iplist[@]}
diff --git a/service/tools/kv/server_tools/start_replica.sh b/service/tools/kv/server_tools/start_replica.sh
new file mode 100755
index 00000000..a2af1615
--- /dev/null
+++ b/service/tools/kv/server_tools/start_replica.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# Usage: ./start_replica.sh <replica_number>
+# Example: ./start_replica.sh 1 (starts node 1 on port 8090)
+
+if [ -z "$1" ]; then
+ echo "Usage: $0 <replica_number>"
+ echo "Example: $0 1 (starts replica 1)"
+ echo " $0 2 (starts replica 2)"
+ echo " $0 3 (starts replica 3)"
+ echo " $0 4 (starts replica 4)"
+ echo " $0 5 (starts replica 5)"
+ exit 1
+fi
+
+REPLICA_NUM=$1
+
+# Validate replica number
+if ! [[ "$REPLICA_NUM" =~ ^[1-5]$ ]]; then
+ echo "Error: Replica number must be between 1 and 5"
+ exit 1
+fi
+
+SERVER_PATH=./bazel-bin/service/kv/kv_service
+SERVER_CONFIG=service/tools/config/server/server.config
+WORK_PATH=$PWD
+CERT_PATH=${WORK_PATH}/service/tools/data/cert/
+PORT=$((8089 + REPLICA_NUM))
+LOG_FILE="server$((REPLICA_NUM - 1)).log"
+
+echo "Starting replica $REPLICA_NUM on port $PORT..."
+echo "Log file: $LOG_FILE"
+
+# Build if binary doesn't exist
+if [ ! -f "$SERVER_PATH" ]; then
+ echo "Building kv_service..."
+ bazel build //service/kv:kv_service --define enable_leveldb=True
+fi
+
+# Start the replica
+nohup $SERVER_PATH $SERVER_CONFIG $CERT_PATH/node${REPLICA_NUM}.key.pri $CERT_PATH/cert_${REPLICA_NUM}.cert $PORT > $LOG_FILE &
+
+echo "Replica $REPLICA_NUM started with PID: $!"
diff --git a/service/tools/kv/server_tools/stop_replica.sh b/service/tools/kv/server_tools/stop_replica.sh
new file mode 100644
index 00000000..67cd3cce
--- /dev/null
+++ b/service/tools/kv/server_tools/stop_replica.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Kill a specific replica or all kv_service processes
+# Usage: ./stop_replica.sh [replica_number]
+# Example: ./stop_replica.sh 1 (kills only replica 1)
+# ./stop_replica.sh (kills all replicas)
+#
+
+if [ -z "$1" ]; then
+ echo "Killing all kv_service processes..."
+ killall -9 kv_service
+ echo "Done"
+else
+ REPLICA_NUM=$1
+ if ! [[ "$REPLICA_NUM" =~ ^[1-5]$ ]]; then
+ echo "Error: Replica number must be between 1 and 5"
+ exit 1
+ fi
+
+ PORT=$((8089 + REPLICA_NUM))
+ echo "Killing kv_service on port $PORT (replica $REPLICA_NUM)..."
+
+ # Find and kill process on specific port
+ PID=$(lsof -i :$PORT -t 2>/dev/null)
+ if [ -z "$PID" ]; then
+ echo "No process found on port $PORT"
+ else
+ kill -9 $PID
+ echo "Killed PID: $PID"
+ fi
+fi