@@ -27,6 +27,12 @@ using namespace bcos;
2727void MasterCache::addCalculatorCipher (std::string _peerId,
2828 std::map<uint32_t , bcos::bytes>&& _cipherData, uint32_t seq, uint32_t dataBatchCount)
2929{
30+ auto peerIndex = getPeerIndex (_peerId);
31+ if (peerIndex == -1 )
32+ {
33+ ECDH_MULTI_LOG (WARNING) << LOG_DESC (" Invalid calculator" ) << LOG_KV (" peer" , _peerId);
34+ return ;
35+ }
3036 bcos::Guard l (m_mutex);
3137 m_calculatorCipherSeqs.insert (seq);
3238 if (dataBatchCount)
@@ -35,7 +41,7 @@ void MasterCache::addCalculatorCipher(std::string _peerId,
3541 }
3642 for (auto && it : _cipherData)
3743 {
38- updateMasterDataRef (_peerId , std::move (it.second ), it.first );
44+ updateMasterDataRef (peerIndex , std::move (it.second ), it.first );
3945 }
4046 // try to merge the
4147 if (m_calculatorDataBatchCount > 0 &&
@@ -46,18 +52,22 @@ void MasterCache::addCalculatorCipher(std::string _peerId,
4652 << LOG_KV (" masterData" , m_masterDataRef.size ()) << printCacheState ();
4753 m_finishedPartners.insert (_peerId);
4854 // try to merge
49- mergeMasterCipher (_peerId);
55+ mergeMasterCipher (_peerId, peerIndex );
5056 }
5157 ECDH_MULTI_LOG (INFO) << LOG_DESC (
5258 " addCalculatorCipher: master receive cipher data from calculator" )
5359 << LOG_KV (" calculator" , _peerId) << printCacheState ()
5460 << LOG_KV (" receivedSize" , _cipherData.size ())
5561 << LOG_KV (" masterData" , m_masterDataRef.size ())
5662 << LOG_KV (" dataBatchCount" , m_calculatorDataBatchCount);
63+ // release the cipherData
64+ _cipherData.clear ();
65+ std::map<uint32_t , bcos::bytes>().swap (_cipherData);
66+ MallocExtension::instance ()->ReleaseFreeMemory ();
5767}
5868
5969void MasterCache::updateMasterDataRef (
60- std::string const & _peerId , bcos::bytes&& data, int32_t dataIndex)
70+ unsigned short _peerIndex , bcos::bytes&& data, int32_t dataIndex)
6171{
6272 // not merged case
6373 if (!m_peerMerged)
@@ -66,21 +76,21 @@ void MasterCache::updateMasterDataRef(
6676 if (!m_masterDataRef.count (data))
6777 {
6878 MasterCipherRef ref;
69- ref.refInfo .insert (_peerId );
79+ ref.refInfo .insert (_peerIndex );
7080 ref.updateDataIndex (dataIndex);
7181 m_masterDataRef.insert (std::make_pair (std::move (data), ref));
7282 return ;
7383 }
7484 // existed data case
75- m_masterDataRef[data].refInfo .insert (_peerId );
85+ m_masterDataRef[data].refInfo .insert (_peerIndex );
7686 m_masterDataRef[data].updateDataIndex (dataIndex);
7787 return ;
7888 }
7989
80- // merged case, only record the intersection case
90+ // merged case, only record the intersection case, increase the refCount
8191 if (m_masterDataRef.count (data))
8292 {
83- m_masterDataRef[data].refInfo . insert (_peerId) ;
93+ m_masterDataRef[data].refCount += 1 ;
8494 m_masterDataRef[data].updateDataIndex (dataIndex);
8595 }
8696}
@@ -89,18 +99,27 @@ void MasterCache::updateMasterDataRef(
8999void MasterCache::addPartnerCipher (std::string _peerId, std::vector<bcos::bytes>&& _cipherData,
90100 uint32_t seq, uint32_t parternerDataCount)
91101{
102+ auto peerIndex = getPeerIndex (_peerId);
103+ if (peerIndex == -1 )
104+ {
105+ ECDH_MULTI_LOG (WARNING) << LOG_DESC (" Invalid peerId" ) << LOG_KV (" peer" , _peerId);
106+ return ;
107+ }
92108 bcos::Guard lock (m_mutex);
93109 // record the data-ref-count
94110 for (auto && data : _cipherData)
95111 {
96- updateMasterDataRef (_peerId , std::move (data), -1 );
112+ updateMasterDataRef (peerIndex , std::move (data), -1 );
97113 }
98114 m_partnerCipherSeqs[_peerId].insert (seq);
99115 ECDH_MULTI_LOG (INFO) << LOG_DESC (" addPartnerCipher" ) << LOG_KV (" partner" , _peerId)
100116 << LOG_KV (" seqSize" , m_partnerCipherSeqs.at (_peerId).size ())
101117 << LOG_KV (" cipherDataSize" , _cipherData.size ())
102118 << LOG_KV (" masterDataSize" , m_masterDataRef.size ())
103119 << LOG_KV (" parternerDataCount" , parternerDataCount) << printCacheState ();
120+ _cipherData.clear ();
121+ std::vector<bcos::bytes>().swap (_cipherData);
122+ MallocExtension::instance ()->ReleaseFreeMemory ();
104123 if (parternerDataCount > 0 )
105124 {
106125 m_parternerDataCount.insert (std::make_pair (_peerId, parternerDataCount));
@@ -114,11 +133,11 @@ void MasterCache::addPartnerCipher(std::string _peerId, std::vector<bcos::bytes>
114133 {
115134 m_finishedPartners.insert (_peerId);
116135 // merge when find the send-finished peer
117- mergeMasterCipher (_peerId);
136+ mergeMasterCipher (_peerId, peerIndex );
118137 }
119138}
120139
121- void MasterCache::mergeMasterCipher (std::string const & peer )
140+ void MasterCache::mergeMasterCipher (std::string const & peerId, unsigned short peerIndex )
122141{
123142 if (m_peerMerged)
124143 {
@@ -131,22 +150,28 @@ void MasterCache::mergeMasterCipher(std::string const& peer)
131150 }
132151 ECDH_MULTI_LOG (INFO) << LOG_DESC (" Receive whole data from peer, mergeMasterCipher" )
133152 << LOG_KV (" distinct-masterDataSize-before-merge" , m_masterDataRef.size ())
134- << LOG_KV (" finishedPeer" , peer ) << LOG_KV (" partnerCount" , m_peerCount);
153+ << LOG_KV (" finishedPeer" , peerId ) << LOG_KV (" partnerCount" , m_peerCount);
135154 auto startT = utcSteadyTime ();
136155 for (auto it = m_masterDataRef.begin (); it != m_masterDataRef.end ();)
137156 {
138157 // not has intersect-element with the finished peer
139- if (!it->second .refInfo .count (peer ))
158+ if (!it->second .refInfo .count (peerIndex ))
140159 {
141160 it = m_masterDataRef.erase (it);
142161 continue ;
143162 }
163+ // set the refCount
164+ it->second .refCount = it->second .refInfo .size ();
165+ // release the refInfo
166+ std::set<unsigned short >().swap (it->second .refInfo );
144167 it++;
145168 }
146169 m_peerMerged = true ;
170+ // release the free memory after merged
171+ MallocExtension::instance ()->ReleaseFreeMemory ();
147172 ECDH_MULTI_LOG (INFO) << LOG_DESC (" mergeMasterCipher finished" )
148173 << LOG_KV (" distinct-masterDataSize-after-merge" , m_masterDataRef.size ())
149- << LOG_KV (" finishedPeer" , peer )
174+ << LOG_KV (" finishedPeer" , peerId) << LOG_KV ( " peerIndex " , peerIndex )
150175 << LOG_KV (" timecost" , (utcSteadyTime () - startT));
151176}
152177
@@ -169,7 +194,7 @@ bool MasterCache::tryToIntersection()
169194 {
170195 continue ;
171196 }
172- if (m_masterDataRef.at (it.first ).refInfo . size () != m_peerCount)
197+ if (m_masterDataRef.at (it.first ).refCount != m_peerCount)
173198 {
174199 continue ;
175200 }
@@ -366,7 +391,10 @@ bool CalculatorCache::appendMasterCipher(
366391 }
367392 ECDH_MULTI_LOG (INFO) << LOG_DESC (" appendMasterCipher" ) << LOG_KV (" dataSize" , _cipherData.size ())
368393 << LOG_KV (" cipherRefSize" , m_cipherRef.size ()) << printCacheState ();
369-
394+ // release the cipherData
395+ _cipherData.clear ();
396+ std::vector<bcos::bytes>().swap (_cipherData);
397+ MallocExtension::instance ()->ReleaseFreeMemory ();
370398 return m_receiveAllMasterCipher;
371399}
372400
@@ -383,4 +411,8 @@ void CalculatorCache::setIntersectionCipher(std::map<uint32_t, bcos::bytes>&& _c
383411 m_receiveIntersection = true ;
384412 ECDH_MULTI_LOG (INFO) << LOG_DESC (" setIntersectionCipher finshed" )
385413 << LOG_KV (" cipherRefSize" , m_cipherRef.size ()) << printCacheState ();
414+ // release the cipherData
415+ _cipherData.clear ();
416+ std::map<uint32_t , bcos::bytes>().swap (_cipherData);
417+ MallocExtension::instance ()->ReleaseFreeMemory ();
386418}
0 commit comments