Fix race condition in unchecked_map where a block may be asynchronously inserted and a dependency satisfied while a block is waiting to be placed in the unchecked table.
This change checks if the dependency has been satisfied before placing it in the unchecked map.
This commit is contained in:
parent
16e5ccf209
commit
a1e359bae7
1 changed files with 7 additions and 1 deletions
|
@ -209,6 +209,12 @@ void nano::unchecked_map::run ()
|
|||
|
||||
void nano::unchecked_map::insert_impl (nano::write_transaction const & transaction, nano::hash_or_account const & dependency, nano::unchecked_info const & info)
|
||||
{
|
||||
// Check if block dependency has been satisfied while waiting to be placed in the unchecked map
|
||||
if (store.block.exists (transaction, dependency.as_block_hash ()))
|
||||
{
|
||||
satisfied (info);
|
||||
return;
|
||||
}
|
||||
nano::lock_guard<std::recursive_mutex> lock{ entries_mutex };
|
||||
// Check if we should be using memory but the memory container hasn't been constructed i.e. we're transitioning from disk to memory.
|
||||
if (entries == nullptr && use_memory ())
|
||||
|
@ -221,7 +227,7 @@ void nano::unchecked_map::insert_impl (nano::write_transaction const & transacti
|
|||
}
|
||||
if (entries == nullptr)
|
||||
{
|
||||
store.unchecked.put (transaction, dependency, { info.block });
|
||||
store.unchecked.put (transaction, dependency, info);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue