-
Notifications
You must be signed in to change notification settings - Fork 397
peg-in re-checking cleanup and fixes #425
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
peg-in re-checking cleanup and fixes #425
Conversation
|
Checked logs to make sure the spam is gone, and logic looks sound: |
| # Don't make a block, race condition when pegin-invalid block | ||
| # is awaiting further validation, nodes reject subsequent blocks | ||
| # even ones they create | ||
| print("Now waiting for node to re-evaluate peg-in witness failed block... should take a few seconds") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now waiting for node to ...
I was expecting that to be followed by a sleep..
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok? :)
| // Check existence and validity of pegin witness | ||
| if (tx.wit.vtxinwit.size() <= i || !IsValidPeginWitness(tx.wit.vtxinwit[i].m_pegin_witness, prevout)) { | ||
| return state.DoS(0, false, REJECT_PEGIN, "bad-pegin-witness", true); | ||
| return state.DoS(0, false, REJECT_PEGIN, "bad-pegin-witness"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What exactly does this change behavior-wise?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I note this in the issue itself but:
-
Blocks: block is marked bad and not reprocessed until the next retry interval
-
Transactions: transaction is rejected, like normal.
| '-mainchainrpcport=%s' % rpc_port(n), | ||
| '-mainchainrpcuser=%s' % rpc_u, | ||
| '-mainchainrpcpassword=%s' % rpc_p, | ||
| '-recheckpeginblockinterval=15', # Long enough to allow failure and repair before timeout |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't seem to wait for 15 seconds ever, so if you just want to make sure all things happen before the timeout, why not use the default?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The node takes 15 seconds to re-try the block, so we do use it. I don't want it lost in node start/stop time noise.
|
Tests work though, at 2716fab. But confused about the not waiting in the fedpeg test. |
|
I'll give the code some documentation to clear up some of these questions. |
| * 2) Re-evaluates a list of blocks that have been deemed "bad" | ||
| * from the perspective of peg-in witness validation. Blocks are | ||
| * added to this queue in ConnectTip based on the error code returned. | ||
| */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you 💋
Previously the peg-in validation logic was done in script which means it was handled correctly by mempool/block logic. We then moved these checks outside of script, which means that these checks aren't multithreaded/batched, and return the specific error states, including CorruptionPossible. This means that blocks are never considered permanently invalid and in certain circumstances tried in an infinite loop. Instead we mark it as a normal failure, and allow the peg-in invalid block queue to take care of it instead.
4a2ba83 to
abb7b01
Compare
|
rebased, this time with Travis testing the bitcoind case! |
|
tACK 4a2ba83 |
abb7b01 Add some additional comments about BitcoindRPCCheck infra (Gregory Sanders) 62c56f4 don't set CorruptionPossible for peg-in transaction failure (Gregory Sanders) 5d7cd6b parameterize the rpc re-checking of peg-in validation failed blocks (Gregory Sanders) ba8d498 bitcoind rpc check should take main locks for mapBlockIndex, check for key (Gregory Sanders)
Resolves #424
We ensure that peg-in invalid blocks are marked as "bad", and allow the re-checking logic to actually re-check instead of immediately re-evaluating the block.
Take locks and check for existence of keys in mapBlockIndex, when appropriate.
Also actually includes a valid test for it by making sure it takes more than a few seconds to fix itself but doesn't hit test timeout.