This commit is contained in:
ximinez
2025-01-30 00:21:40 +00:00
parent 03ec0daedc
commit 0ada00157c
1710 changed files with 17459 additions and 16812 deletions

View File

@@ -1129,272 +1129,277 @@ $(function() {
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keywordflow">if</span> (packet.nodes().empty())</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> {</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> JLOG(journal_.warn()) &lt;&lt; peer-&gt;id() &lt;&lt; <span class="stringliteral">&quot;: empty header data&quot;</span>;</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> peer-&gt;charge(Resource::feeInvalidRequest);</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> }</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> </div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> <a class="code hl_class" href="classripple_1_1SHAMapAddNode.html">SHAMapAddNode</a> san;</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> </div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">ScopedLockType</a> sl(mtx_);</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> </div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> <span class="keywordflow">try</span></div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> {</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> <span class="keywordflow">if</span> (!mHaveHeader)</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> {</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> <span class="keywordflow">if</span> (!takeHeader(packet.nodes(0).nodedata()))</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> {</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Got invalid header data&quot;</span>;</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> peer-&gt;charge(Resource::feeInvalidRequest);</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> }</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> </div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a1d96058e6d0660582c89f55e14178dff">incUseful</a>();</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> }</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> peer-&gt;charge(</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> Resource::feeMalformedRequest, <span class="stringliteral">&quot;ledger_data empty header&quot;</span>);</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> }</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> </div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> <a class="code hl_class" href="classripple_1_1SHAMapAddNode.html">SHAMapAddNode</a> san;</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> </div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">ScopedLockType</a> sl(mtx_);</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> </div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="keywordflow">try</span></div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> {</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keywordflow">if</span> (!mHaveHeader)</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> {</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <span class="keywordflow">if</span> (!takeHeader(packet.nodes(0).nodedata()))</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> {</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Got invalid header data&quot;</span>;</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> peer-&gt;charge(</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> Resource::feeMalformedRequest,</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="stringliteral">&quot;ledger_data invalid header&quot;</span>);</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> }</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> </div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> <span class="keywordflow">if</span> (!mHaveState &amp;&amp; (packet.nodes().size() &gt; 1) &amp;&amp;</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> !takeAsRootNode(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(packet.nodes(1).nodedata()), san))</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> {</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Included AS root invalid&quot;</span>;</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> }</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> </div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> <span class="keywordflow">if</span> (!mHaveTransactions &amp;&amp; (packet.nodes().size() &gt; 2) &amp;&amp;</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> !takeTxRootNode(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(packet.nodes(2).nodedata()), san))</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> {</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Included TX root invalid&quot;</span>;</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> }</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> }</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> <span class="keywordflow">catch</span> (<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/exception.html">std::exception</a> <span class="keyword">const</span>&amp; ex)</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> {</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> JLOG(journal_.warn())</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> &lt;&lt; <span class="stringliteral">&quot;Included AS/TX root invalid: &quot;</span> &lt;&lt; ex.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/error/exception/what.html">what</a>();</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> peer-&gt;charge(Resource::feeBadData);</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> }</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> </div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> <span class="keywordflow">if</span> (san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a8ee63e4e99e3e76fc3dc87c1b68efe11">isUseful</a>())</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> progress_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> </div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> mStats += san;</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> <span class="keywordflow">return</span> san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a55de5e3be829d8f1525d5bd180371769">getGood</a>();</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> }</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a1d96058e6d0660582c89f55e14178dff">incUseful</a>();</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> }</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> </div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> <span class="keywordflow">if</span> (!mHaveState &amp;&amp; (packet.nodes().size() &gt; 1) &amp;&amp;</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> !takeAsRootNode(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(packet.nodes(1).nodedata()), san))</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> {</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Included AS root invalid&quot;</span>;</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> }</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> </div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> <span class="keywordflow">if</span> (!mHaveTransactions &amp;&amp; (packet.nodes().size() &gt; 2) &amp;&amp;</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> !takeTxRootNode(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(packet.nodes(2).nodedata()), san))</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> {</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Included TX root invalid&quot;</span>;</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> }</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> }</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> <span class="keywordflow">catch</span> (<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/exception.html">std::exception</a> <span class="keyword">const</span>&amp; ex)</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> {</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> JLOG(journal_.warn())</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> &lt;&lt; <span class="stringliteral">&quot;Included AS/TX root invalid: &quot;</span> &lt;&lt; ex.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/error/exception/what.html">what</a>();</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> peer-&gt;charge(Resource::feeInvalidData, <span class="stringliteral">&quot;ledger_data &quot;</span>s + ex.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/error/exception/what.html">what</a>());</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> }</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> </div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> <span class="keywordflow">if</span> (san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a8ee63e4e99e3e76fc3dc87c1b68efe11">isUseful</a>())</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> progress_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> </div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keywordflow">if</span> ((packet.type() == protocol::liTX_NODE) ||</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> (packet.type() == protocol::liAS_NODE))</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> {</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> type = packet.type() == protocol::liTX_NODE ? <span class="stringliteral">&quot;liTX_NODE: &quot;</span></div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> : <span class="stringliteral">&quot;liAS_NODE: &quot;</span>;</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> </div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> <span class="keywordflow">if</span> (packet.nodes().empty())</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> {</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> JLOG(journal_.info()) &lt;&lt; peer-&gt;id() &lt;&lt; <span class="stringliteral">&quot;: response with no nodes&quot;</span>;</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> peer-&gt;charge(Resource::feeInvalidRequest);</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> }</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> </div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">ScopedLockType</a> sl(mtx_);</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> </div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> <span class="comment">// Verify node IDs and data are complete</span></div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; node : packet.nodes())</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> {</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> <span class="keywordflow">if</span> (!node.has_nodeid() || !node.has_nodedata())</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> {</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Got bad node&quot;</span>;</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> peer-&gt;charge(Resource::feeInvalidRequest);</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> }</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> }</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> </div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> <a class="code hl_class" href="classripple_1_1SHAMapAddNode.html">SHAMapAddNode</a> san;</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> receiveNode(packet, san);</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> </div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> JLOG(journal_.debug())</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> &lt;&lt; <span class="stringliteral">&quot;Ledger &quot;</span></div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> &lt;&lt; ((packet.type() == protocol::liTX_NODE) ? <span class="stringliteral">&quot;TX&quot;</span> : <span class="stringliteral">&quot;AS&quot;</span>)</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> &lt;&lt; <span class="stringliteral">&quot; node stats: &quot;</span> &lt;&lt; san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#ae1c5b7485868021ccfdb3f59ca29e55b">get</a>();</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> mStats += san;</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> <span class="keywordflow">return</span> san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a55de5e3be829d8f1525d5bd180371769">getGood</a>();</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> }</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> </div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> <span class="keywordflow">if</span> ((packet.type() == protocol::liTX_NODE) ||</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> (packet.type() == protocol::liAS_NODE))</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> {</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> type = packet.type() == protocol::liTX_NODE ? <span class="stringliteral">&quot;liTX_NODE: &quot;</span></div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> : <span class="stringliteral">&quot;liAS_NODE: &quot;</span>;</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> </div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> <span class="keywordflow">if</span> (packet.nodes().empty())</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> {</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> JLOG(journal_.info()) &lt;&lt; peer-&gt;id() &lt;&lt; <span class="stringliteral">&quot;: response with no nodes&quot;</span>;</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> peer-&gt;charge(Resource::feeMalformedRequest, <span class="stringliteral">&quot;ledger_data no nodes&quot;</span>);</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> }</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> </div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">ScopedLockType</a> sl(mtx_);</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> </div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> <span class="comment">// Verify node IDs and data are complete</span></div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; node : packet.nodes())</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> {</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> <span class="keywordflow">if</span> (!node.has_nodeid() || !node.has_nodedata())</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> {</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> JLOG(journal_.warn()) &lt;&lt; <span class="stringliteral">&quot;Got bad node&quot;</span>;</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> peer-&gt;charge(</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> Resource::feeMalformedRequest, <span class="stringliteral">&quot;ledger_data bad node&quot;</span>);</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> }</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> }</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> </div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> <a class="code hl_class" href="classripple_1_1SHAMapAddNode.html">SHAMapAddNode</a> san;</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> receiveNode(packet, san);</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> </div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> <span class="keywordflow">if</span> (san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a8ee63e4e99e3e76fc3dc87c1b68efe11">isUseful</a>())</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> progress_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> </div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> mStats += san;</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> <span class="keywordflow">return</span> san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a55de5e3be829d8f1525d5bd180371769">getGood</a>();</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> }</div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> </div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span>}</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> </div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span><span class="keyword">namespace </span>detail {</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span><span class="comment">// Track the amount of useful data that each peer returns</span></div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html"> 1172</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structripple_1_1detail_1_1PeerDataCounts.html">PeerDataCounts</a></div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span>{</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> <span class="comment">// Map from peer to amount of useful the peer returned</span></div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#a04c78bdcf776a44d621ffc1ce70ea15e"> 1175</a></span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_map.html">std::unordered_map&lt;std::shared_ptr&lt;Peer&gt;</a>, <span class="keywordtype">int</span>&gt; <a class="code hl_variable" href="structripple_1_1detail_1_1PeerDataCounts.html#a04c78bdcf776a44d621ffc1ce70ea15e">counts</a>;</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> <span class="comment">// The largest amount of useful data that any peer returned</span></div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#a43c1b9a32956031eb133972b6053feb6"> 1177</a></span> <span class="keywordtype">int</span> maxCount = 0;</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> </div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> <span class="comment">// Update the data count for a peer</span></div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1"> 1181</a></span> <a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1">update</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Peer&gt;</a>&amp;&amp; peer, <span class="keywordtype">int</span> dataCount)</div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> {</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <span class="keywordflow">if</span> (dataCount &lt;= 0)</div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> maxCount = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(maxCount, dataCount);</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> <span class="keyword">auto</span> i = counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/find.html">find</a>(peer);</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> <span class="keywordflow">if</span> (i == counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>())</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> {</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/emplace.html">emplace</a>(std::move(peer), dataCount);</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> }</div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> i-&gt;second = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(i-&gt;second, dataCount);</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> }</div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> </div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> <span class="comment">// Prune all the peers that didn&#39;t return enough data.</span></div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5"> 1197</a></span> <a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5">prune</a>()</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> {</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> <span class="comment">// Remove all the peers that didn&#39;t return at least half as much data as</span></div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> <span class="comment">// the best peer</span></div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> <span class="keyword">auto</span> <span class="keyword">const</span> thresh = maxCount / 2;</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> <span class="keyword">auto</span> i = counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/begin.html">begin</a>();</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> <span class="keywordflow">while</span> (i != counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>())</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> {</div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> <span class="keywordflow">if</span> (i-&gt;second &lt; thresh)</div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> i = counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/erase.html">erase</a>(i);</div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> ++i;</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> }</div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> }</div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> </div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> <span class="comment">// call F with the `peer` parameter with a random sample of at most n values</span></div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> <span class="comment">// of the counts vector.</span></div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> F&gt;</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f"> 1216</a></span> <a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f">sampleN</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> n, F&amp;&amp; f)</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> {</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> <span class="keywordflow">if</span> (counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/empty.html">empty</a>())</div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> </div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> <span class="keyword">auto</span> outFunc = [&amp;f](<span class="keyword">auto</span>&amp;&amp; v) { f(v.first); };</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/numeric/random/linear_congruential_engine.html">std::minstd_rand</a> rng{<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/numeric/random/random_device.html">std::random_device</a>{}()};</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span><span class="preprocessor">#if _MSC_VER</span></div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::pair&lt;std::shared_ptr&lt;Peer&gt;</a>, <span class="keywordtype">int</span>&gt;&gt; s;</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> s.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(n);</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/sample.html">std::sample</a>(</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/begin.html">begin</a>(), counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>(), <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/back_inserter.html">std::back_inserter</a>(s), n, rng);</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; v : s)</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> {</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> outFunc(v);</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> }</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/sample.html">std::sample</a>(</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/begin.html">begin</a>(),</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>(),</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> boost::make_function_output_iterator(outFunc),</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> n,</div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> rng);</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> }</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span>};</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span>} <span class="comment">// namespace detail</span></div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> </div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span><span class="keywordtype">void</span></div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"><a class="line" href="classripple_1_1InboundLedger.html#a0fcb919dd1a3c7f0e37525aee124ee7d"> 1248</a></span>InboundLedger::runData()</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span>{</div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> <span class="comment">// Maximum number of peers to request data from</span></div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> <span class="keyword">constexpr</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxUsefulPeers = 6;</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> </div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> <span class="keyword">decltype</span>(mReceivedData) data;</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span> </div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> <span class="comment">// Reserve some memory so the first couple iterations don&#39;t reallocate</span></div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> data.reserve(8);</div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> JLOG(journal_.debug())</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> &lt;&lt; <span class="stringliteral">&quot;Ledger &quot;</span></div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> &lt;&lt; ((packet.type() == protocol::liTX_NODE) ? <span class="stringliteral">&quot;TX&quot;</span> : <span class="stringliteral">&quot;AS&quot;</span>)</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> &lt;&lt; <span class="stringliteral">&quot; node stats: &quot;</span> &lt;&lt; san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#ae1c5b7485868021ccfdb3f59ca29e55b">get</a>();</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> </div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> <span class="keywordflow">if</span> (san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a8ee63e4e99e3e76fc3dc87c1b68efe11">isUseful</a>())</div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> progress_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> </div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> mStats += san;</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> <span class="keywordflow">return</span> san.<a class="code hl_function" href="classripple_1_1SHAMapAddNode.html#a55de5e3be829d8f1525d5bd180371769">getGood</a>();</div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> }</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> </div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span>}</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> </div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span><span class="keyword">namespace </span>detail {</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span><span class="comment">// Track the amount of useful data that each peer returns</span></div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html"> 1177</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structripple_1_1detail_1_1PeerDataCounts.html">PeerDataCounts</a></div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span>{</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> <span class="comment">// Map from peer to amount of useful the peer returned</span></div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#a04c78bdcf776a44d621ffc1ce70ea15e"> 1180</a></span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_map.html">std::unordered_map&lt;std::shared_ptr&lt;Peer&gt;</a>, <span class="keywordtype">int</span>&gt; <a class="code hl_variable" href="structripple_1_1detail_1_1PeerDataCounts.html#a04c78bdcf776a44d621ffc1ce70ea15e">counts</a>;</div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> <span class="comment">// The largest amount of useful data that any peer returned</span></div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#a43c1b9a32956031eb133972b6053feb6"> 1182</a></span> <span class="keywordtype">int</span> maxCount = 0;</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> </div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="comment">// Update the data count for a peer</span></div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1"> 1186</a></span> <a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1">update</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Peer&gt;</a>&amp;&amp; peer, <span class="keywordtype">int</span> dataCount)</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> {</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> <span class="keywordflow">if</span> (dataCount &lt;= 0)</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> maxCount = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(maxCount, dataCount);</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> <span class="keyword">auto</span> i = counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/find.html">find</a>(peer);</div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> <span class="keywordflow">if</span> (i == counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>())</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> {</div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/emplace.html">emplace</a>(std::move(peer), dataCount);</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> }</div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> i-&gt;second = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(i-&gt;second, dataCount);</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> }</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> </div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> <span class="comment">// Prune all the peers that didn&#39;t return enough data.</span></div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5"> 1202</a></span> <a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5">prune</a>()</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> {</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> <span class="comment">// Remove all the peers that didn&#39;t return at least half as much data as</span></div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> <span class="comment">// the best peer</span></div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> <span class="keyword">auto</span> <span class="keyword">const</span> thresh = maxCount / 2;</div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="keyword">auto</span> i = counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/begin.html">begin</a>();</div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> <span class="keywordflow">while</span> (i != counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>())</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> {</div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> <span class="keywordflow">if</span> (i-&gt;second &lt; thresh)</div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> i = counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/erase.html">erase</a>(i);</div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> ++i;</div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> }</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> }</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> </div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> <span class="comment">// call F with the `peer` parameter with a random sample of at most n values</span></div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> <span class="comment">// of the counts vector.</span></div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> F&gt;</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"><a class="line" href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f"> 1221</a></span> <a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f">sampleN</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> n, F&amp;&amp; f)</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> {</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> <span class="keywordflow">if</span> (counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/empty.html">empty</a>())</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> </div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <span class="keyword">auto</span> outFunc = [&amp;f](<span class="keyword">auto</span>&amp;&amp; v) { f(v.first); };</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/numeric/random/linear_congruential_engine.html">std::minstd_rand</a> rng{<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/numeric/random/random_device.html">std::random_device</a>{}()};</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span><span class="preprocessor">#if _MSC_VER</span></div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::pair&lt;std::shared_ptr&lt;Peer&gt;</a>, <span class="keywordtype">int</span>&gt;&gt; s;</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> s.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(n);</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/sample.html">std::sample</a>(</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/begin.html">begin</a>(), counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>(), <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/back_inserter.html">std::back_inserter</a>(s), n, rng);</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; v : s)</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> {</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> outFunc(v);</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> }</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/sample.html">std::sample</a>(</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/begin.html">begin</a>(),</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> counts.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_map/end.html">end</a>(),</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> boost::make_function_output_iterator(outFunc),</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> n,</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> rng);</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> }</div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span>};</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span>} <span class="comment">// namespace detail</span></div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> </div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span><span class="keywordtype">void</span></div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"><a class="line" href="classripple_1_1InboundLedger.html#a0fcb919dd1a3c7f0e37525aee124ee7d"> 1253</a></span>InboundLedger::runData()</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span>{</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> <span class="comment">// Maximum number of peers to request data from</span></div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> <span class="keyword">constexpr</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxUsefulPeers = 6;</div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> </div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> <a class="code hl_struct" href="structripple_1_1detail_1_1PeerDataCounts.html">detail::PeerDataCounts</a> dataCounts;</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> <span class="keyword">decltype</span>(mReceivedData) data;</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> </div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> <span class="keywordflow">for</span> (;;)</div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> {</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> data.clear();</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> </div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> {</div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> sl(mReceivedDataLock);</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> </div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> <span class="keywordflow">if</span> (mReceivedData.empty())</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> {</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> mReceiveDispatched = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> }</div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> </div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> data.swap(mReceivedData);</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> }</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> </div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; entry : data)</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> {</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> <span class="keywordflow">if</span> (<span class="keyword">auto</span> peer = entry.first.lock())</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> {</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> <span class="keywordtype">int</span> count = processData(peer, *(entry.second));</div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> dataCounts.<a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1">update</a>(std::move(peer), count);</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> }</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> }</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> }</div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> </div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> <span class="comment">// Select a random sample of the peers that gives us the most nodes that are</span></div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> <span class="comment">// useful</span></div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> dataCounts.<a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5">prune</a>();</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> dataCounts.<a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f">sampleN</a>(maxUsefulPeers, [&amp;](<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Peer&gt;</a> <span class="keyword">const</span>&amp; peer) {</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> trigger(peer, TriggerReason::reply);</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> });</div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span>}</div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> </div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span><a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"><a class="line" href="classripple_1_1InboundLedger.html#a069c3ef1adae2c6d17c67e71071ca962"> 1295</a></span>InboundLedger::getJson(<span class="keywordtype">int</span>)</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span>{</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> ret(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> <span class="comment">// Reserve some memory so the first couple iterations don&#39;t reallocate</span></div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> data.reserve(8);</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> </div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> <a class="code hl_struct" href="structripple_1_1detail_1_1PeerDataCounts.html">detail::PeerDataCounts</a> dataCounts;</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> </div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <span class="keywordflow">for</span> (;;)</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> {</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> data.clear();</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> </div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> {</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> sl(mReceivedDataLock);</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> </div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> <span class="keywordflow">if</span> (mReceivedData.empty())</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> {</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> mReceiveDispatched = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> }</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> </div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> data.swap(mReceivedData);</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> }</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> </div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; entry : data)</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> {</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> <span class="keywordflow">if</span> (<span class="keyword">auto</span> peer = entry.first.lock())</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> {</div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> <span class="keywordtype">int</span> count = processData(peer, *(entry.second));</div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> dataCounts.<a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1">update</a>(std::move(peer), count);</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> }</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> }</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> }</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> </div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> <span class="comment">// Select a random sample of the peers that gives us the most nodes that are</span></div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span> <span class="comment">// useful</span></div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> dataCounts.<a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5">prune</a>();</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> dataCounts.<a class="code hl_function" href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f">sampleN</a>(maxUsefulPeers, [&amp;](<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Peer&gt;</a> <span class="keyword">const</span>&amp; peer) {</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> trigger(peer, TriggerReason::reply);</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> });</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span>}</div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> </div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">ScopedLockType</a> sl(mtx_);</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> </div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> ret[jss::hash] = to_string(hash_);</div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> </div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> <span class="keywordflow">if</span> (complete_)</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> ret[jss::complete] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span><a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"><a class="line" href="classripple_1_1InboundLedger.html#a069c3ef1adae2c6d17c67e71071ca962"> 1300</a></span>InboundLedger::getJson(<span class="keywordtype">int</span>)</div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span>{</div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> ret(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> </div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">ScopedLockType</a> sl(mtx_);</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> </div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> <span class="keywordflow">if</span> (failed_)</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> ret[jss::failed] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> </div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> <span class="keywordflow">if</span> (!complete_ &amp;&amp; !failed_)</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> ret[jss::peers] = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(mPeerSet-&gt;getPeerIds().size());</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> </div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> ret[jss::have_header] = mHaveHeader;</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> ret[jss::hash] = to_string(hash_);</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> </div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <span class="keywordflow">if</span> (complete_)</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> ret[jss::complete] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> </div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> <span class="keywordflow">if</span> (failed_)</div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> ret[jss::failed] = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> </div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <span class="keywordflow">if</span> (mHaveHeader)</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> {</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> ret[jss::have_state] = mHaveState;</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> ret[jss::have_transactions] = mHaveTransactions;</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> }</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> </div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> ret[jss::timeouts] = timeouts_;</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> </div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> <span class="keywordflow">if</span> (mHaveHeader &amp;&amp; !mHaveState)</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> {</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> hv(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; h : neededStateHashes(16, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> {</div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> hv.<a class="code hl_function" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(to_string(h));</div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> }</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> ret[jss::needed_state_hashes] = hv;</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> }</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> </div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> <span class="keywordflow">if</span> (mHaveHeader &amp;&amp; !mHaveTransactions)</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> {</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> hv(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; h : neededTxHashes(16, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span> {</div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> hv.<a class="code hl_function" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(to_string(h));</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> }</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> ret[jss::needed_transaction_hashes] = hv;</div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> }</div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> </div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span>}</div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> </div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span>} <span class="comment">// namespace ripple</span></div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <span class="keywordflow">if</span> (!complete_ &amp;&amp; !failed_)</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> ret[jss::peers] = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(mPeerSet-&gt;getPeerIds().size());</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> </div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> ret[jss::have_header] = mHaveHeader;</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> </div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> <span class="keywordflow">if</span> (mHaveHeader)</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> {</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> ret[jss::have_state] = mHaveState;</div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> ret[jss::have_transactions] = mHaveTransactions;</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> }</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> </div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> ret[jss::timeouts] = timeouts_;</div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> </div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> <span class="keywordflow">if</span> (mHaveHeader &amp;&amp; !mHaveState)</div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> {</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> hv(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; h : neededStateHashes(16, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> {</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> hv.<a class="code hl_function" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(to_string(h));</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> }</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> ret[jss::needed_state_hashes] = hv;</div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> }</div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span> </div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> <span class="keywordflow">if</span> (mHaveHeader &amp;&amp; !mHaveTransactions)</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> {</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> hv(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; h : neededTxHashes(16, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> {</div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> hv.<a class="code hl_function" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(to_string(h));</div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span> }</div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> ret[jss::needed_transaction_hashes] = hv;</div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span> }</div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> </div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span>}</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> </div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span>} <span class="comment">// namespace ripple</span></div>
<div class="ttc" id="aaddressof_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/memory/addressof.html">std::addressof</a></div><div class="ttdeci">T addressof(T... args)</div></div>
<div class="ttc" id="aalgorithm_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/algorithm.html">algorithm</a></div></div>
<div class="ttc" id="aback_inserter_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/back_inserter.html">std::back_inserter</a></div><div class="ttdeci">T back_inserter(T... args)</div></div>
@@ -1538,11 +1543,11 @@ $(function() {
<div class="ttc" id="ashared_ptr_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr</a></div></div>
<div class="ttc" id="asize_t_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div></div>
<div class="ttc" id="astable_partition_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/stable_partition.html">std::stable_partition</a></div><div class="ttdeci">T stable_partition(T... args)</div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html">ripple::detail::PeerDataCounts</a></div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01172">InboundLedger.cpp:1173</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_a04c78bdcf776a44d621ffc1ce70ea15e"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#a04c78bdcf776a44d621ffc1ce70ea15e">ripple::detail::PeerDataCounts::counts</a></div><div class="ttdeci">std::unordered_map&lt; std::shared_ptr&lt; Peer &gt;, int &gt; counts</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01175">InboundLedger.cpp:1175</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_a90378cd814a44a39f686716eea07a3b5"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5">ripple::detail::PeerDataCounts::prune</a></div><div class="ttdeci">void prune()</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01197">InboundLedger.cpp:1197</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_aa3cfac93d527617e7bfde715cb26e73f"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f">ripple::detail::PeerDataCounts::sampleN</a></div><div class="ttdeci">void sampleN(std::size_t n, F &amp;&amp;f)</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01216">InboundLedger.cpp:1216</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_aa90eba0ed0077aefb8ba157b524abfe1"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1">ripple::detail::PeerDataCounts::update</a></div><div class="ttdeci">void update(std::shared_ptr&lt; Peer &gt; &amp;&amp;peer, int dataCount)</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01181">InboundLedger.cpp:1181</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html">ripple::detail::PeerDataCounts</a></div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01177">InboundLedger.cpp:1178</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_a04c78bdcf776a44d621ffc1ce70ea15e"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#a04c78bdcf776a44d621ffc1ce70ea15e">ripple::detail::PeerDataCounts::counts</a></div><div class="ttdeci">std::unordered_map&lt; std::shared_ptr&lt; Peer &gt;, int &gt; counts</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01180">InboundLedger.cpp:1180</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_a90378cd814a44a39f686716eea07a3b5"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#a90378cd814a44a39f686716eea07a3b5">ripple::detail::PeerDataCounts::prune</a></div><div class="ttdeci">void prune()</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01202">InboundLedger.cpp:1202</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_aa3cfac93d527617e7bfde715cb26e73f"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#aa3cfac93d527617e7bfde715cb26e73f">ripple::detail::PeerDataCounts::sampleN</a></div><div class="ttdeci">void sampleN(std::size_t n, F &amp;&amp;f)</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01221">InboundLedger.cpp:1221</a></div></div>
<div class="ttc" id="astructripple_1_1detail_1_1PeerDataCounts_html_aa90eba0ed0077aefb8ba157b524abfe1"><div class="ttname"><a href="structripple_1_1detail_1_1PeerDataCounts.html#aa90eba0ed0077aefb8ba157b524abfe1">ripple::detail::PeerDataCounts::update</a></div><div class="ttdeci">void update(std::shared_ptr&lt; Peer &gt; &amp;&amp;peer, int dataCount)</div><div class="ttdef"><b>Definition:</b> <a href="InboundLedger_8cpp_source.html#l01186">InboundLedger.cpp:1186</a></div></div>
<div class="ttc" id="ato_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a></div><div class="ttdeci">T to_string(T... args)</div></div>
<div class="ttc" id="atuple_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/tuple.html">std::tuple</a></div></div>
<div class="ttc" id="aunique_lock_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">std::unique_lock&lt; std::recursive_mutex &gt;</a></div></div>