Skip to content
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

refactor: pass mixing wallet to CoinJoin utils by reference #6440

Closed
wants to merge 1 commit into from

Conversation

UdjinM6
Copy link

@UdjinM6 UdjinM6 commented Dec 1, 2024

Issue being fixed or feature implemented

As a side-effect, we get rid of GetWallet() calls in coinjoin module which also fixes a potential deadlock reported recently.

What was done?

How Has This Been Tested?

Breaking Changes

Checklist:

  • 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
  • I have assigned this pull request to a milestone (for repository code-owners and collaborators only)

@UdjinM6 UdjinM6 added this to the 22 milestone Dec 1, 2024
CTransactionBuilder::CTransactionBuilder(std::shared_ptr<CWallet> pwalletIn, const CompactTallyItem& tallyItemIn) :
pwallet(pwalletIn),
dummyReserveDestination(pwalletIn.get()),
CTransactionBuilder::CTransactionBuilder(CWallet& wallet, const CompactTallyItem& tallyItemIn) :
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hm, CTransactionBuilder doesn't actually need shared_ptr to wallet, because it doesn't own a copy of wallet in memory... That's a good finding.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we justify this? It doesn't seem correct to me. Are we sure that a CTransactionBuilder object won't outlive the wallet creating it? it seems this is the reason to use shared_ptr no? Please help clarify

Copy link
Collaborator

@knst knst Dec 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So far as I looked to code, instance of CTransactionBuilder is created in only 2 functions:

  • CCoinJoinClientSession::MakeCollateralAmounts
  • CCoinJoinClientSession::CreateDenominated

In both cases CCoinJoinClientSession works with CWallet object like with something that definitely exist, because both functions starts from AssertLockHeld(m_wallet.cs_wallet);

And in both cases instance of CTransactionBuilder is a local variable which is removed after usage, so, life of CWallet object is not extended long enough to provide any extra safety. Either CTransactionBuilder is misused and all CJ code is broken (because intensive usage of CWallet everywhere), either no need to keep shared_ptr to CWallet inside CTransactionBuilder at all.

Please, revive this PR, it seems as everything is fine with this changes.

UPD: #6441 seems as gives all good guarantees about CWallet memory ownership during client code

Copy link
Collaborator

@knst knst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utACK 0f29aaf

@UdjinM6 UdjinM6 removed this from the 22 milestone Dec 2, 2024
@UdjinM6 UdjinM6 closed this Dec 2, 2024
PastaPastaPasta added a commit that referenced this pull request Dec 3, 2024
…o prevent concurrent unload

2d7c7f8 fix: do not transfer wallet ownership to CTransactionBuilder{Output} (UdjinM6)
0aeeb85 fix: add missing `AddWallet` call in `TestLoadWallet` (UdjinM6)
e800d9d fix: hold wallet shared pointer in CJ Manager/Sessions to prevent concurrent unload (UdjinM6)

Pull request description:

  ## Issue being fixed or feature implemented
  #6440 (comment)

  ## What was done?

  ## How Has This Been Tested?

  ## Breaking Changes

  ## Checklist:
  - [ ] 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
  - [ ] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_

ACKs for top commit:
  PastaPastaPasta:
    utACK 2d7c7f8

Tree-SHA512: 308e3bed077baa2167b7f9d81b87e5a61a113e4d465706548f303dfc499bc072d4e823e85772e591a879986b0fb0413d5afe0e3995e1f939fa772b29adc0300d
PastaPastaPasta added a commit to PastaPastaPasta/dash that referenced this pull request Dec 3, 2024
…sions to prevent concurrent unload

2d7c7f8 fix: do not transfer wallet ownership to CTransactionBuilder{Output} (UdjinM6)
0aeeb85 fix: add missing `AddWallet` call in `TestLoadWallet` (UdjinM6)
e800d9d fix: hold wallet shared pointer in CJ Manager/Sessions to prevent concurrent unload (UdjinM6)

Pull request description:

  ## Issue being fixed or feature implemented
  dashpay#6440 (comment)

  ## What was done?

  ## How Has This Been Tested?

  ## Breaking Changes

  ## Checklist:
  - [ ] 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
  - [ ] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_

ACKs for top commit:
  PastaPastaPasta:
    utACK 2d7c7f8

Tree-SHA512: 308e3bed077baa2167b7f9d81b87e5a61a113e4d465706548f303dfc499bc072d4e823e85772e591a879986b0fb0413d5afe0e3995e1f939fa772b29adc0300d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants