diff options
author | Determinant <[email protected]> | 2018-09-10 20:50:26 -0400 |
---|---|---|
committer | Determinant <[email protected]> | 2018-09-10 20:50:26 -0400 |
commit | 570f335740f152e8042d717b0bf39f2e6cc5effa (patch) | |
tree | d21fffc5209fad03bc5ac81f4fee3d3e887dac22 /src/hotstuff_app.cpp | |
parent | 8d5449339d3dacc31c614e27669ce6eb9eb11960 (diff) | |
parent | c4d3e5fe66568ccd0732edf7cf80d37959d6abda (diff) |
Merge branch 'master' of /home/ymf/lwork/hot-stuff/code
Diffstat (limited to 'src/hotstuff_app.cpp')
-rw-r--r-- | src/hotstuff_app.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/hotstuff_app.cpp b/src/hotstuff_app.cpp index 87c80e3..014fe16 100644 --- a/src/hotstuff_app.cpp +++ b/src/hotstuff_app.cpp @@ -61,11 +61,13 @@ class HotStuffApp: public HotStuff { /** The listen address for client RPC */ NetAddr clisten_addr; + std::unordered_map<const uint256_t, promise_t> unconfirmed; + using Conn = ClientNetwork<opcode_t>::Conn; void client_request_cmd_handler(MsgReqCmd &&, Conn &); - command_t parse_cmd(DataStream &s) override { + static command_t parse_cmd(DataStream &s) { auto cmd = new CommandDummy(); s >> *cmd; return cmd; @@ -81,6 +83,12 @@ class HotStuffApp: public HotStuff { #ifndef HOTSTUFF_ENABLE_BENCHMARK HOTSTUFF_LOG_INFO("replicated %s", std::string(fin).c_str()); #endif + auto it = unconfirmed.find(fin.cmd_hash); + if (it != unconfirmed.end()) + { + it->second.resolve(fin); + unconfirmed.erase(it); + } } public: @@ -244,13 +252,26 @@ HotStuffApp::HotStuffApp(uint32_t blk_size, void HotStuffApp::client_request_cmd_handler(MsgReqCmd &&msg, Conn &conn) { const NetAddr addr = conn.get_addr(); - msg.postponed_parse(this); - auto cmd = msg.cmd; + auto cmd = parse_cmd(msg.serialized); + const auto &cmd_hash = cmd->get_hash(); std::vector<promise_t> pms; HOTSTUFF_LOG_DEBUG("processing %s", std::string(*cmd).c_str()); - exec_command(cmd).then([this, addr](Finality fin) { - cn.send_msg(MsgRespCmd(fin), addr); - }); + // record the data of the command + storage->add_cmd(cmd); + if (get_pace_maker().get_proposer() == get_id()) + exec_command(cmd_hash).then([this, addr](Finality fin) { + cn.send_msg(MsgRespCmd(fin), addr); + }); + else + { + auto it = unconfirmed.find(cmd_hash); + if (it == unconfirmed.end()) + it = unconfirmed.insert( + std::make_pair(cmd_hash, promise_t([](promise_t &){}))).first; + it->second.then([this, addr](const Finality &fin) { + cn.send_msg(MsgRespCmd(std::move(fin)), addr); + }); + } } void HotStuffApp::start() { |