Skip to content

Commit b164bcc

Browse files
authored
Split PS into Manager and Session and allow running multiple mixing sessions in parallel (client side) (dashpay#2203)
* Split PS into Manager and Session * Adjust log messages accordingly * add -privatesendsessions cmd-line option * address review comments * bump MAX_OUTBOUND_MASTERNODE_CONNECTIONS to 30 +10 for parallel mixing * protect vecSessions * constructors * Rewrite CMasternodeMan::ProcessMasternodeConnections() to use CPrivateSendClientManager::GetMixingMasternodesInfo(). This should solve potential deadlock cs_vecqueue vs cs_vNodes. * Drop no longer used IsMixingMasternode() * lock cs_wallet when mixing uses balance related functions
1 parent 794921b commit b164bcc

File tree

11 files changed

+562
-290
lines changed

11 files changed

+562
-290
lines changed

src/init.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ std::string HelpMessage(HelpMessageMode mode)
579579
strUsage += HelpMessageGroup(_("PrivateSend options:"));
580580
strUsage += HelpMessageOpt("-enableprivatesend=<n>", strprintf(_("Enable use of automated PrivateSend for funds stored in this wallet (0-1, default: %u)"), 0));
581581
strUsage += HelpMessageOpt("-privatesendmultisession=<n>", strprintf(_("Enable multiple PrivateSend mixing sessions per block, experimental (0-1, default: %u)"), DEFAULT_PRIVATESEND_MULTISESSION));
582+
strUsage += HelpMessageOpt("-privatesendsessions=<n>", strprintf(_("Use N separate masternodes in parallel to mix funds (%u-%u, default: %u)"), MIN_PRIVATESEND_SESSIONS, MAX_PRIVATESEND_SESSIONS, DEFAULT_PRIVATESEND_SESSIONS));
582583
strUsage += HelpMessageOpt("-privatesendrounds=<n>", strprintf(_("Use N separate masternodes for each denominated input to mix funds (%u-%u, default: %u)"), MIN_PRIVATESEND_ROUNDS, MAX_PRIVATESEND_ROUNDS, DEFAULT_PRIVATESEND_ROUNDS));
583584
strUsage += HelpMessageOpt("-privatesendamount=<n>", strprintf(_("Keep N DASH anonymized (%u-%u, default: %u)"), MIN_PRIVATESEND_AMOUNT, MAX_PRIVATESEND_AMOUNT, DEFAULT_PRIVATESEND_AMOUNT));
584585
strUsage += HelpMessageOpt("-liquidityprovider=<n>", strprintf(_("Provide liquidity to PrivateSend by infrequently mixing coins on a continual basis (%u-%u, default: %u, 1=very frequent, high fees, %u=very infrequent, low fees)"),
@@ -918,6 +919,8 @@ void InitParameterInteraction()
918919
if (nLiqProvTmp > 0) {
919920
ForceSetArg("-enableprivatesend", "1");
920921
LogPrintf("%s: parameter interaction: -liquidityprovider=%d -> setting -enableprivatesend=1\n", __func__, nLiqProvTmp);
922+
ForceSetArg("-privatesendsessions", itostr(MIN_PRIVATESEND_SESSIONS));
923+
LogPrintf("%s: parameter interaction: -liquidityprovider=%d -> setting -privatesendsessions=%d\n", __func__, nLiqProvTmp, itostr(std::numeric_limits<int>::max()));
921924
ForceSetArg("-privatesendrounds", itostr(std::numeric_limits<int>::max()));
922925
LogPrintf("%s: parameter interaction: -liquidityprovider=%d -> setting -privatesendrounds=%d\n", __func__, nLiqProvTmp, itostr(std::numeric_limits<int>::max()));
923926
ForceSetArg("-privatesendamount", itostr(MAX_PRIVATESEND_AMOUNT));
@@ -1921,6 +1924,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
19211924

19221925
privateSendClient.fEnablePrivateSend = GetBoolArg("-enableprivatesend", false);
19231926
privateSendClient.fPrivateSendMultiSession = GetBoolArg("-privatesendmultisession", DEFAULT_PRIVATESEND_MULTISESSION);
1927+
privateSendClient.nPrivateSendSessions = std::min(std::max((int)GetArg("-privatesendsessions", DEFAULT_PRIVATESEND_SESSIONS), MIN_PRIVATESEND_SESSIONS), MAX_PRIVATESEND_SESSIONS);
19241928
privateSendClient.nPrivateSendRounds = std::min(std::max((int)GetArg("-privatesendrounds", DEFAULT_PRIVATESEND_ROUNDS), MIN_PRIVATESEND_ROUNDS), nMaxRounds);
19251929
privateSendClient.nPrivateSendAmount = std::min(std::max((int)GetArg("-privatesendamount", DEFAULT_PRIVATESEND_AMOUNT), MIN_PRIVATESEND_AMOUNT), MAX_PRIVATESEND_AMOUNT);
19261930
#endif // ENABLE_WALLET
@@ -2023,7 +2027,7 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
20232027
scheduler.scheduleEvery(boost::bind(&CPrivateSendServer::DoMaintenance, boost::ref(privateSendServer), boost::ref(*g_connman)), 1);
20242028
#ifdef ENABLE_WALLET
20252029
else
2026-
scheduler.scheduleEvery(boost::bind(&CPrivateSendClient::DoMaintenance, boost::ref(privateSendClient), boost::ref(*g_connman)), 1);
2030+
scheduler.scheduleEvery(boost::bind(&CPrivateSendClientManager::DoMaintenance, boost::ref(privateSendClient), boost::ref(*g_connman)), 1);
20272031
#endif // ENABLE_WALLET
20282032
}
20292033

src/masternodeman.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -882,11 +882,22 @@ void CMasternodeMan::ProcessMasternodeConnections(CConnman& connman)
882882
//we don't care about this for regtest
883883
if(Params().NetworkIDString() == CBaseChainParams::REGTEST) return;
884884

885-
connman.ForEachNode(CConnman::AllNodes, [](CNode* pnode) {
885+
std::vector<masternode_info_t> vecMnInfo; // will be empty when no wallet
886886
#ifdef ENABLE_WALLET
887-
if(pnode->fMasternode && !privateSendClient.IsMixingMasternode(pnode)) {
888-
#else
889-
if(pnode->fMasternode) {
887+
privateSendClient.GetMixingMasternodesInfo(vecMnInfo);
888+
#endif // ENABLE_WALLET
889+
890+
connman.ForEachNode(CConnman::AllNodes, [&vecMnInfo](CNode* pnode) {
891+
if (pnode->fMasternode) {
892+
#ifdef ENABLE_WALLET
893+
bool fFound = false;
894+
for (const auto& mnInfo : vecMnInfo) {
895+
if (pnode->addr == mnInfo.addr) {
896+
fFound = true;
897+
break;
898+
}
899+
}
900+
if (fFound) return; // do NOT disconnect mixing masternodes
890901
#endif // ENABLE_WALLET
891902
LogPrintf("Closing Masternode connection: peer=%d, addr=%s\n", pnode->id, pnode->addr.ToString());
892903
pnode->fDisconnect = true;

src/net.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ static const int MAX_OUTBOUND_CONNECTIONS = 8;
6565
/** Maximum number of addnode outgoing nodes */
6666
static const int MAX_ADDNODE_CONNECTIONS = 8;
6767
/** Maximum number if outgoing masternodes */
68-
static const int MAX_OUTBOUND_MASTERNODE_CONNECTIONS = 20;
68+
static const int MAX_OUTBOUND_MASTERNODE_CONNECTIONS = 30;
6969
/** -listen default */
7070
static const bool DEFAULT_LISTEN = true;
7171
/** -upnp default */

0 commit comments

Comments
 (0)