Skip to content
This repository has been archived by the owner on Mar 3, 2020. It is now read-only.

Commit

Permalink
KEP-1146 Add request latency stat
Browse files Browse the repository at this point in the history
  • Loading branch information
ebruck committed May 21, 2019
1 parent 16a7645 commit 0617c03
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 9 deletions.
5 changes: 5 additions & 0 deletions pbft/database_pbft_service.cpp
Expand Up @@ -29,10 +29,12 @@ database_pbft_service::database_pbft_service(
std::shared_ptr<bzn::asio::io_context_base> io_context,
std::shared_ptr<bzn::storage_base> unstable_storage,
std::shared_ptr<bzn::crud_base> crud,
std::shared_ptr<bzn::monitor_base> monitor,
bzn::uuid_t uuid)
: io_context(std::move(io_context))
, unstable_storage(std::move(unstable_storage))
, crud(std::move(crud))
, monitor(std::move(monitor))
, uuid(std::move(uuid))
{
this->load_next_request_sequence();
Expand Down Expand Up @@ -143,6 +145,9 @@ database_pbft_service::process_awaiting_operations()
this->crud->handle_request(op_it->second->get_request().sender(), request, nullptr);
}

// update stats...
this->monitor->finish_timer(bzn::statistic::request_latency, op_it->second->get_request_hash());

if (this->next_request_sequence == this->next_checkpoint)
{
if (this->crud->save_state())
Expand Down
3 changes: 3 additions & 0 deletions pbft/database_pbft_service.hpp
Expand Up @@ -18,6 +18,7 @@
#include <crud/crud_base.hpp>
#include <pbft/pbft_failure_detector_base.hpp>
#include <pbft/pbft_service_base.hpp>
#include <monitor/monitor_base.hpp>
#include <storage/storage_base.hpp>
#include <memory>

Expand All @@ -30,6 +31,7 @@ namespace bzn
database_pbft_service(std::shared_ptr<bzn::asio::io_context_base> io_context,
std::shared_ptr<bzn::storage_base> unstable_storage,
std::shared_ptr<bzn::crud_base> crud,
std::shared_ptr<bzn::monitor_base> monitor,
bzn::uuid_t uuid);

virtual ~database_pbft_service();
Expand Down Expand Up @@ -61,6 +63,7 @@ namespace bzn
std::shared_ptr<bzn::asio::io_context_base> io_context;
std::shared_ptr<bzn::storage_base> unstable_storage;
std::shared_ptr<bzn::crud_base> crud;
std::shared_ptr<bzn::monitor_base> monitor;
uint64_t next_request_sequence = 1;
const bzn::uuid_t uuid;

Expand Down
24 changes: 16 additions & 8 deletions pbft/test/database_pbft_service_test.cpp
Expand Up @@ -14,6 +14,7 @@
#include <mocks/mock_boost_asio_beast.hpp>
#include <mocks/mock_storage_base.hpp>
#include <mocks/mock_session_base.hpp>
#include <mocks/mock_monitor.hpp>
#include <pbft/database_pbft_service.hpp>
#include <pbft/operations/pbft_memory_operation.hpp>
#include <storage/mem_storage.hpp>
Expand All @@ -36,7 +37,7 @@ TEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_d
EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok));
EXPECT_CALL(*mock_storage, update(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok));

bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), TEST_UUID);
bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID);
}


Expand All @@ -47,7 +48,7 @@ TEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_e
EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>("123")));
EXPECT_CALL(*mock_storage, update(_, _, "123")).WillOnce(Return(bzn::storage_result::ok));

bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), TEST_UUID);
bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID);
}


Expand All @@ -58,7 +59,7 @@ TEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_d
EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>()));
EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::value_too_large));

EXPECT_THROW(bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), TEST_UUID), std::runtime_error);
EXPECT_THROW(bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID), std::runtime_error);
}


Expand All @@ -69,7 +70,7 @@ TEST(database_pbft_service, test_that_failed_storing_of_operation_does_not_throw
EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional<bzn::value_t>()));
EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok));

bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), TEST_UUID);
bzn::database_pbft_service dps(std::make_shared<bzn::asio::mock_io_context_base>(), mock_storage, std::make_shared<bzn::mock_crud_base>(), nullptr, TEST_UUID);

EXPECT_CALL(*mock_storage, create(_, _, _)).WillOnce(Return(bzn::storage_result::exists));
EXPECT_CALL(*mock_storage, update(_, _, _)).WillOnce(Return(bzn::storage_result::ok));
Expand All @@ -91,7 +92,11 @@ TEST(database_pbft_service, test_that_executed_operation_fires_callback_with_ope

EXPECT_CALL(*mock_io_context, post(_)).WillOnce(InvokeArgument<0>());

bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, TEST_UUID);
auto mock_monitor = std::make_shared<bzn::mock_monitor>();

EXPECT_CALL(*mock_monitor, finish_timer(bzn::statistic::request_latency, "somehash"));

bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, mock_monitor, TEST_UUID);

auto operation = std::make_shared<bzn::pbft_memory_operation>(0, 1, "somehash", nullptr);
bool execute_handler_called_with_operation = false;
Expand Down Expand Up @@ -126,7 +131,7 @@ TEST(database_pbft_service, test_that_apply_operation_now_is_handled)
auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();
auto mock_crud = std::make_shared<bzn::mock_crud_base>();

bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, TEST_UUID);
bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, nullptr, TEST_UUID);

// requires pbft...
{
Expand Down Expand Up @@ -164,8 +169,9 @@ TEST(database_pbft_service, test_that_stored_operation_is_executed_in_order_and_
auto mem_storage = std::make_shared<bzn::mem_storage>();
auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();
auto mock_crud = std::make_shared<bzn::mock_crud_base>();
auto mock_monitor = std::make_shared<bzn::mock_monitor>();

bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, TEST_UUID);
bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, mock_monitor, TEST_UUID);

database_msg msg;
msg.mutable_header()->set_db_uuid(TEST_UUID);
Expand Down Expand Up @@ -242,6 +248,8 @@ TEST(database_pbft_service, test_that_stored_operation_is_executed_in_order_and_
}));
}

EXPECT_CALL(*mock_monitor, finish_timer(bzn::statistic::request_latency, _)).Times(3);

dps.apply_operation(operation1);

ASSERT_EQ(uint64_t(3), dps.applied_requests_count());
Expand Down Expand Up @@ -276,7 +284,7 @@ TEST(database_pbft_service, test_that_set_state_catches_up_backlogged_operations
auto mock_io_context = std::make_shared<bzn::asio::mock_io_context_base>();
auto mock_crud = std::make_shared<bzn::mock_crud_base>();

bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, TEST_UUID);
bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, std::make_shared<NiceMock<bzn::mock_monitor>>(), TEST_UUID);

test::do_operation(99, dps);
test::do_operation(100, dps);
Expand Down
2 changes: 1 addition & 1 deletion swarm/main.cpp
Expand Up @@ -303,7 +303,7 @@ main(int argc, const char* argv[])
auto operation_manager = std::make_shared<bzn::pbft_operation_manager>(unstable_storage);

auto pbft = std::make_shared<bzn::pbft>(node, io_context, peers.get_peers(), options,
std::make_shared<bzn::database_pbft_service>(io_context, unstable_storage, crud, options->get_uuid())
std::make_shared<bzn::database_pbft_service>(io_context, unstable_storage, crud, monitor, options->get_uuid())
,failure_detector, crypto, operation_manager, unstable_storage, monitor);

pbft->set_audit_enabled(options->get_simple_options().get<bool>(bzn::option_names::AUDIT_ENABLED));
Expand Down

0 comments on commit 0617c03

Please sign in to comment.