diff --git a/libraries/net/include/graphene/net/peer_database.hpp b/libraries/net/include/graphene/net/peer_database.hpp index 89765a20..523cce9f 100644 --- a/libraries/net/include/graphene/net/peer_database.hpp +++ b/libraries/net/include/graphene/net/peer_database.hpp @@ -102,8 +102,6 @@ namespace graphene { namespace net { potential_peer_record lookup_or_create_entry_for_endpoint(const fc::ip::endpoint& endpointToLookup); fc::optional lookup_entry_for_endpoint(const fc::ip::endpoint& endpointToLookup); - std::vector get_all()const; - typedef detail::peer_database_iterator iterator; iterator begin() const; iterator end() const; diff --git a/libraries/net/node.cpp b/libraries/net/node.cpp index a0570f1b..45aa03c3 100644 --- a/libraries/net/node.cpp +++ b/libraries/net/node.cpp @@ -400,7 +400,7 @@ namespace graphene { namespace net { namespace detail { fc::sha256 _chain_id; #define NODE_CONFIGURATION_FILENAME "node_config.json" -#define POTENTIAL_PEER_DATABASE_FILENAME "peers.leveldb" +#define POTENTIAL_PEER_DATABASE_FILENAME "peers.json" fc::path _node_configuration_directory; node_configuration _node_configuration; @@ -3596,6 +3596,19 @@ namespace graphene { namespace net { namespace detail { { VERIFY_CORRECT_THREAD(); + try + { + _potential_peer_db.close(); + } + catch ( const fc::exception& e ) + { + wlog( "Exception thrown while closing P2P peer database, ignoring: ${e}", ("e",e) ); + } + catch (...) + { + wlog( "Exception thrown while closing P2P peer database, ignoring" ); + } + // First, stop accepting incoming network connections try { diff --git a/libraries/net/peer_database.cpp b/libraries/net/peer_database.cpp index 4ba0273b..008bc05e 100644 --- a/libraries/net/peer_database.cpp +++ b/libraries/net/peer_database.cpp @@ -28,7 +28,6 @@ #include #include -//#include @@ -37,49 +36,25 @@ namespace graphene { namespace net { { using namespace boost::multi_index; - struct potential_peer_database_entry - { - uint32_t database_key; - potential_peer_record peer_record; - - potential_peer_database_entry(uint32_t database_key, const potential_peer_record& peer_record) : - database_key(database_key), - peer_record(peer_record) - {} - potential_peer_database_entry(const potential_peer_database_entry& other) : - database_key(other.database_key), - peer_record(other.peer_record) - {} - - const fc::time_point_sec& get_last_seen_time() const { return peer_record.last_seen_time; } - const fc::ip::endpoint& get_endpoint() const { return peer_record.endpoint; } - }; - class peer_database_impl { public: struct last_seen_time_index {}; struct endpoint_index {}; - typedef boost::multi_index_container< potential_peer_database_entry, - indexed_by< ordered_non_unique< tag, - const_mem_fun< potential_peer_database_entry, - const fc::time_point_sec&, - &potential_peer_database_entry::get_last_seen_time> - >, - hashed_unique< tag, - const_mem_fun< potential_peer_database_entry, - const fc::ip::endpoint&, - &potential_peer_database_entry::get_endpoint - >, - std::hash - > - > - > potential_peer_set; - //private: - //typedef graphene::db::level_pod_map potential_peer_leveldb; - //potential_peer_leveldb _leveldb; + typedef boost::multi_index_container, + member >, + hashed_unique, + member, + std::hash > > > potential_peer_set; + private: potential_peer_set _potential_peer_set; + fc::path _peer_database_filename; public: void open(const fc::path& databaseFilename); @@ -104,65 +79,54 @@ namespace graphene { namespace net { _iterator(iterator) {} }; - peer_database_iterator::peer_database_iterator( const peer_database_iterator& c ) - :boost::iterator_facade(c){} + peer_database_iterator::peer_database_iterator( const peer_database_iterator& c ) : + boost::iterator_facade(c){} - void peer_database_impl::open(const fc::path& databaseFilename) + void peer_database_impl::open(const fc::path& peer_database_filename) { - /* - try + _peer_database_filename = peer_database_filename; + if (fc::exists(_peer_database_filename)) { - _leveldb.open(databaseFilename); - } - catch (const graphene::db::level_pod_map_open_failure&) - { - fc::remove_all(databaseFilename); - _leveldb.open(databaseFilename); - } - - _potential_peer_set.clear(); - - for (auto iter = _leveldb.begin(); iter.valid(); ++iter) - _potential_peer_set.insert(potential_peer_database_entry(iter.key(), iter.value())); -#define MAXIMUM_PEERDB_SIZE 1000 - if (_potential_peer_set.size() > MAXIMUM_PEERDB_SIZE) - { - // prune database to a reasonable size - auto iter = _potential_peer_set.begin(); - std::advance(iter, MAXIMUM_PEERDB_SIZE); - while (iter != _potential_peer_set.end()) + try { - _leveldb.remove(iter->database_key); - iter = _potential_peer_set.erase(iter); + std::vector peer_records = fc::json::from_file(_peer_database_filename).as >(); + std::copy(peer_records.begin(), peer_records.end(), std::inserter(_potential_peer_set, _potential_peer_set.end())); +#define MAXIMUM_PEERDB_SIZE 1000 + if (_potential_peer_set.size() > MAXIMUM_PEERDB_SIZE) + { + // prune database to a reasonable size + auto iter = _potential_peer_set.begin(); + std::advance(iter, MAXIMUM_PEERDB_SIZE); + _potential_peer_set.erase(iter, _potential_peer_set.end()); + } + } + catch (const fc::exception& e) + { + elog("error opening peer database file ${peer_database_filename}, starting with a clean database", + ("peer_database_filename", _peer_database_filename)); } } - */ } void peer_database_impl::close() { - //_leveldb.close(); + std::vector peer_records; + peer_records.reserve(_potential_peer_set.size()); + std::copy(_potential_peer_set.begin(), _potential_peer_set.end(), std::back_inserter(peer_records)); + try + { + fc::json::save_to_file(peer_records, _peer_database_filename); + } + catch (const fc::exception& e) + { + elog("error saving peer database to file ${peer_database_filename}", + ("peer_database_filename", _peer_database_filename)); + } _potential_peer_set.clear(); } void peer_database_impl::clear() { - /* - auto iter = _leveldb.begin(); - while (iter.valid()) - { - uint32_t key_to_remove = iter.key(); - ++iter; - try - { - _leveldb.remove(key_to_remove); - } - catch (fc::exception&) - { - // shouldn't happen, and if it does there's not much we can do - } - } - */ _potential_peer_set.clear(); } @@ -170,36 +134,23 @@ namespace graphene { namespace net { { auto iter = _potential_peer_set.get().find(endpointToErase); if (iter != _potential_peer_set.get().end()) - { - //_leveldb.remove(iter->database_key); _potential_peer_set.get().erase(iter); - } } void peer_database_impl::update_entry(const potential_peer_record& updatedRecord) { auto iter = _potential_peer_set.get().find(updatedRecord.endpoint); if (iter != _potential_peer_set.get().end()) - { - _potential_peer_set.get().modify(iter, [&updatedRecord](potential_peer_database_entry& entry) { entry.peer_record = updatedRecord; }); - //_leveldb.store(iter->database_key, updatedRecord); - } + _potential_peer_set.get().modify(iter, [&updatedRecord](potential_peer_record& record) { record = updatedRecord; }); else - { - uint32_t last_database_key; - //_leveldb.last(last_database_key); - uint32_t new_database_key = last_database_key + 1; - potential_peer_database_entry new_database_entry(new_database_key, updatedRecord); - _potential_peer_set.get().insert(new_database_entry); - //_leveldb.store(new_database_key, updatedRecord); - } + _potential_peer_set.get().insert(updatedRecord); } potential_peer_record peer_database_impl::lookup_or_create_entry_for_endpoint(const fc::ip::endpoint& endpointToLookup) { auto iter = _potential_peer_set.get().find(endpointToLookup); if (iter != _potential_peer_set.get().end()) - return iter->peer_record; + return *iter; return potential_peer_record(endpointToLookup); } @@ -207,7 +158,7 @@ namespace graphene { namespace net { { auto iter = _potential_peer_set.get().find(endpointToLookup); if (iter != _potential_peer_set.get().end()) - return iter->peer_record; + return *iter; return fc::optional(); } @@ -251,13 +202,11 @@ namespace graphene { namespace net { const potential_peer_record& peer_database_iterator::dereference() const { - return my->_iterator->peer_record; + return *my->_iterator; } } // end namespace detail - - peer_database::peer_database() : my(new detail::peer_database_impl) { @@ -315,19 +264,5 @@ namespace graphene { namespace net { { return my->size(); } - std::vector peer_database::get_all()const - { - std::vector results; - /* - auto itr = my->_leveldb.begin(); - while( itr.valid() ) - { - results.push_back( itr.value() ); - ++itr; - } - */ - return results; - } - } } // end namespace graphene::net