Mercurial > hg > bitcoin
annotate src/db.cpp @ 3649:eb986f1e2e93 draft
Ultraprune
This switches bitcoin's transaction/block verification logic to use a
"coin database", which contains all unredeemed transaction output scripts,
amounts and heights.
The name ultraprune comes from the fact that instead of a full transaction
index, we only (need to) keep an index with unspent outputs. For now, the
blocks themselves are kept as usual, although they are only necessary for
serving, rescanning and reorganizing.
The basic datastructures are CCoins (representing the coins of a single
transaction), and CCoinsView (representing a state of the coins database).
There are several implementations for CCoinsView. A dummy, one backed by
the coins database (coins.dat), one backed by the memory pool, and one
that adds a cache on top of it. FetchInputs, ConnectInputs, ConnectBlock,
DisconnectBlock, ... now operate on a generic CCoinsView.
The block switching logic now builds a single cached CCoinsView with
changes to be committed to the database before any changes are made.
This means no uncommitted changes are ever read from the database, and
should ease the transition to another database layer which does not
support transactions (but does support atomic writes), like LevelDB.
For the getrawtransaction() RPC call, access to a txid-to-disk index
would be preferable. As this index is not necessary or even useful
for any other part of the implementation, it is not provided. Instead,
getrawtransaction() uses the coin database to find the block height,
and then scans that block to find the requested transaction. This is
slow, but should suffice for debug purposes.
author | Pieter Wuille <pieter.wuille@gmail.com> |
---|---|
date | Sun, 01 Jul 2012 18:54:00 +0200 (2012-07-01) |
parents | fdd92a9e5196 |
children | 12e3ba3a9c4b |
rev | line source |
---|---|
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
1 // Copyright (c) 2009-2010 Satoshi Nakamoto |
1818
20667468f95b
Update all copyrights to 2012
Gavin Andresen <gavinandresen@gmail.com>
parents:
1813
diff
changeset
|
2 // Copyright (c) 2009-2012 The Bitcoin developers |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
3 // Distributed under the MIT/X11 software license, see the accompanying |
2607 | 4 // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
5 |
605
1ae81ad9b0e5
Only include db.h when we have to.
Jordan Lewis <jordanthelewis@gmail.com>
parents:
595
diff
changeset
|
6 #include "db.h" |
2274 | 7 #include "util.h" |
8 #include "main.h" | |
1840
0760e07f7938
Added 'Backup Wallet' menu option
sje397 <sje397@gmail.com>
parents:
1818
diff
changeset
|
9 #include <boost/version.hpp> |
695
9609c7af94ba
Fix missing includes needed for Boost 1.46.
Shane Wegner <shane-github@csy.ca>
parents:
690
diff
changeset
|
10 #include <boost/filesystem.hpp> |
611
503d51554676
Only include certain boost headers if necessary.
Jordan Lewis <jordanthelewis@gmail.com>
parents:
607
diff
changeset
|
11 #include <boost/filesystem/fstream.hpp> |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
12 |
2274 | 13 #ifndef WIN32 |
14 #include "sys/stat.h" | |
15 #endif | |
16 | |
595
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
576
diff
changeset
|
17 using namespace std; |
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
576
diff
changeset
|
18 using namespace boost; |
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
576
diff
changeset
|
19 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
20 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
21 unsigned int nWalletDBUpdated; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
22 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
23 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
24 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
25 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
26 // CDB |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
27 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
28 |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
29 CDBEnv bitdb; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
30 |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
31 void CDBEnv::EnvShutdown() |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
32 { |
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
33 if (!fDbEnvInit) |
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
34 return; |
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
35 |
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
36 fDbEnvInit = false; |
3602
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
37 int ret = dbenv.close(0); |
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
38 if (ret != 0) |
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
39 printf("EnvShutdown exception: %s (%d)\n", DbEnv::strerror(ret), ret); |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
40 if (!fMockDb) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
41 DbEnv(0).remove(GetDataDir().string().c_str(), 0); |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
42 } |
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
43 |
3602
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
44 CDBEnv::CDBEnv() : dbenv(DB_CXX_NO_EXCEPTIONS) |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
45 { |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
46 } |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
47 |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
48 CDBEnv::~CDBEnv() |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
49 { |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
50 EnvShutdown(); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
51 } |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
52 |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
53 void CDBEnv::Close() |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
54 { |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
55 EnvShutdown(); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
56 } |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
57 |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
58 bool CDBEnv::Open(boost::filesystem::path pathEnv_) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
59 { |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
60 if (fDbEnvInit) |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
61 return true; |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
62 |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
63 if (fShutdown) |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
64 return false; |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
65 |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
66 pathEnv = pathEnv_; |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
67 filesystem::path pathDataDir = pathEnv; |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
68 filesystem::path pathLogDir = pathDataDir / "database"; |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
69 filesystem::create_directory(pathLogDir); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
70 filesystem::path pathErrorFile = pathDataDir / "db.log"; |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
71 printf("dbenv.open LogDir=%s ErrorFile=%s\n", pathLogDir.string().c_str(), pathErrorFile.string().c_str()); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
72 |
2669 | 73 unsigned int nEnvFlags = 0; |
74 if (GetBoolArg("-privdb", true)) | |
75 nEnvFlags |= DB_PRIVATE; | |
76 | |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
77 int nDbCache = GetArg("-dbcache", 25); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
78 dbenv.set_lg_dir(pathLogDir.string().c_str()); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
79 dbenv.set_cachesize(nDbCache / 1024, (nDbCache % 1024)*1048576, 1); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
80 dbenv.set_lg_bsize(1048576); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
81 dbenv.set_lg_max(10485760); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
82 dbenv.set_lk_max_locks(10000); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
83 dbenv.set_lk_max_objects(10000); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
84 dbenv.set_errfile(fopen(pathErrorFile.string().c_str(), "a")); /// debug |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
85 dbenv.set_flags(DB_AUTO_COMMIT, 1); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
86 dbenv.set_flags(DB_TXN_WRITE_NOSYNC, 1); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
87 dbenv.log_set_config(DB_LOG_AUTO_REMOVE, 1); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
88 int ret = dbenv.open(pathDataDir.string().c_str(), |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
89 DB_CREATE | |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
90 DB_INIT_LOCK | |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
91 DB_INIT_LOG | |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
92 DB_INIT_MPOOL | |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
93 DB_INIT_TXN | |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
94 DB_THREAD | |
2669 | 95 DB_RECOVER | |
96 nEnvFlags, | |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
97 S_IRUSR | S_IWUSR); |
3602
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
98 if (ret != 0) |
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
99 return error("CDB() : error %s (%d) opening database environment", DbEnv::strerror(ret), ret); |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
100 |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
101 fDbEnvInit = true; |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
102 fMockDb = false; |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
103 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
104 } |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
105 |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
106 void CDBEnv::MakeMock() |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
107 { |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
108 if (fDbEnvInit) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
109 throw runtime_error("CDBEnv::MakeMock(): already initialized"); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
110 |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
111 if (fShutdown) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
112 throw runtime_error("CDBEnv::MakeMock(): during shutdown"); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
113 |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
114 printf("CDBEnv::MakeMock()\n"); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
115 |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
116 dbenv.set_cachesize(1, 0, 1); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
117 dbenv.set_lg_bsize(10485760*4); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
118 dbenv.set_lg_max(10485760); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
119 dbenv.set_lk_max_locks(10000); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
120 dbenv.set_lk_max_objects(10000); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
121 dbenv.set_flags(DB_AUTO_COMMIT, 1); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
122 dbenv.log_set_config(DB_LOG_IN_MEMORY, 1); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
123 int ret = dbenv.open(NULL, |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
124 DB_CREATE | |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
125 DB_INIT_LOCK | |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
126 DB_INIT_LOG | |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
127 DB_INIT_MPOOL | |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
128 DB_INIT_TXN | |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
129 DB_THREAD | |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
130 DB_PRIVATE, |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
131 S_IRUSR | S_IWUSR); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
132 if (ret > 0) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
133 throw runtime_error(strprintf("CDBEnv::MakeMock(): error %d opening database environment", ret)); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
134 |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
135 fDbEnvInit = true; |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
136 fMockDb = true; |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
137 } |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
138 |
3604
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
139 CDBEnv::VerifyResult CDBEnv::Verify(std::string strFile, bool (*recoverFunc)(CDBEnv& dbenv, std::string strFile)) |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
140 { |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
141 LOCK(cs_db); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
142 assert(mapFileUseCount.count(strFile) == 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
143 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
144 Db db(&dbenv, 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
145 int result = db.verify(strFile.c_str(), NULL, NULL, 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
146 if (result == 0) |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
147 return VERIFY_OK; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
148 else if (recoverFunc == NULL) |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
149 return RECOVER_FAIL; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
150 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
151 // Try to recover: |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
152 bool fRecovered = (*recoverFunc)(*this, strFile); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
153 return (fRecovered ? RECOVER_OK : RECOVER_FAIL); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
154 } |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
155 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
156 bool CDBEnv::Salvage(std::string strFile, bool fAggressive, |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
157 std::vector<CDBEnv::KeyValPair >& vResult) |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
158 { |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
159 LOCK(cs_db); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
160 assert(mapFileUseCount.count(strFile) == 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
161 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
162 u_int32_t flags = DB_SALVAGE; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
163 if (fAggressive) flags |= DB_AGGRESSIVE; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
164 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
165 stringstream strDump; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
166 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
167 Db db(&dbenv, 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
168 int result = db.verify(strFile.c_str(), NULL, &strDump, flags); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
169 if (result != 0) |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
170 { |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
171 printf("ERROR: db salvage failed\n"); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
172 return false; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
173 } |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
174 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
175 // Format of bdb dump is ascii lines: |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
176 // header lines... |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
177 // HEADER=END |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
178 // hexadecimal key |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
179 // hexadecimal value |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
180 // ... repeated |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
181 // DATA=END |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
182 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
183 string strLine; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
184 while (!strDump.eof() && strLine != "HEADER=END") |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
185 getline(strDump, strLine); // Skip past header |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
186 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
187 std::string keyHex, valueHex; |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
188 while (!strDump.eof() && keyHex != "DATA=END") |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
189 { |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
190 getline(strDump, keyHex); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
191 if (keyHex != "DATA_END") |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
192 { |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
193 getline(strDump, valueHex); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
194 vResult.push_back(make_pair(ParseHex(keyHex),ParseHex(valueHex))); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
195 } |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
196 } |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
197 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
198 return (result == 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
199 } |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
200 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
201 |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
202 void CDBEnv::CheckpointLSN(std::string strFile) |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
203 { |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
204 dbenv.txn_checkpoint(0, 0, 0); |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
205 if (fMockDb) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
206 return; |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
207 dbenv.lsn_reset(strFile.c_str(), 0); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
208 } |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
209 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
210 |
2634
a558beaa5c57
CDB::CDB: properly initialize activeTxn to NULL
Jeff Garzik <jgarzik@exmulti.com>
parents:
2633
diff
changeset
|
211 CDB::CDB(const char *pszFile, const char* pszMode) : |
a558beaa5c57
CDB::CDB: properly initialize activeTxn to NULL
Jeff Garzik <jgarzik@exmulti.com>
parents:
2633
diff
changeset
|
212 pdb(NULL), activeTxn(NULL) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
213 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
214 int ret; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
215 if (pszFile == NULL) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
216 return; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
217 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
218 fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w')); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
219 bool fCreate = strchr(pszMode, 'c'); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
220 unsigned int nFlags = DB_THREAD; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
221 if (fCreate) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
222 nFlags |= DB_CREATE; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
223 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
224 { |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
225 LOCK(bitdb.cs_db); |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
226 if (!bitdb.Open(GetDataDir())) |
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
227 throw runtime_error("env open failed"); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
228 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
229 strFile = pszFile; |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
230 ++bitdb.mapFileUseCount[strFile]; |
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
231 pdb = bitdb.mapDb[strFile]; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
232 if (pdb == NULL) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
233 { |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
234 pdb = new Db(&bitdb.dbenv, 0); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
235 |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
236 bool fMockDb = bitdb.IsMock(); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
237 if (fMockDb) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
238 { |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
239 DbMpoolFile*mpf = pdb->get_mpf(); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
240 ret = mpf->set_flags(DB_MPOOL_NOFILE, 1); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
241 if (ret != 0) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
242 throw runtime_error(strprintf("CDB() : failed to configure for no temp file backing for database %s", pszFile)); |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
243 } |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
244 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
245 ret = pdb->open(NULL, // Txn pointer |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
246 fMockDb ? NULL : pszFile, // Filename |
3649 | 247 fMockDb ? pszFile : "main", // Logical db name |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
248 DB_BTREE, // Database type |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
249 nFlags, // Flags |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
250 0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
251 |
3602
e06aa97bd808
Handle incompatible BDB environments
Gavin Andresen <gavinandresen@gmail.com>
parents:
3516
diff
changeset
|
252 if (ret != 0) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
253 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
254 delete pdb; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
255 pdb = NULL; |
3391 | 256 --bitdb.mapFileUseCount[strFile]; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
257 strFile = ""; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
258 throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
259 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
260 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
261 if (fCreate && !Exists(string("version"))) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
262 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
263 bool fTmp = fReadOnly; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
264 fReadOnly = false; |
1584
a67f13278e2c
Implement BIP 14 : separate protocol version from client version
Gavin Andresen <gavinandresen@gmail.com>
parents:
1511
diff
changeset
|
265 WriteVersion(CLIENT_VERSION); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
266 fReadOnly = fTmp; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
267 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
268 |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
269 bitdb.mapDb[strFile] = pdb; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
270 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
271 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
272 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
273 |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
274 static bool IsChainFile(std::string strFile) |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
275 { |
3649 | 276 if (strFile == "coins.dat" || strFile == "chain.dat") |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
277 return true; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
278 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
279 return false; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
280 } |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
281 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
282 void CDB::Close() |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
283 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
284 if (!pdb) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
285 return; |
2633
a7a1bf716c1a
Remove unused nested BDB transaction support
Jeff Garzik <jgarzik@exmulti.com>
parents:
2631
diff
changeset
|
286 if (activeTxn) |
a7a1bf716c1a
Remove unused nested BDB transaction support
Jeff Garzik <jgarzik@exmulti.com>
parents:
2631
diff
changeset
|
287 activeTxn->abort(); |
a7a1bf716c1a
Remove unused nested BDB transaction support
Jeff Garzik <jgarzik@exmulti.com>
parents:
2631
diff
changeset
|
288 activeTxn = NULL; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
289 pdb = NULL; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
290 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
291 // Flush database activity from memory pool to disk log |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
292 unsigned int nMinutes = 0; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
293 if (fReadOnly) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
294 nMinutes = 1; |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
295 if (IsChainFile(strFile)) |
2263
c8bc276d36eb
Reduce sync frequency for blkindex.dat
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2246
diff
changeset
|
296 nMinutes = 2; |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
297 if (IsChainFile(strFile) && IsInitialBlockDownload()) |
2116
94844608a7d7
Use transactions-updated as flush condition
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2114
diff
changeset
|
298 nMinutes = 5; |
94844608a7d7
Use transactions-updated as flush condition
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2114
diff
changeset
|
299 |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
300 bitdb.dbenv.txn_checkpoint(nMinutes ? GetArg("-dblogsize", 100)*1024 : 0, nMinutes, 0); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
301 |
2190
60fe81a4849b
Use scoped locks instead of CRITICAL_BLOCK
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2176
diff
changeset
|
302 { |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
303 LOCK(bitdb.cs_db); |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
304 --bitdb.mapFileUseCount[strFile]; |
2190
60fe81a4849b
Use scoped locks instead of CRITICAL_BLOCK
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2176
diff
changeset
|
305 } |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
306 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
307 |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
308 void CDBEnv::CloseDb(const string& strFile) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
309 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
310 { |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
311 LOCK(cs_db); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
312 if (mapDb[strFile] != NULL) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
313 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
314 // Close the database handle |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
315 Db* pdb = mapDb[strFile]; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
316 pdb->close(0); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
317 delete pdb; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
318 mapDb[strFile] = NULL; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
319 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
320 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
321 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
322 |
3604
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
323 bool CDBEnv::RemoveDb(const string& strFile) |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
324 { |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
325 this->CloseDb(strFile); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
326 |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
327 LOCK(cs_db); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
328 int rc = dbenv.dbremove(NULL, strFile.c_str(), NULL, DB_AUTO_COMMIT); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
329 return (rc == 0); |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
330 } |
fbf468eac50a
Handle corrupt wallets gracefully.
Gavin Andresen <gavinandresen@gmail.com>
parents:
3602
diff
changeset
|
331 |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
332 bool CDB::Rewrite(const string& strFile, const char* pszSkip) |
1500 | 333 { |
334 while (!fShutdown) | |
335 { | |
336 { | |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
337 LOCK(bitdb.cs_db); |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
338 if (!bitdb.mapFileUseCount.count(strFile) || bitdb.mapFileUseCount[strFile] == 0) |
1500 | 339 { |
340 // Flush log data to the dat file | |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
341 bitdb.CloseDb(strFile); |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
342 bitdb.CheckpointLSN(strFile); |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
343 bitdb.mapFileUseCount.erase(strFile); |
1500 | 344 |
345 bool fSuccess = true; | |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
346 printf("Rewriting %s...\n", strFile.c_str()); |
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
347 string strFileRes = strFile + ".rewrite"; |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
348 { // surround usage of db with extra {} |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
349 CDB db(strFile.c_str(), "r"); |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
350 Db* pdbCopy = new Db(&bitdb.dbenv, 0); |
3516
ea8bd30bedcb
Trim trailing whitespace for src/*.{h,cpp}
Jeff Garzik <jgarzik@exmulti.com>
parents:
3391
diff
changeset
|
351 |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
352 int ret = pdbCopy->open(NULL, // Txn pointer |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
353 strFileRes.c_str(), // Filename |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
354 "main", // Logical db name |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
355 DB_BTREE, // Database type |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
356 DB_CREATE, // Flags |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
357 0); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
358 if (ret > 0) |
1500 | 359 { |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
360 printf("Cannot create database file %s\n", strFileRes.c_str()); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
361 fSuccess = false; |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
362 } |
3516
ea8bd30bedcb
Trim trailing whitespace for src/*.{h,cpp}
Jeff Garzik <jgarzik@exmulti.com>
parents:
3391
diff
changeset
|
363 |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
364 Dbc* pcursor = db.GetCursor(); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
365 if (pcursor) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
366 while (fSuccess) |
1505
d54fc7452031
Fix crash-on-osx-on-shutdown bug. And cleanup CDB handling in Rewrite.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1504
diff
changeset
|
367 { |
2277
0dcf927bc6b2
Further reduce header dependencies
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2275
diff
changeset
|
368 CDataStream ssKey(SER_DISK, CLIENT_VERSION); |
0dcf927bc6b2
Further reduce header dependencies
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2275
diff
changeset
|
369 CDataStream ssValue(SER_DISK, CLIENT_VERSION); |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
370 int ret = db.ReadAtCursor(pcursor, ssKey, ssValue, DB_NEXT); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
371 if (ret == DB_NOTFOUND) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
372 { |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
373 pcursor->close(); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
374 break; |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
375 } |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
376 else if (ret != 0) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
377 { |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
378 pcursor->close(); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
379 fSuccess = false; |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
380 break; |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
381 } |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
382 if (pszSkip && |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
383 strncmp(&ssKey[0], pszSkip, std::min(ssKey.size(), strlen(pszSkip))) == 0) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
384 continue; |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
385 if (strncmp(&ssKey[0], "\x07version", 8) == 0) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
386 { |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
387 // Update version: |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
388 ssValue.clear(); |
1584
a67f13278e2c
Implement BIP 14 : separate protocol version from client version
Gavin Andresen <gavinandresen@gmail.com>
parents:
1511
diff
changeset
|
389 ssValue << CLIENT_VERSION; |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
390 } |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
391 Dbt datKey(&ssKey[0], ssKey.size()); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
392 Dbt datValue(&ssValue[0], ssValue.size()); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
393 int ret2 = pdbCopy->put(NULL, &datKey, &datValue, DB_NOOVERWRITE); |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
394 if (ret2 > 0) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
395 fSuccess = false; |
1505
d54fc7452031
Fix crash-on-osx-on-shutdown bug. And cleanup CDB handling in Rewrite.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1504
diff
changeset
|
396 } |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
397 if (fSuccess) |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
398 { |
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
399 db.Close(); |
2635
c8269e1811c5
Further CDBEnv encapsulation work.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2634
diff
changeset
|
400 bitdb.CloseDb(strFile); |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
401 if (pdbCopy->close(0)) |
1500 | 402 fSuccess = false; |
1511
bdff5864eff3
close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1510
diff
changeset
|
403 delete pdbCopy; |
1500 | 404 } |
405 } | |
406 if (fSuccess) | |
407 { | |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
408 Db dbA(&bitdb.dbenv, 0); |
1500 | 409 if (dbA.remove(strFile.c_str(), NULL, 0)) |
410 fSuccess = false; | |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
411 Db dbB(&bitdb.dbenv, 0); |
1500 | 412 if (dbB.rename(strFileRes.c_str(), NULL, strFile.c_str(), 0)) |
413 fSuccess = false; | |
414 } | |
415 if (!fSuccess) | |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
416 printf("Rewriting of %s FAILED!\n", strFileRes.c_str()); |
1500 | 417 return fSuccess; |
418 } | |
419 } | |
420 Sleep(100); | |
421 } | |
422 return false; | |
423 } | |
424 | |
425 | |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
426 void CDBEnv::Flush(bool fShutdown) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
427 { |
2598
d1152dd63333
Report how long DBFlush took.
R E Broadley <rebroad+github@gmail.com>
parents:
2581
diff
changeset
|
428 int64 nStart = GetTimeMillis(); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
429 // Flush log data to the actual data file |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
430 // on all files that are not in use |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
431 printf("Flush(%s)%s\n", fShutdown ? "true" : "false", fDbEnvInit ? "" : " db not started"); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
432 if (!fDbEnvInit) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
433 return; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
434 { |
2190
60fe81a4849b
Use scoped locks instead of CRITICAL_BLOCK
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2176
diff
changeset
|
435 LOCK(cs_db); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
436 map<string, int>::iterator mi = mapFileUseCount.begin(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
437 while (mi != mapFileUseCount.end()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
438 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
439 string strFile = (*mi).first; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
440 int nRefCount = (*mi).second; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
441 printf("%s refcount=%d\n", strFile.c_str(), nRefCount); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
442 if (nRefCount == 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
443 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
444 // Move log data to the dat file |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
445 CloseDb(strFile); |
2317
2d4c7d77f691
Make lsn_reset ("detach databases") optional and off by default.
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2313
diff
changeset
|
446 printf("%s checkpoint\n", strFile.c_str()); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
447 dbenv.txn_checkpoint(0, 0, 0); |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
448 if (!IsChainFile(strFile) || fDetachDB) { |
2317
2d4c7d77f691
Make lsn_reset ("detach databases") optional and off by default.
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2313
diff
changeset
|
449 printf("%s detach\n", strFile.c_str()); |
3194
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
450 if (!fMockDb) |
bba71ed03345
Run BDB disk-less for test_bitcoin
Luke Dashjr <luke-jr+git@utopios.org>
parents:
3159
diff
changeset
|
451 dbenv.lsn_reset(strFile.c_str(), 0); |
2317
2d4c7d77f691
Make lsn_reset ("detach databases") optional and off by default.
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2313
diff
changeset
|
452 } |
2d4c7d77f691
Make lsn_reset ("detach databases") optional and off by default.
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2313
diff
changeset
|
453 printf("%s closed\n", strFile.c_str()); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
454 mapFileUseCount.erase(mi++); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
455 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
456 else |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
457 mi++; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
458 } |
2598
d1152dd63333
Report how long DBFlush took.
R E Broadley <rebroad+github@gmail.com>
parents:
2581
diff
changeset
|
459 printf("DBFlush(%s)%s ended %15"PRI64d"ms\n", fShutdown ? "true" : "false", fDbEnvInit ? "" : " db not started", GetTimeMillis() - nStart); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
460 if (fShutdown) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
461 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
462 char** listp; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
463 if (mapFileUseCount.empty()) |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
464 { |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
465 dbenv.log_archive(&listp, DB_ARCH_REMOVE); |
2631
04775a4029eb
Encapsulate BDB environment inside new CDBEnv class
Jeff Garzik <jgarzik@exmulti.com>
parents:
2623
diff
changeset
|
466 Close(); |
1501
26d0f350347a
Obsolete keypool and make sure database removes log files on shutdown.
Gavin Andresen <gavinandresen@gmail.com>
parents:
1500
diff
changeset
|
467 } |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
468 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
469 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
470 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
471 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
472 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
473 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
474 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
475 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
476 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
477 // |
3649 | 478 // CChainDB and CCoinsDB |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
479 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
480 |
3649 | 481 bool CCoinsDB::HaveCoins(uint256 hash) { |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
482 assert(!fClient); |
3649 | 483 return Exists(make_pair('c', hash)); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
484 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
485 |
3649 | 486 bool CCoinsDB::ReadCoins(uint256 hash, CCoins &coins) { |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
487 assert(!fClient); |
3649 | 488 return Read(make_pair('c', hash), coins); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
489 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
490 |
3649 | 491 bool CCoinsDB::WriteCoins(uint256 hash, const CCoins &coins) { |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
492 assert(!fClient); |
3649 | 493 if (coins.IsPruned()) |
494 return Erase(make_pair('c', hash)); | |
495 else | |
496 return Write(make_pair('c', hash), coins); | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
497 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
498 |
3649 | 499 bool CChainDB::WriteBlockIndex(const CDiskBlockIndex& blockindex) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
500 { |
3649 | 501 return Write(make_pair('b', blockindex.GetBlockHash()), blockindex); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
502 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
503 |
3649 | 504 bool CCoinsDB::ReadHashBestChain(uint256& hashBestChain) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
505 { |
3649 | 506 return Read('B', hashBestChain); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
507 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
508 |
3649 | 509 bool CCoinsDB::WriteHashBestChain(uint256 hashBestChain) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
510 { |
3649 | 511 return Write('B', hashBestChain); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
512 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
513 |
3649 | 514 bool CChainDB::ReadBestInvalidWork(CBigNum& bnBestInvalidWork) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
515 { |
3649 | 516 return Read('I', bnBestInvalidWork); |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
517 } |
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
518 |
3649 | 519 bool CChainDB::WriteBestInvalidWork(CBigNum bnBestInvalidWork) |
520 { | |
521 return Write('I', bnBestInvalidWork); | |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
522 } |
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
523 |
3649 | 524 bool CChainDB::WriteBlockFileInfo(int nFile, const CBlockFileInfo &info) { |
525 return Write(make_pair('f', nFile), info); | |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
526 } |
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
527 |
3649 | 528 bool CChainDB::ReadBlockFileInfo(int nFile, CBlockFileInfo &info) { |
529 return Read(make_pair('f', nFile), info); | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
530 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
531 |
3649 | 532 bool CChainDB::WriteLastBlockFile(int nFile) { |
533 return Write('l', nFile); | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
534 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
535 |
3649 | 536 bool CChainDB::ReadLastBlockFile(int &nFile) { |
537 return Read('l', nFile); | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
538 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
539 |
690 | 540 CBlockIndex static * InsertBlockIndex(uint256 hash) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
541 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
542 if (hash == 0) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
543 return NULL; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
544 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
545 // Return existing |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
546 map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
547 if (mi != mapBlockIndex.end()) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
548 return (*mi).second; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
549 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
550 // Create new |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
551 CBlockIndex* pindexNew = new CBlockIndex(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
552 if (!pindexNew) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
553 throw runtime_error("LoadBlockIndex() : new CBlockIndex failed"); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
554 mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
555 pindexNew->phashBlock = &((*mi).first); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
556 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
557 return pindexNew; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
558 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
559 |
3649 | 560 bool LoadBlockIndex(CCoinsDB &coindb, CChainDB &chaindb) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
561 { |
3649 | 562 if (!chaindb.LoadBlockIndexGuts()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
563 return false; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
564 |
2287
ccef6e0f4b0a
Added ability to respond to signals during Block Loading stage.
R E Broadley <rebroad+github@gmail.com>
parents:
2282
diff
changeset
|
565 if (fRequestShutdown) |
ccef6e0f4b0a
Added ability to respond to signals during Block Loading stage.
R E Broadley <rebroad+github@gmail.com>
parents:
2282
diff
changeset
|
566 return true; |
ccef6e0f4b0a
Added ability to respond to signals during Block Loading stage.
R E Broadley <rebroad+github@gmail.com>
parents:
2282
diff
changeset
|
567 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
568 // Calculate bnChainWork |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
569 vector<pair<int, CBlockIndex*> > vSortedByHeight; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
570 vSortedByHeight.reserve(mapBlockIndex.size()); |
595
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
576
diff
changeset
|
571 BOOST_FOREACH(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
572 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
573 CBlockIndex* pindex = item.second; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
574 vSortedByHeight.push_back(make_pair(pindex->nHeight, pindex)); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
575 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
576 sort(vSortedByHeight.begin(), vSortedByHeight.end()); |
595
e630bbb11629
make bitcoin include files more modular
Wladimir J. van der Laan <laanwj@gmail.com>
parents:
576
diff
changeset
|
577 BOOST_FOREACH(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
578 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
579 CBlockIndex* pindex = item.second; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
580 pindex->bnChainWork = (pindex->pprev ? pindex->pprev->bnChainWork : 0) + pindex->GetBlockWork(); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
581 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
582 |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
583 // Load block file info |
3649 | 584 chaindb.ReadLastBlockFile(nLastBlockFile); |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
585 printf("LoadBlockIndex(): last block file = %i\n", nLastBlockFile); |
3649 | 586 if (chaindb.ReadBlockFileInfo(nLastBlockFile, infoLastBlockFile)) |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
587 printf("LoadBlockIndex(): last block file: %s\n", infoLastBlockFile.ToString().c_str()); |
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
588 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
589 // Load hashBestChain pointer to end of best chain |
3649 | 590 if (!coindb.ReadHashBestChain(hashBestChain)) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
591 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
592 if (pindexGenesisBlock == NULL) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
593 return true; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
594 return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded"); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
595 } |
3649 | 596 std::map<uint256, CBlockIndex*>::iterator it = mapBlockIndex.find(hashBestChain); |
597 if (it == mapBlockIndex.end()) { | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
598 return error("CTxDB::LoadBlockIndex() : hashBestChain not found in the block index"); |
3649 | 599 } else { |
600 // set 'next' pointers in best chain | |
601 CBlockIndex *pindex = it->second; | |
602 while(pindex != NULL && pindex->pprev != NULL) { | |
603 CBlockIndex *pindexPrev = pindex->pprev; | |
604 pindexPrev->pnext = pindex; | |
605 pindex = pindexPrev; | |
606 } | |
607 pindexBest = it->second; | |
608 nBestHeight = pindexBest->nHeight; | |
609 bnBestChainWork = pindexBest->bnChainWork; | |
610 } | |
611 printf("LoadBlockIndex(): hashBestChain=%s height=%d date=%s\n", | |
612 hashBestChain.ToString().substr(0,20).c_str(), nBestHeight, | |
613 DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime()).c_str()); | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
614 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
615 // Load bnBestInvalidWork, OK if it doesn't exist |
3649 | 616 chaindb.ReadBestInvalidWork(bnBestInvalidWork); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
617 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
618 // Verify blocks in the best chain |
2076
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
619 int nCheckLevel = GetArg("-checklevel", 1); |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
620 int nCheckDepth = GetArg( "-checkblocks", 2500); |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
621 if (nCheckDepth == 0) |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
622 nCheckDepth = 1000000000; // suffices until the year 19000 |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
623 if (nCheckDepth > nBestHeight) |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
624 nCheckDepth = nBestHeight; |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
625 printf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
626 CBlockIndex* pindexFork = NULL; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
627 for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
628 { |
2304
2c9b9d05a987
-loadblock to load from an external blk000?.dat file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2287
diff
changeset
|
629 if (fRequestShutdown || pindex->nHeight < nBestHeight-nCheckDepth) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
630 break; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
631 CBlock block; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
632 if (!block.ReadFromDisk(pindex)) |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
633 return error("LoadBlockIndex() : block.ReadFromDisk failed"); |
2076
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
634 // check level 1: verify block validity |
17f721892510
Add -checklevel and improve -checkblocks
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2033
diff
changeset
|
635 if (nCheckLevel>0 && !block.CheckBlock()) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
636 { |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
637 printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str()); |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
638 pindexFork = pindex->pprev; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
639 } |
3649 | 640 // TODO: stronger verifications |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
641 } |
2304
2c9b9d05a987
-loadblock to load from an external blk000?.dat file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
2287
diff
changeset
|
642 if (pindexFork && !fRequestShutdown) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
643 { |
3649 | 644 // TODO: reorg back |
645 return error("LoadBlockIndex(): chain database corrupted"); | |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
646 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
647 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
648 return true; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
649 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
650 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
651 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
652 |
3649 | 653 bool CChainDB::LoadBlockIndexGuts() |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
654 { |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
655 // Get database cursor |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
656 Dbc* pcursor = GetCursor(); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
657 if (!pcursor) |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
658 return false; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
659 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
660 // Load mapBlockIndex |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
661 unsigned int fFlags = DB_SET_RANGE; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
662 loop |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
663 { |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
664 // Read next record |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
665 CDataStream ssKey(SER_DISK, CLIENT_VERSION); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
666 if (fFlags == DB_SET_RANGE) |
3649 | 667 ssKey << make_pair('b', uint256(0)); |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
668 CDataStream ssValue(SER_DISK, CLIENT_VERSION); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
669 int ret = ReadAtCursor(pcursor, ssKey, ssValue, fFlags); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
670 fFlags = DB_NEXT; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
671 if (ret == DB_NOTFOUND) |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
672 break; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
673 else if (ret != 0) |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
674 return false; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
675 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
676 // Unserialize |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
677 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
678 try { |
3649 | 679 char chType; |
680 ssKey >> chType; | |
681 if (chType == 'b' && !fRequestShutdown) | |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
682 { |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
683 CDiskBlockIndex diskindex; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
684 ssValue >> diskindex; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
685 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
686 // Construct block index object |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
687 CBlockIndex* pindexNew = InsertBlockIndex(diskindex.GetBlockHash()); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
688 pindexNew->pprev = InsertBlockIndex(diskindex.hashPrev); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
689 pindexNew->nHeight = diskindex.nHeight; |
3647
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
690 pindexNew->pos = diskindex.pos; |
fdd92a9e5196
Multiple blocks per file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
3645
diff
changeset
|
691 pindexNew->nUndoPos = diskindex.nUndoPos; |
2680
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
692 pindexNew->nVersion = diskindex.nVersion; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
693 pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
694 pindexNew->nTime = diskindex.nTime; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
695 pindexNew->nBits = diskindex.nBits; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
696 pindexNew->nNonce = diskindex.nNonce; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
697 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
698 // Watch for genesis block |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
699 if (pindexGenesisBlock == NULL && diskindex.GetBlockHash() == hashGenesisBlock) |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
700 pindexGenesisBlock = pindexNew; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
701 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
702 if (!pindexNew->CheckIndex()) |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
703 return error("LoadBlockIndex() : CheckIndex failed at %d", pindexNew->nHeight); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
704 } |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
705 else |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
706 { |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
707 break; // if shutdown requested or finished loading block index |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
708 } |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
709 } // try |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
710 catch (std::exception &e) { |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
711 return error("%s() : deserialize error", __PRETTY_FUNCTION__); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
712 } |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
713 } |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
714 pcursor->close(); |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
715 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
716 return true; |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
717 } |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
718 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
719 |
6f9e2902c50d
Refactor: add IsChainFile helper. LoadBlockIndex() code movement.
Jeff Garzik <jgarzik@exmulti.com>
parents:
2669
diff
changeset
|
720 |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
721 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
722 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
723 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
724 // CAddrDB |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
725 // |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
726 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
727 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
728 CAddrDB::CAddrDB() |
1911
a9190d020909
CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1873
diff
changeset
|
729 { |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
730 pathAddr = GetDataDir() / "peers.dat"; |
1911
a9190d020909
CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1873
diff
changeset
|
731 } |
a9190d020909
CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1873
diff
changeset
|
732 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
733 bool CAddrDB::Write(const CAddrMan& addr) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
734 { |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
735 // Generate random temporary filename |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
736 unsigned short randv = 0; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
737 RAND_bytes((unsigned char *)&randv, sizeof(randv)); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
738 std::string tmpfn = strprintf("peers.dat.%04x", randv); |
1911
a9190d020909
CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1873
diff
changeset
|
739 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
740 // serialize addresses, checksum data up to that point, then append csum |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
741 CDataStream ssPeers(SER_DISK, CLIENT_VERSION); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
742 ssPeers << FLATDATA(pchMessageStart); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
743 ssPeers << addr; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
744 uint256 hash = Hash(ssPeers.begin(), ssPeers.end()); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
745 ssPeers << hash; |
1911
a9190d020909
CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1873
diff
changeset
|
746 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
747 // open temp output file, and associate with CAutoFile |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
748 boost::filesystem::path pathTmp = GetDataDir() / tmpfn; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
749 FILE *file = fopen(pathTmp.string().c_str(), "wb"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
750 CAutoFile fileout = CAutoFile(file, SER_DISK, CLIENT_VERSION); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
751 if (!fileout) |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
752 return error("CAddrman::Write() : open failed"); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
753 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
754 // Write and commit header, data |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
755 try { |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
756 fileout << ssPeers; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
757 } |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
758 catch (std::exception &e) { |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
759 return error("CAddrman::Write() : I/O error"); |
1911
a9190d020909
CAddrMan: stochastic address manager
Pieter Wuille <pieter.wuille@gmail.com>
parents:
1873
diff
changeset
|
760 } |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
761 FileCommit(fileout); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
762 fileout.fclose(); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
763 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
764 // replace existing peers.dat, if any, with new peers.dat.XXXX |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
765 if (!RenameOver(pathTmp, pathAddr)) |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
766 return error("CAddrman::Write() : Rename-into-place failed"); |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
767 |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
768 return true; |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
769 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
770 |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
771 bool CAddrDB::Read(CAddrMan& addr) |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
772 { |
2578
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
773 // open input file, and associate with CAutoFile |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
774 FILE *file = fopen(pathAddr.string().c_str(), "rb"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
775 CAutoFile filein = CAutoFile(file, SER_DISK, CLIENT_VERSION); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
776 if (!filein) |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
777 return error("CAddrman::Read() : open failed"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
778 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
779 // use file size to size memory buffer |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
780 int fileSize = GetFilesize(filein); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
781 int dataSize = fileSize - sizeof(uint256); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
782 vector<unsigned char> vchData; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
783 vchData.resize(dataSize); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
784 uint256 hashIn; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
785 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
786 // read data and checksum from file |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
787 try { |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
788 filein.read((char *)&vchData[0], dataSize); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
789 filein >> hashIn; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
790 } |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
791 catch (std::exception &e) { |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
792 return error("CAddrman::Read() 2 : I/O error or stream data corrupted"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
793 } |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
794 filein.fclose(); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
795 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
796 CDataStream ssPeers(vchData, SER_DISK, CLIENT_VERSION); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
797 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
798 // verify stored checksum matches input data |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
799 uint256 hashTmp = Hash(ssPeers.begin(), ssPeers.end()); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
800 if (hashIn != hashTmp) |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
801 return error("CAddrman::Read() : checksum mismatch; data corrupted"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
802 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
803 // de-serialize address data |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
804 unsigned char pchMsgTmp[4]; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
805 try { |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
806 ssPeers >> FLATDATA(pchMsgTmp); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
807 ssPeers >> addr; |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
808 } |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
809 catch (std::exception &e) { |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
810 return error("CAddrman::Read() : I/O error or stream data corrupted"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
811 } |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
812 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
813 // finally, verify the network matches ours |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
814 if (memcmp(pchMsgTmp, pchMessageStart, sizeof(pchMsgTmp))) |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
815 return error("CAddrman::Read() : invalid network magic number"); |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
816 |
038e24060817
CAddrDB: Replace BDB-managed addr.dat with internally managed peers.dat
Jeff Garzik <jgarzik@exmulti.com>
parents:
2404
diff
changeset
|
817 return true; |
575
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
818 } |
1a0476fe825f
directory re-organization (keeps the old build system)
Jaromil <jaromil@dyne.org>
parents:
diff
changeset
|
819 |