wallet: Reset BerkeleyDB handle after connection fails#13161
wallet: Reset BerkeleyDB handle after connection fails#13161laanwj merged 2 commits intobitcoin:masterfrom
Conversation
According to the BerkeleyDB docs, the DbEnv handle may not be accessed after close() has been called. This change ensures that we create a new handle after close() is called. This avoids a segfault when the first connection attempt fails and then a second connection attempt tries to call open() on the already closed DbEnv handle.
|
utACK 264c643 Nice first contribution. |
|
Concept ACK. |
|
Oh it was not simulated, the error was real. The log file says (I guess the last line appeared only later after bitcoind moved away the database directory.) For testing, I can reliable reproduce the database issue by moving the old database directory back in place. |
|
Not really related but I think I know what caused the database error: The wallet was initially created with the official Arch Linux version, which is configured |
|
Would a simpler fix just be to drop the I also wonder if we could add a unit test or functional test to exercise this code. One way could be to create a dummy |
|
The documentation says we need the close():
I've added proper logging if the close() fails. I'm not sure if a test is that helpful but I can certainly add one if people think it's a good idea. |
|
Concept ACK |
|
utACK b6f0b4d |
b6f0b4d wallet: Improve logging when BerkeleyDB environment fails to close (Tim Ruffing) 264c643 wallet: Reset BerkeleyDB handle after connection fails (Tim Ruffing) Pull request description: According to the BerkeleyDB docs, the DbEnv handle may not be accessed after close() has been called. This change ensures that we create a new handle after close() is called. This avoids a segfault when the first connection attempt fails and then a second connection attempt tries to call open() on the already closed DbEnv handle. Without the patch, bitcoindd reliably crashes in the second call to `set_lg_dir()` after `close()` if there is an issue with the database: ``` 2018-05-03T13:27:21Z Bitcoin Core version v0.16.99.0-a024a1841-dirty (debug build) [...] 2018-05-03T13:27:21Z Using wallet directory /home/tim/.bitcoin 2018-05-03T13:27:21Z init message: Verifying wallet(s)... 2018-05-03T13:27:21Z Using BerkeleyDB version Berkeley DB 4.8.30: (April 9, 2010) 2018-05-03T13:27:21Z Using wallet wallet.dat 2018-05-03T13:27:21Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database 2018-05-03T13:27:21Z BerkeleyEnvironment::Open: Error -30974 opening database environment: DB_RUNRECOVERY: Fatal error, run database recovery 2018-05-03T13:27:21Z Moved old /home/tim/.bitcoin/database to /home/tim/.bitcoin/database.1525354041.bak. Retrying. 2018-05-03T13:27:21Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database ErrorFile=/home/tim/.bitcoin/db.log [1] 14533 segmentation fault (core dumped) ./src/bitcoind ``` After the fix: ``` 2018-05-03T17:19:32Z Bitcoin Core version v0.16.99.0-cc09e3bd0-dirty (release build) [...] 2018-05-03T17:19:32Z Using wallet directory /home/tim/.bitcoin 2018-05-03T17:19:32Z init message: Verifying wallet(s)... 2018-05-03T17:19:32Z Using BerkeleyDB version Berkeley DB 4.8.30: (April 9, 2010) 2018-05-03T17:19:32Z Using wallet wallet.dat 2018-05-03T17:19:32Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database ErrorFile=/home/tim/.bitcoin/db.log 2018-05-03T17:19:32Z scheduler thread start 2018-05-03T17:19:32Z BerkeleyEnvironment::Open: Error -30974 opening database environment: DB_RUNRECOVERY: Fatal error, run database recovery 2018-05-03T17:19:32Z Moved old /home/tim/.bitcoin/database to /home/tim/.bitcoin/database.1525367972.bak. Retrying. 2018-05-03T17:19:32Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database ErrorFile=/home/tim/.bitcoin/db.log 2018-05-03T17:19:32Z Cache configuration: 2018-05-03T17:19:32Z * Using 2.0MiB for block index database 2018-05-03T17:19:32Z * Using 8.0MiB for chain state database 2018-05-03T17:19:32Z * Using 440.0MiB for in-memory UTXO set (plus up to 286.1MiB of unused mempool space) 2018-05-03T17:19:32Z init message: Loading block index.. [...] ``` Tree-SHA512: b809b318e5014ec47d023dc3dc40826b9706bfb211fa08bc2d29f36971b96caa10ad48d9a3f96c03933be46fa4ff7e00e952ac77bfffb6563767fb08aa4f23d6
|
Hi Tim, I still meet the similar issue with the latest code (already has your fix): 2018-05-25T02:14:01Z HTTP: creating work queue of depth 16 My server info: BTW, official downloaded BIN bitcoind has no issue on my server, but manually build bitcoind. Do you have any idea? or any build parameter needed? Thanks |
|
Hm, your problem should not be related to this pull request. These are the build instructions: |
|
Tim, thanks for your info. My current work around is to disable wallet "./configure --disable-wallet", because I do not need it so far. |
Summary: There was a bug discovered by the addition of D4255 affecting ASAN builds. See core issue: bitcoin/bitcoin#14163. The exact solution for this bug is unclear, but will likely require the backporting of at least the following PRs and their dependencies from Core: bitcoin/bitcoin#13161 bitcoin/bitcoin#12493 bitcoin/bitcoin#14320 bitcoin/bitcoin#14552 bitcoin/bitcoin#14760 bitcoin/bitcoin#11911 Suppression of the error is a temporary fix until the above backports are complete. This is the same approach that Core took. See https://github.com/bitcoin/bitcoin/pull/14794/files#diff-354f30a63fb0907d4ad57269548329e3R111 for the initial suppression and https://github.com/bitcoin/bitcoin/pull/15303/files#diff-354f30a63fb0907d4ad57269548329e3L128 for its removal. Test Plan: From the `build` dir: export ABC_BUILD_NAME=build-asan ../contrib/teamcity/build-configurations.sh ASAN build through TeamCity Reviewers: deadalnix, Fabien, jasonbcox, O1 Bitcoin ABC, #bitcoin_abc Reviewed By: Fabien, jasonbcox, O1 Bitcoin ABC, #bitcoin_abc Differential Revision: https://reviews.bitcoinabc.org/D4281
… fails b6f0b4d wallet: Improve logging when BerkeleyDB environment fails to close (Tim Ruffing) 264c643 wallet: Reset BerkeleyDB handle after connection fails (Tim Ruffing) Pull request description: According to the BerkeleyDB docs, the DbEnv handle may not be accessed after close() has been called. This change ensures that we create a new handle after close() is called. This avoids a segfault when the first connection attempt fails and then a second connection attempt tries to call open() on the already closed DbEnv handle. Without the patch, bitcoindd reliably crashes in the second call to `set_lg_dir()` after `close()` if there is an issue with the database: ``` 2018-05-03T13:27:21Z Bitcoin Core version v0.16.99.0-a024a1841-dirty (debug build) [...] 2018-05-03T13:27:21Z Using wallet directory /home/tim/.bitcoin 2018-05-03T13:27:21Z init message: Verifying wallet(s)... 2018-05-03T13:27:21Z Using BerkeleyDB version Berkeley DB 4.8.30: (April 9, 2010) 2018-05-03T13:27:21Z Using wallet wallet.dat 2018-05-03T13:27:21Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database 2018-05-03T13:27:21Z BerkeleyEnvironment::Open: Error -30974 opening database environment: DB_RUNRECOVERY: Fatal error, run database recovery 2018-05-03T13:27:21Z Moved old /home/tim/.bitcoin/database to /home/tim/.bitcoin/database.1525354041.bak. Retrying. 2018-05-03T13:27:21Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database ErrorFile=/home/tim/.bitcoin/db.log [1] 14533 segmentation fault (core dumped) ./src/bitcoind ``` After the fix: ``` 2018-05-03T17:19:32Z Bitcoin Core version v0.16.99.0-cc09e3bd0-dirty (release build) [...] 2018-05-03T17:19:32Z Using wallet directory /home/tim/.bitcoin 2018-05-03T17:19:32Z init message: Verifying wallet(s)... 2018-05-03T17:19:32Z Using BerkeleyDB version Berkeley DB 4.8.30: (April 9, 2010) 2018-05-03T17:19:32Z Using wallet wallet.dat 2018-05-03T17:19:32Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database ErrorFile=/home/tim/.bitcoin/db.log 2018-05-03T17:19:32Z scheduler thread start 2018-05-03T17:19:32Z BerkeleyEnvironment::Open: Error -30974 opening database environment: DB_RUNRECOVERY: Fatal error, run database recovery 2018-05-03T17:19:32Z Moved old /home/tim/.bitcoin/database to /home/tim/.bitcoin/database.1525367972.bak. Retrying. 2018-05-03T17:19:32Z BerkeleyEnvironment::Open: LogDir=/home/tim/.bitcoin/database ErrorFile=/home/tim/.bitcoin/db.log 2018-05-03T17:19:32Z Cache configuration: 2018-05-03T17:19:32Z * Using 2.0MiB for block index database 2018-05-03T17:19:32Z * Using 8.0MiB for chain state database 2018-05-03T17:19:32Z * Using 440.0MiB for in-memory UTXO set (plus up to 286.1MiB of unused mempool space) 2018-05-03T17:19:32Z init message: Loading block index.. [...] ``` Tree-SHA512: b809b318e5014ec47d023dc3dc40826b9706bfb211fa08bc2d29f36971b96caa10ad48d9a3f96c03933be46fa4ff7e00e952ac77bfffb6563767fb08aa4f23d6
According to the BerkeleyDB docs, the DbEnv handle may not be accessed
after close() has been called. This change ensures that we create a new
handle after close() is called. This avoids a segfault when the first
connection attempt fails and then a second connection attempt tries to
call open() on the already closed DbEnv handle.
Without the patch, bitcoindd reliably crashes in the second call to
set_lg_dir()afterclose()ifthere is an issue with the database:
After the fix: