Fix up application_impl's has_item() which was throwing to indicate a
missing item instead of returning false. #55
This commit is contained in:
parent
bf0ab60ceb
commit
49acfb3bd6
3 changed files with 71 additions and 18 deletions
|
|
@ -195,16 +195,27 @@ namespace detail {
|
||||||
* If delegate has the item, the network has no need to fetch it.
|
* If delegate has the item, the network has no need to fetch it.
|
||||||
*/
|
*/
|
||||||
virtual bool has_item( const net::item_id& id ) override
|
virtual bool has_item( const net::item_id& id ) override
|
||||||
{ try {
|
{
|
||||||
if( id.item_type == graphene::net::block_message_type )
|
try
|
||||||
{
|
{
|
||||||
return _chain_db->is_known_block( id.item_hash );
|
if( id.item_type == graphene::net::block_message_type )
|
||||||
}
|
{
|
||||||
else
|
// for some reason, the contains() function called by is_known_block
|
||||||
{
|
// throws when the block is not present (instead of returning false)
|
||||||
return _chain_db->is_known_transaction( id.item_hash );
|
try
|
||||||
}
|
{
|
||||||
} FC_CAPTURE_AND_RETHROW( (id) ) }
|
return _chain_db->is_known_block( id.item_hash );
|
||||||
|
}
|
||||||
|
catch (const fc::key_not_found_exception&)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return _chain_db->is_known_transaction( id.item_hash ); // is_known_transaction behaves normally
|
||||||
|
}
|
||||||
|
FC_CAPTURE_AND_RETHROW( (id) )
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief allows the application to validate an item prior to broadcasting to peers.
|
* @brief allows the application to validate an item prior to broadcasting to peers.
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,8 @@ void block_database::remove( const block_id_type& id )
|
||||||
index_entry e;
|
index_entry e;
|
||||||
auto index_pos = sizeof(e)*block_header::num_from_id(id);
|
auto index_pos = sizeof(e)*block_header::num_from_id(id);
|
||||||
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
||||||
FC_ASSERT( _block_num_to_pos.tellg() > index_pos );
|
if ( _block_num_to_pos.tellg() <= index_pos )
|
||||||
|
FC_THROW_EXCEPTION(fc::key_not_found_exception, "Block ${id} not contained in block database", ("id", id));
|
||||||
|
|
||||||
_block_num_to_pos.seekg( index_pos );
|
_block_num_to_pos.seekg( index_pos );
|
||||||
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
||||||
|
|
@ -110,8 +111,8 @@ bool block_database::contains( const block_id_type& id )const
|
||||||
index_entry e;
|
index_entry e;
|
||||||
auto index_pos = sizeof(e)*block_header::num_from_id(id);
|
auto index_pos = sizeof(e)*block_header::num_from_id(id);
|
||||||
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
||||||
FC_ASSERT( _block_num_to_pos.tellg() > index_pos );
|
if ( _block_num_to_pos.tellg() <= index_pos )
|
||||||
|
FC_THROW_EXCEPTION(fc::key_not_found_exception, "Block ${id} not contained in block database", ("id", id));
|
||||||
_block_num_to_pos.seekg( index_pos );
|
_block_num_to_pos.seekg( index_pos );
|
||||||
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
||||||
|
|
||||||
|
|
@ -124,7 +125,8 @@ block_id_type block_database::fetch_block_id( uint32_t block_num )const
|
||||||
index_entry e;
|
index_entry e;
|
||||||
auto index_pos = sizeof(e)*block_num;
|
auto index_pos = sizeof(e)*block_num;
|
||||||
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
||||||
FC_ASSERT( _block_num_to_pos.tellg() > index_pos );
|
if ( _block_num_to_pos.tellg() <= index_pos )
|
||||||
|
FC_THROW_EXCEPTION(fc::key_not_found_exception, "Block number ${block_num} not contained in block database", ("block_num", block_num));
|
||||||
|
|
||||||
_block_num_to_pos.seekg( index_pos );
|
_block_num_to_pos.seekg( index_pos );
|
||||||
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
||||||
|
|
@ -140,7 +142,8 @@ optional<signed_block> block_database::fetch_optional( const block_id_type& id )
|
||||||
index_entry e;
|
index_entry e;
|
||||||
auto index_pos = sizeof(e)*block_header::num_from_id(id);
|
auto index_pos = sizeof(e)*block_header::num_from_id(id);
|
||||||
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
||||||
FC_ASSERT( _block_num_to_pos.tellg() > index_pos );
|
if ( _block_num_to_pos.tellg() <= index_pos )
|
||||||
|
FC_THROW_EXCEPTION(fc::key_not_found_exception, "Block ${id} not contained in block database", ("id", id));
|
||||||
|
|
||||||
_block_num_to_pos.seekg( index_pos );
|
_block_num_to_pos.seekg( index_pos );
|
||||||
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
||||||
|
|
@ -170,7 +173,8 @@ optional<signed_block> block_database::fetch_by_number( uint32_t block_num )cons
|
||||||
index_entry e;
|
index_entry e;
|
||||||
auto index_pos = sizeof(e)*block_num;
|
auto index_pos = sizeof(e)*block_num;
|
||||||
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
_block_num_to_pos.seekg( 0, _block_num_to_pos.end );
|
||||||
FC_ASSERT( _block_num_to_pos.tellg() > index_pos );
|
if ( _block_num_to_pos.tellg() <= index_pos )
|
||||||
|
FC_THROW_EXCEPTION(fc::key_not_found_exception, "Block number ${block_num} not contained in block database", ("block_num", block_num));
|
||||||
|
|
||||||
_block_num_to_pos.seekg( index_pos, _block_num_to_pos.beg );
|
_block_num_to_pos.seekg( index_pos, _block_num_to_pos.beg );
|
||||||
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
_block_num_to_pos.read( (char*)&e, sizeof(e) );
|
||||||
|
|
|
||||||
|
|
@ -1525,7 +1525,7 @@ namespace graphene { namespace net { namespace detail {
|
||||||
else
|
else
|
||||||
dlog("delayed_peer_deletion_task is already scheduled (current size of _peers_to_delete is ${size})", ("size", number_of_peers_to_delete));
|
dlog("delayed_peer_deletion_task is already scheduled (current size of _peers_to_delete is ${size})", ("size", number_of_peers_to_delete));
|
||||||
#else
|
#else
|
||||||
dlog("scheduling peer for deletion: ${peer} (this will not block)");
|
dlog("scheduling peer for deletion: ${peer} (this will not block)", ("peer", peer_to_delete->get_remote_endpoint()));
|
||||||
_peers_to_delete.push_back(peer_to_delete);
|
_peers_to_delete.push_back(peer_to_delete);
|
||||||
if (!_node_is_shutting_down &&
|
if (!_node_is_shutting_down &&
|
||||||
(!_delayed_peer_deletion_task_done.valid() || _delayed_peer_deletion_task_done.ready()))
|
(!_delayed_peer_deletion_task_done.valid() || _delayed_peer_deletion_task_done.ready()))
|
||||||
|
|
@ -5040,7 +5040,44 @@ namespace graphene { namespace net { namespace detail {
|
||||||
return statistics;
|
return statistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INVOKE_AND_COLLECT_STATISTICS(method_name, ...) \
|
// define VERBOSE_NODE_DELEGATE_LOGGING to log whenever the node delegate throws exceptions
|
||||||
|
//#define VERBOSE_NODE_DELEGATE_LOGGING
|
||||||
|
#ifdef VERBOSE_NODE_DELEGATE_LOGGING
|
||||||
|
# define INVOKE_AND_COLLECT_STATISTICS(method_name, ...) \
|
||||||
|
try \
|
||||||
|
{ \
|
||||||
|
call_statistics_collector statistics_collector(#method_name, \
|
||||||
|
&_ ## method_name ## _execution_accumulator, \
|
||||||
|
&_ ## method_name ## _delay_before_accumulator, \
|
||||||
|
&_ ## method_name ## _delay_after_accumulator); \
|
||||||
|
if (_thread->is_current()) \
|
||||||
|
{ \
|
||||||
|
call_statistics_collector::actual_execution_measurement_helper helper(statistics_collector); \
|
||||||
|
return _node_delegate->method_name(__VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
return _thread->async([&](){ \
|
||||||
|
call_statistics_collector::actual_execution_measurement_helper helper(statistics_collector); \
|
||||||
|
return _node_delegate->method_name(__VA_ARGS__); \
|
||||||
|
}, "invoke " BOOST_STRINGIZE(method_name)).wait(); \
|
||||||
|
} \
|
||||||
|
catch (const fc::exception& e) \
|
||||||
|
{ \
|
||||||
|
dlog("node_delegate threw fc::exception: ${e}", ("e", e)); \
|
||||||
|
throw; \
|
||||||
|
} \
|
||||||
|
catch (const std::exception& e) \
|
||||||
|
{ \
|
||||||
|
dlog("node_delegate threw std::exception: ${e}", ("e", e.what())); \
|
||||||
|
throw; \
|
||||||
|
} \
|
||||||
|
catch (...) \
|
||||||
|
{ \
|
||||||
|
dlog("node_delegate threw unrecognized exception"); \
|
||||||
|
throw; \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define INVOKE_AND_COLLECT_STATISTICS(method_name, ...) \
|
||||||
call_statistics_collector statistics_collector(#method_name, \
|
call_statistics_collector statistics_collector(#method_name, \
|
||||||
&_ ## method_name ## _execution_accumulator, \
|
&_ ## method_name ## _execution_accumulator, \
|
||||||
&_ ## method_name ## _delay_before_accumulator, \
|
&_ ## method_name ## _delay_before_accumulator, \
|
||||||
|
|
@ -5055,6 +5092,7 @@ namespace graphene { namespace net { namespace detail {
|
||||||
call_statistics_collector::actual_execution_measurement_helper helper(statistics_collector); \
|
call_statistics_collector::actual_execution_measurement_helper helper(statistics_collector); \
|
||||||
return _node_delegate->method_name(__VA_ARGS__); \
|
return _node_delegate->method_name(__VA_ARGS__); \
|
||||||
}, "invoke " BOOST_STRINGIZE(method_name)).wait()
|
}, "invoke " BOOST_STRINGIZE(method_name)).wait()
|
||||||
|
#endif
|
||||||
|
|
||||||
bool statistics_gathering_node_delegate_wrapper::has_item( const net::item_id& id )
|
bool statistics_gathering_node_delegate_wrapper::has_item( const net::item_id& id )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue