Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Commit

Permalink
Skeleton of db_plugin created #172
Browse files Browse the repository at this point in the history
  • Loading branch information
heifner committed Oct 6, 2017
1 parent af37612 commit 637ae0d
Show file tree
Hide file tree
Showing 10 changed files with 338 additions and 5 deletions.
16 changes: 15 additions & 1 deletion libraries/chain/chain_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,9 @@ void chain_controller::_apply_block(const signed_block& next_block)
// notify observers that the block has been applied
// TODO: do this outside the write lock...?
applied_block( next_block ); //emit
if (_currently_replaying_blocks)
applied_irreversible_block(next_block);


} FC_CAPTURE_AND_RETHROW( (next_block.block_num()) ) }

Expand Down Expand Up @@ -1167,9 +1170,13 @@ void chain_controller::initialize_chain(chain_initializer_interface& starter)
} FC_CAPTURE_AND_RETHROW() }

chain_controller::chain_controller(database& database, fork_database& fork_db, block_log& blocklog,
chain_initializer_interface& starter, unique_ptr<chain_administration_interface> admin)
chain_initializer_interface& starter, unique_ptr<chain_administration_interface> admin,
const applied_irreverisable_block_func& applied_func)
: _db(database), _fork_db(fork_db), _block_log(blocklog), _admin(std::move(admin)) {

if (applied_func)
applied_irreversible_block.connect(*applied_func);

initialize_indexes();
starter.register_types(*this, _db);

Expand All @@ -1194,6 +1201,12 @@ chain_controller::~chain_controller() {
void chain_controller::replay() {
ilog("Replaying blockchain");
auto start = fc::time_point::now();

auto on_exit = fc::make_scoped_exit([this](){
_currently_replaying_blocks = false;
});
_currently_replaying_blocks = true;

auto last_block = _block_log.read_head();
if (!last_block) {
elog("No blocks in block log; skipping replay");
Expand Down Expand Up @@ -1353,6 +1366,7 @@ void chain_controller::update_last_irreversible_block()
auto block = fetch_block_by_number(block_to_write);
assert(block);
_block_log.append(*block);
applied_irreversible_block(*block);
}

// Trim fork_database and undo histories
Expand Down
14 changes: 13 additions & 1 deletion libraries/chain/include/eos/chain/chain_controller.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
namespace eos { namespace chain {
using database = chainbase::database;
using boost::signals2::signal;
using applied_irreverisable_block_func = fc::optional<signal<void(const signed_block&)>::slot_type>;
struct path_cons_list;

/**
Expand All @@ -56,7 +57,8 @@ namespace eos { namespace chain {
class chain_controller {
public:
chain_controller(database& database, fork_database& fork_db, block_log& blocklog,
chain_initializer_interface& starter, unique_ptr<chain_administration_interface> admin);
chain_initializer_interface& starter, unique_ptr<chain_administration_interface> admin,
const applied_irreverisable_block_func& applied_func = {});
chain_controller(chain_controller&&) = default;
~chain_controller();

Expand All @@ -70,6 +72,15 @@ namespace eos { namespace chain {
*/
signal<void(const signed_block&)> applied_block;

/**
* This signal is emitted after irreversible block is written to disk.
*
* You may not yield from this callback because the blockchain is holding
* the write lock and may be in an "inconstant state" until after it is
* released.
*/
signal<void(const signed_block&)> applied_irreversible_block;

/**
* This signal is emitted any time a new transaction is added to the pending
* block state.
Expand Down Expand Up @@ -377,6 +388,7 @@ namespace eos { namespace chain {
deque<SignedTransaction> _pending_transactions;

bool _currently_applying_block = false;
bool _currently_replaying_blocks = false;
uint64_t _skip_flags = 0;

flat_map<uint32_t,block_id_type> _checkpoints;
Expand Down
1 change: 1 addition & 0 deletions plugins/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ add_subdirectory(net_plugin)
#add_subdirectory(p2p_plugin)
add_subdirectory(http_plugin)
add_subdirectory(database_plugin)
add_subdirectory(db_plugin)
add_subdirectory(chain_plugin)
add_subdirectory(chain_api_plugin)
add_subdirectory(producer_plugin)
Expand Down
2 changes: 1 addition & 1 deletion plugins/chain_plugin/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ add_library( chain_plugin
chain_plugin.cpp
${HEADERS} )

target_link_libraries( chain_plugin database_plugin eos_native_contract eos_chain appbase )
target_link_libraries( chain_plugin database_plugin db_plugin eos_native_contract eos_chain appbase )
target_include_directories( chain_plugin PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" )

install( TARGETS
Expand Down
15 changes: 14 additions & 1 deletion plugins/chain_plugin/chain_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <eos/chain/config.hpp>
#include <eos/chain/types.hpp>

#include <eos/db_plugin/db_plugin.hpp>

#include <eos/native_contract/native_contract_chain_initializer.hpp>
#include <eos/native_contract/native_contract_chain_administrator.hpp>
#include <eos/native_contract/staked_balance_objects.hpp>
Expand Down Expand Up @@ -108,10 +110,16 @@ void chain_plugin::plugin_initialize(const variables_map& options) {
if (options.at("replay-blockchain").as<bool>()) {
ilog("Replay requested: wiping database");
app().get_plugin<database_plugin>().wipe_database();
if (db_plugin* db = app().find_plugin<db_plugin>()) {
db->wipe_database();
}
}
if (options.at("resync-blockchain").as<bool>()) {
ilog("Resync requested: wiping blocks");
app().get_plugin<database_plugin>().wipe_database();
if (db_plugin* db = app().find_plugin<db_plugin>()) {
db->wipe_database();
}
fc::remove_all(my->block_log_dir);
}
if (options.at("skip-transaction-signatures").as<bool>()) {
Expand Down Expand Up @@ -144,6 +152,11 @@ void chain_plugin::plugin_initialize(const variables_map& options) {
void chain_plugin::plugin_startup()
{ try {
auto& db = app().get_plugin<database_plugin>().db();
eos::chain::applied_irreverisable_block_func applied_func;
if (db_plugin* plugin = app().find_plugin<db_plugin>()) {
ilog("Blockchain configured with external database.");
applied_func = [plugin](const chain::signed_block& b) { plugin->applied_irreversible_block(b); };
}

FC_ASSERT( fc::exists( my->genesis_file ),
"unable to find genesis file '${f}', check --genesis-json argument",
Expand All @@ -160,7 +173,7 @@ void chain_plugin::plugin_startup()
my->block_logger = block_log(my->block_log_dir);
my->chain_id = genesis.compute_chain_id();
my->chain = chain_controller(db, *my->fork_db, *my->block_logger,
initializer, native_contract::make_administrator());
initializer, native_contract::make_administrator(), applied_func);

if(!my->readonly) {
ilog("starting chain in read/write mode");
Expand Down
16 changes: 16 additions & 0 deletions plugins/db_plugin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
file(GLOB HEADERS "include/eos/db_plugin/*.hpp")
add_library( db_plugin
db_plugin.cpp
${HEADERS} )

target_link_libraries( db_plugin chain_plugin eos_chain appbase )
target_include_directories( db_plugin PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" )

install( TARGETS
db_plugin

RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
install( FILES ${HEADERS} DESTINATION "include/eos/db_plugin" )
Loading

0 comments on commit 637ae0d

Please sign in to comment.