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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
98dbb2aa4f5a Update License in File Headers
Fordy <fanquake@gmail.com>
parents: 2598
diff changeset
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
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2246
diff changeset
7 #include "util.h"
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2246
diff changeset
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
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2246
diff changeset
13 #ifndef WIN32
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2246
diff changeset
14 #include "sys/stat.h"
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2246
diff changeset
15 #endif
f2eba0cb504a Remove headers.h
Pieter Wuille <pieter.wuille@gmail.com>
parents: 2246
diff changeset
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
967a37af0b50 Merge branch 'dbenv' into tmp
Jeff Garzik <jeff@garzik.org>
parents: 2664 2635
diff changeset
73 unsigned int nEnvFlags = 0;
967a37af0b50 Merge branch 'dbenv' into tmp
Jeff Garzik <jeff@garzik.org>
parents: 2664 2635
diff changeset
74 if (GetBoolArg("-privdb", true))
967a37af0b50 Merge branch 'dbenv' into tmp
Jeff Garzik <jeff@garzik.org>
parents: 2664 2635
diff changeset
75 nEnvFlags |= DB_PRIVATE;
967a37af0b50 Merge branch 'dbenv' into tmp
Jeff Garzik <jeff@garzik.org>
parents: 2664 2635
diff changeset
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
967a37af0b50 Merge branch 'dbenv' into tmp
Jeff Garzik <jeff@garzik.org>
parents: 2664 2635
diff changeset
95 DB_RECOVER |
967a37af0b50 Merge branch 'dbenv' into tmp
Jeff Garzik <jeff@garzik.org>
parents: 2664 2635
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
3bb9018628ee Removed duplicated lock
xanatos <xanatos@geocities.com>
parents: 3194
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
333 {
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
334 while (!fShutdown)
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
335 {
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
339 {
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
344
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
402 fSuccess = false;
1511
bdff5864eff3 close old db when rewriting
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1510
diff changeset
403 delete pdbCopy;
1500
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
404 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
405 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
406 if (fSuccess)
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
409 if (dbA.remove(strFile.c_str(), NULL, 0))
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
412 if (dbB.rename(strFileRes.c_str(), NULL, strFile.c_str(), 0))
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
413 fSuccess = false;
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
414 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
417 return fSuccess;
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
418 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
419 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
420 Sleep(100);
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
421 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
422 return false;
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
423 }
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
424
7d93eeefa5ea Resilvering
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1390
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
493 if (coins.IsPruned())
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
494 return Erase(make_pair('c', hash));
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
495 else
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
519 bool CChainDB::WriteBestInvalidWork(CBigNum bnBestInvalidWork)
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
520 {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
524 bool CChainDB::WriteBlockFileInfo(int nFile, const CBlockFileInfo &info) {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
528 bool CChainDB::ReadBlockFileInfo(int nFile, CBlockFileInfo &info) {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
532 bool CChainDB::WriteLastBlockFile(int nFile) {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
536 bool CChainDB::ReadLastBlockFile(int &nFile) {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
596 std::map<uint256, CBlockIndex*>::iterator it = mapBlockIndex.find(hashBestChain);
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
599 } else {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
600 // set 'next' pointers in best chain
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
601 CBlockIndex *pindex = it->second;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
602 while(pindex != NULL && pindex->pprev != NULL) {
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
603 CBlockIndex *pindexPrev = pindex->pprev;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
604 pindexPrev->pnext = pindex;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
605 pindex = pindexPrev;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
606 }
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
607 pindexBest = it->second;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
608 nBestHeight = pindexBest->nHeight;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
609 bnBestChainWork = pindexBest->bnChainWork;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
610 }
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
611 printf("LoadBlockIndex(): hashBestChain=%s height=%d date=%s\n",
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
612 hashBestChain.ToString().substr(0,20).c_str(), nBestHeight,
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
644 // TODO: reorg back
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
679 char chType;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
680 ssKey >> chType;
eb986f1e2e93 Ultraprune
Pieter Wuille <pieter.wuille@gmail.com>
parents: 3647
diff changeset
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