-
Notifications
You must be signed in to change notification settings - Fork 1.2k
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
feat(qt): refresh the whole wallet instead of processing individual updates for huge notification queues #5453
Conversation
…updates for huge notification queues
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.
utACK
{ | ||
if (vQueueNotifications.size() - i <= 10) { | ||
bool invoked = QMetaObject::invokeMethod(ttm, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, false)); | ||
if (vQueueNotifications.size() < 10000) { |
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.
can you justify this magic number a bit more? why not 500 or 1k or 100k?
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.
Processing 10K notifications worked ok-ish, with a slight delay for my 500k+ txes wallet. Processing 50-100k was already too slow comparing to refreshing the wallet instead. So I just kept 10k as a threshold. Could be higher or could be lower on different machines I guess, not sure how to pick the right number here.
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.
utACK for squash merge; 1 nit
@@ -82,6 +83,7 @@ class TransactionTablePriv | |||
} | |||
} | |||
} | |||
parent->endResetModel(); |
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.
would it be a valid state of parent if an exception would be thrown before endResetModel()
is called?
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.
Hmm.. Not sure I get the question.. What kind of exception? And why you think it should affect parent
(TransactionTableModel*
)?
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.
https://doc.qt.io/qt-6/qabstractitemmodel.html#endResetModel
You must call this function after resetting any internal data structure in your model or proxy model.
I see that some methods doesn't have noexcept
specifier, more over functions between beginResetModel() and endResetModel() such as getWalletTxs
, showTransaction
have allocation inside: it means that any time an exception can be thrown.
There're two possible solution for resolve "you must call" request:
- write a wrapper such as
lock_guard
that will call endResetModel() in a destructor. - wrap everything between begin & endResetModel to try-catch and safely call
endResetModel
3ccd0a5
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.
utACK
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.
LGTM
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.
utACK for squash merge
…pdates for huge notification queues (dashpay#5453) ## Issue being fixed or feature implemented It's super slow for wallets with 100.000s of txes to process lots of notifications produced by rescan. Skip them all and simply refresh the whole wallet instead. In my case (500k+ txes testnet wallet) gui update after `rescanblockchain` time is down from _forever_ to ~30 seconds. Same for `wipewallettxes true` (dashpay#5451 ). Gui update after `wipewallettxes`/`wipewallettxes false` is instant (cause there are no txes anymore) vs _forever_ before the patch. ## What was done? refresh the whole wallet when notification queue is above 10K operations actual changes (ignoring whitespaces): dashpay@d013cb4?w=1 ## How Has This Been Tested? running on top of dashpay#5451 and dashpay#5452 , wiping and rescanning w/ and w/out this patch. ## Breaking Changes should be none ## Checklist: - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_
Issue being fixed or feature implemented
It's super slow for wallets with 100.000s of txes to process lots of notifications produced by rescan. Skip them all and simply refresh the whole wallet instead. In my case (500k+ txes testnet wallet) gui update after
rescanblockchain
time is down from forever to ~30 seconds. Same forwipewallettxes true
(#5451 ). Gui update afterwipewallettxes
/wipewallettxes false
is instant (cause there are no txes anymore) vs forever before the patch.What was done?
refresh the whole wallet when notification queue is above 10K operations
actual changes (ignoring whitespaces): d013cb4?w=1
How Has This Been Tested?
running on top of #5451 and #5452 , wiping and rescanning w/ and w/out this patch.
Breaking Changes
should be none
Checklist: