@ -1073,8 +1073,10 @@ void BlockchainBDB::sync()
m_spent_keys - > sync ( 0 ) ;
m_hf_starting_heights - > sync ( 0 ) ;
m_hf_versions - > sync ( 0 ) ;
if ( m_hf_starting_heights ! = nullptr )
m_hf_starting_heights - > sync ( 0 ) ;
if ( m_hf_versions ! = nullptr )
m_hf_versions - > sync ( 0 ) ;
m_properties - > sync ( 0 ) ;
}
@ -2208,12 +2210,91 @@ uint64_t BlockchainBDB::get_hard_fork_starting_height(uint8_t version) const
void BlockchainBDB : : check_hard_fork_info ( )
{
/* FIXME: Some other time */
LOG_PRINT_L3 ( " BlockchainBDB:: " < < __func__ ) ;
check_open ( ) ;
if ( m_hf_versions = = nullptr )
{
LOG_PRINT_L0 ( " hf versions DB not open, so not checking " ) ;
return ;
}
DB_BTREE_STAT * db_stat1 , * db_stat2 ;
// DB_FAST_STAT can apparently cause an incorrect number of records
// to be returned. The flag should be set to 0 instead if this proves
// to be the case.
// Set txn to NULL and DB_FAST_STAT to zero (0) for reliability.
m_blocks - > stat ( NULL , & db_stat1 , 0 ) ;
m_hf_versions - > stat ( NULL , & db_stat2 , 0 ) ;
if ( db_stat1 - > bt_nkeys ! = db_stat2 - > bt_nkeys )
{
LOG_PRINT_L0 ( " num blocks " < < db_stat1 - > bt_nkeys < < " != " < < " num hf_versions " < < db_stat2 - > bt_nkeys < < " - will clear the two hard fork DBs " ) ;
bdb_txn_safe txn ;
bdb_txn_safe * txn_ptr = & txn ;
if ( m_write_txn )
txn_ptr = m_write_txn ;
else
{
if ( m_env - > txn_begin ( NULL , txn , 0 ) )
throw0 ( DB_ERROR ( " Failed to create a transaction for the db " ) ) ;
}
try
{
uint32_t count ;
m_hf_starting_heights - > truncate ( * txn_ptr , & count , 0 ) ;
LOG_PRINT_L0 ( " hf_starting_heights count: " < < count ) ;
m_hf_versions - > truncate ( * txn_ptr , & count , 0 ) ;
LOG_PRINT_L0 ( " hf_versions count: " < < count ) ;
if ( ! m_write_txn )
txn . commit ( ) ;
}
catch ( const std : : exception & e )
{
throw0 ( DB_ERROR ( std : : string ( " Failed to clear two hard fork DBs: " ) . append ( e . what ( ) ) . c_str ( ) ) ) ;
}
}
delete db_stat1 ;
delete db_stat2 ;
}
void BlockchainBDB : : drop_hard_fork_info ( )
{
/* TODO */
LOG_PRINT_L3 ( " BlockchainBDB:: " < < __func__ ) ;
check_open ( ) ;
bdb_txn_safe txn ;
bdb_txn_safe * txn_ptr = & txn ;
if ( m_write_txn )
txn_ptr = m_write_txn ;
else
{
if ( m_env - > txn_begin ( NULL , txn , 0 ) )
throw0 ( DB_ERROR ( " Failed to create a transaction for the db " ) ) ;
}
try
{
m_hf_starting_heights - > close ( 0 ) ;
m_hf_versions - > close ( 0 ) ;
m_hf_starting_heights = nullptr ;
m_hf_versions = nullptr ;
if ( m_env - > dbremove ( * txn_ptr , BDB_HF_STARTING_HEIGHTS , NULL , 0 ) ! = 0 )
LOG_ERROR ( " Error removing hf_starting_heights " ) ;
if ( m_env - > dbremove ( * txn_ptr , BDB_HF_VERSIONS , NULL , 0 ) ! = 0 )
LOG_ERROR ( " Error removing hf_versions " ) ;
if ( ! m_write_txn )
txn . commit ( ) ;
}
catch ( const std : : exception & e )
{
throw0 ( DB_ERROR ( std : : string ( " Failed to drop hard fork info: " ) . append ( e . what ( ) ) . c_str ( ) ) ) ;
}
}
void BlockchainBDB : : set_hard_fork_version ( uint64_t height , uint8_t version )