@ -10,6 +10,7 @@
# include <shutdown.h>
# include <ui_interface.h>
# include <uint256.h>
# include <util/memory.h>
# include <util/system.h>
# include <util/translation.h>
# include <util/vector.h>
@ -41,35 +42,45 @@ struct CoinEntry {
}
CCoinsViewDB : : CCoinsViewDB ( fs : : path ldb_path , size_t nCacheSize , bool fMemory , bool fWipe ) : db ( ldb_path , nCacheSize , fMemory , fWipe , true )
CCoinsViewDB : : CCoinsViewDB ( fs : : path ldb_path , size_t nCacheSize , bool fMemory , bool fWipe ) :
m_db ( MakeUnique < CDBWrapper > ( ldb_path , nCacheSize , fMemory , fWipe , true ) ) ,
m_ldb_path ( ldb_path ) ,
m_is_memory ( fMemory ) { }
void CCoinsViewDB : : ResizeCache ( size_t new_cache_size )
{
// Have to do a reset first to get the original `m_db` state to release its
// filesystem lock.
m_db . reset ( ) ;
m_db = MakeUnique < CDBWrapper > (
m_ldb_path , new_cache_size , m_is_memory , /*fWipe*/ false , /*obfuscate*/ true ) ;
}
bool CCoinsViewDB : : GetCoin ( const COutPoint & outpoint , Coin & coin ) const {
return db . Read ( CoinEntry ( & outpoint ) , coin ) ;
return m_db- > Read ( CoinEntry ( & outpoint ) , coin ) ;
}
bool CCoinsViewDB : : HaveCoin ( const COutPoint & outpoint ) const {
return db. Exists ( CoinEntry ( & outpoint ) ) ;
return m_db- > Exists ( CoinEntry ( & outpoint ) ) ;
}
uint256 CCoinsViewDB : : GetBestBlock ( ) const {
uint256 hashBestChain ;
if ( ! db. Read ( DB_BEST_BLOCK , hashBestChain ) )
if ( ! m_db- > Read ( DB_BEST_BLOCK , hashBestChain ) )
return uint256 ( ) ;
return hashBestChain ;
}
std : : vector < uint256 > CCoinsViewDB : : GetHeadBlocks ( ) const {
std : : vector < uint256 > vhashHeadBlocks ;
if ( ! db. Read ( DB_HEAD_BLOCKS , vhashHeadBlocks ) ) {
if ( ! m_db- > Read ( DB_HEAD_BLOCKS , vhashHeadBlocks ) ) {
return std : : vector < uint256 > ( ) ;
}
return vhashHeadBlocks ;
}
bool CCoinsViewDB : : BatchWrite ( CCoinsMap & mapCoins , const uint256 & hashBlock ) {
CDBBatch batch ( db) ;
CDBBatch batch ( * m_ db) ;
size_t count = 0 ;
size_t changed = 0 ;
size_t batch_size = ( size_t ) gArgs . GetArg ( " -dbbatchsize " , nDefaultDbBatchSize ) ;
@ -107,7 +118,7 @@ bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) {
mapCoins . erase ( itOld ) ;
if ( batch . SizeEstimate ( ) > batch_size ) {
LogPrint ( BCLog : : COINDB , " Writing partial batch of %.2f MiB \n " , batch . SizeEstimate ( ) * ( 1.0 / 1048576.0 ) ) ;
db. WriteBatch ( batch ) ;
m_db- > WriteBatch ( batch ) ;
batch . Clear ( ) ;
if ( crash_simulate ) {
static FastRandomContext rng ;
@ -124,14 +135,14 @@ bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) {
batch . Write ( DB_BEST_BLOCK , hashBlock ) ;
LogPrint ( BCLog : : COINDB , " Writing final batch of %.2f MiB \n " , batch . SizeEstimate ( ) * ( 1.0 / 1048576.0 ) ) ;
bool ret = db. WriteBatch ( batch ) ;
bool ret = m_db- > WriteBatch ( batch ) ;
LogPrint ( BCLog : : COINDB , " Committed %u changed transaction outputs (out of %u) to coin database... \n " , ( unsigned int ) changed , ( unsigned int ) count ) ;
return ret ;
}
size_t CCoinsViewDB : : EstimateSize ( ) const
{
return db. EstimateSize ( DB_COIN , ( char ) ( DB_COIN + 1 ) ) ;
return m_db- > EstimateSize ( DB_COIN , ( char ) ( DB_COIN + 1 ) ) ;
}
CBlockTreeDB : : CBlockTreeDB ( size_t nCacheSize , bool fMemory , bool fWipe ) : CDBWrapper ( GetDataDir ( ) / " blocks " / " index " , nCacheSize , fMemory , fWipe ) {
@ -158,7 +169,7 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
CCoinsViewCursor * CCoinsViewDB : : Cursor ( ) const
{
CCoinsViewDBCursor * i = new CCoinsViewDBCursor ( const_cast < CDBWrapper & > ( db) . NewIterator ( ) , GetBestBlock ( ) ) ;
CCoinsViewDBCursor * i = new CCoinsViewDBCursor ( const_cast < CDBWrapper & > ( * m_ db) . NewIterator ( ) , GetBestBlock ( ) ) ;
/* It seems that there are no "const iterators" for LevelDB. Since we
only need read operations on it , use a const - cast to get around
that restriction . */
@ -338,7 +349,7 @@ public:
* Currently implemented : from the per - tx utxo model ( 0.8 . .0 .14 . x ) to per - txout .
*/
bool CCoinsViewDB : : Upgrade ( ) {
std : : unique_ptr < CDBIterator > pcursor ( db. NewIterator ( ) ) ;
std : : unique_ptr < CDBIterator > pcursor ( m_db- > NewIterator ( ) ) ;
pcursor - > Seek ( std : : make_pair ( DB_COINS , uint256 ( ) ) ) ;
if ( ! pcursor - > Valid ( ) ) {
return true ;
@ -349,7 +360,7 @@ bool CCoinsViewDB::Upgrade() {
LogPrintf ( " [0%%]... " ) ; /* Continued */
uiInterface . ShowProgress ( _ ( " Upgrading UTXO database " ) . translated , 0 , true ) ;
size_t batch_size = 1 < < 24 ;
CDBBatch batch ( db) ;
CDBBatch batch ( * m_ db) ;
int reportDone = 0 ;
std : : pair < unsigned char , uint256 > key ;
std : : pair < unsigned char , uint256 > prev_key = { DB_COINS , uint256 ( ) } ;
@ -384,9 +395,9 @@ bool CCoinsViewDB::Upgrade() {
}
batch . Erase ( key ) ;
if ( batch . SizeEstimate ( ) > batch_size ) {
db. WriteBatch ( batch ) ;
m_db- > WriteBatch ( batch ) ;
batch . Clear ( ) ;
db. CompactRange ( prev_key , key ) ;
m_db- > CompactRange ( prev_key , key ) ;
prev_key = key ;
}
pcursor - > Next ( ) ;
@ -394,8 +405,8 @@ bool CCoinsViewDB::Upgrade() {
break ;
}
}
db. WriteBatch ( batch ) ;
db. CompactRange ( { DB_COINS , uint256 ( ) } , key ) ;
m_db- > WriteBatch ( batch ) ;
m_db- > CompactRange ( { DB_COINS , uint256 ( ) } , key ) ;
uiInterface . ShowProgress ( " " , 100 , false ) ;
LogPrintf ( " [%s]. \n " , ShutdownRequested ( ) ? " CANCELLED " : " DONE " ) ;
return ! ShutdownRequested ( ) ;