http://git-wip-us.apache.org/repos/asf/mesos-site/blob/fe7074dc/content/api/latest/c++/src_2master_2master_8hpp_source.html ---------------------------------------------------------------------- diff --git a/content/api/latest/c++/src_2master_2master_8hpp_source.html b/content/api/latest/c++/src_2master_2master_8hpp_source.html index b1558b4..a2046aa 100644 --- a/content/api/latest/c++/src_2master_2master_8hpp_source.html +++ b/content/api/latest/c++/src_2master_2master_8hpp_source.html @@ -2438,562 +2438,522 @@ <div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a4d211f2b6fca34349126f16bc2cef3e0">offerOperationUUIDs</a>.<a class="code" href="classhashmap.html#a040f93efd556981326f0809e0f24f9ef">put</a>(operation->info().id(), uuid.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div> <div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  }</div> <div class="line"><a name="l02501"></a><span class="lineno"> 2501</span> </div> -<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespacemesos_1_1internal_1_1protobuf.html#aa31907fb62769822a77c06ffbf10451f">protobuf::isTerminalState</a>(operation->latest_status().state())) {</div> -<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  Resource consumed;</div> -<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  <span class="keywordflow">switch</span> (operation->info().type()) {</div> -<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a5e5ce150a3e1b42ffcc0fd9e5ed659ab">Offer::Operation::LAUNCH</a>:</div> -<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#ac32a101c068371a2114b0f63a0c45db2">Offer::Operation::LAUNCH_GROUP</a>:</div> -<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a07ba9c332393ad463065495f37c5bced">Offer::Operation::RESERVE</a>:</div> -<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a7502aad15971920c0d5907ca2f010859">Offer::Operation::UNRESERVE</a>:</div> -<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a3fe53df8c99e8dce61568ce527030ce7">Offer::Operation::CREATE</a>:</div> -<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a8a7409ebbb940e352722588a8e0bb106">Offer::Operation::DESTROY</a>:</div> -<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  <span class="comment">// These operations are speculatively applied and not</span></div> -<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  <span class="comment">// tracked as used resources.</span></div> -<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#ae67135425b0456ebae180d4186e250f8">Offer::Operation::CREATE_VOLUME</a>:</div> -<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  consumed = operation->info().create_volume().source();</div> -<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a03cc7ba94a59d223379c2a43146c30d7">Offer::Operation::DESTROY_VOLUME</a>:</div> -<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  consumed = operation->info().destroy_volume().volume();</div> -<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#ab988081deb1490a177a1f122f70afd50">Offer::Operation::CREATE_BLOCK</a>:</div> -<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  consumed = operation->info().create_block().source();</div> -<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#abc0b608e4e39374cf9b22671ff4988a4">Offer::Operation::DESTROY_BLOCK</a>:</div> -<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>  consumed = operation->info().destroy_block().block();</div> -<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  <span class="keywordflow">case</span> <a class="code" href="namespacerouting_1_1diagnosis_1_1socket_1_1state.html#a4cceb5a8a4b3f5e1323fdf4a14c5d2a6">Offer::Operation::UNKNOWN</a>:</div> -<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  LOG(ERROR) << <span class="stringliteral">"Unknown offer operation"</span>;</div> -<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  }</div> -<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span> </div> -<div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  CHECK(operation->has_slave_id())</div> -<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  << <span class="stringliteral">"External resource provider is not supported yet"</span>;</div> +<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespacemesos_1_1internal_1_1protobuf.html#a19a8e8be02b815dab4cecd8382e3dd26">protobuf::isSpeculativeOperation</a>(operation->info()) &&</div> +<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  !<a class="code" href="namespacemesos_1_1internal_1_1protobuf.html#aa31907fb62769822a77c06ffbf10451f">protobuf::isTerminalState</a>(operation->latest_status().state())) {</div> +<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  <a class="code" href="classTry.html">Try<Resources></a> consumed =</div> +<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  <a class="code" href="namespacemesos_1_1internal_1_1protobuf.html#aaad34fc9798891303cecdba77c1e473c">protobuf::getConsumedResources</a>(operation->info());</div> +<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(consumed);</div> +<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span> </div> +<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  CHECK(operation->has_slave_id())</div> +<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  << <span class="stringliteral">"External resource provider is not supported yet"</span>;</div> +<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span> </div> +<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  <span class="keyword">const</span> SlaveID& slaveId = operation->slave_id();</div> +<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span> </div> +<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a> += consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>();</div> +<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId] += consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>();</div> +<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span> </div> +<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  <span class="comment">// It's possible that we're not tracking the role from the</span></div> +<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  <span class="comment">// resources in the offer operation for this framework if the</span></div> +<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  <span class="comment">// role is absent from the framework's set of roles. In this</span></div> +<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>  <span class="comment">// case, we track the role's allocation for this framework.</span></div> +<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  <a class="code" href="foreach_8hpp.html#acac417231a256d7c6164a86db970da86">foreachkey</a> (<span class="keyword">const</span> std::string& role, consumed->allocations()) {</div> +<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  <span class="keyword">auto</span> allocatedToRole = [&role](<span class="keyword">const</span> Resource& resource) {</div> +<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  <span class="keywordflow">return</span> resource.allocation_info().role() == role;</div> +<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  };</div> +<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span> </div> +<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>.count(role) == 0 &&</div> +<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>()) {</div> +<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a965f66810b71a0d2bab683fee1b6a9b6">totalOfferedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>());</div> +<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a3edaf411ec6e409a3f8b2a77988ef65a">untrackUnderRole</a>(role);</div> +<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  }</div> +<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>  }</div> +<div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  }</div> +<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  }</div> <div class="line"><a name="l02533"></a><span class="lineno"> 2533</span> </div> -<div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>  <span class="keyword">const</span> SlaveID& slaveId = operation->slave_id();</div> -<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span> </div> -<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a> += consumed;</div> -<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId] += consumed;</div> +<div class="line"><a name="l02534"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2cbf9814d6392f471a6970ed488be080"> 2534</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2cbf9814d6392f471a6970ed488be080">recoverResources</a>(OfferOperation* operation)</div> +<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  {</div> +<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  CHECK(operation->has_slave_id())</div> +<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  << <span class="stringliteral">"External resource provider is not supported yet"</span>;</div> <div class="line"><a name="l02538"></a><span class="lineno"> 2538</span> </div> -<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  <span class="comment">// It's possible that we're not tracking the role from the</span></div> -<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  <span class="comment">// resources in the offer operation for this framework if the</span></div> -<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="comment">// role is absent from the framework's set of roles. In this</span></div> -<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  <span class="comment">// case, we track the role's allocation for this framework.</span></div> -<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  <span class="keyword">const</span> std::string& role = consumed.allocation_info().role();</div> +<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  <span class="keyword">const</span> SlaveID& slaveId = operation->slave_id();</div> +<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span> </div> +<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="keywordflow">if</span> (<a class="code" href="namespacemesos_1_1internal_1_1protobuf.html#a19a8e8be02b815dab4cecd8382e3dd26">protobuf::isSpeculativeOperation</a>(operation->info())) {</div> +<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  }</div> <div class="line"><a name="l02544"></a><span class="lineno"> 2544</span> </div> -<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  <span class="keywordflow">if</span> (!<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a614fb3ba127133b939e2a733c6ecbf2a">isTrackedUnderRole</a>(role)) {</div> -<div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#afa185682905163563412aa1915e612c8">trackUnderRole</a>(role);</div> -<div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  }</div> -<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  }</div> -<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  }</div> -<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span> </div> -<div class="line"><a name="l02551"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2cbf9814d6392f471a6970ed488be080"> 2551</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2cbf9814d6392f471a6970ed488be080">recoverResources</a>(OfferOperation* operation)</div> -<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  {</div> -<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  CHECK(operation->has_slave_id())</div> -<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  << <span class="stringliteral">"External resource provider is not supported yet"</span>;</div> +<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  <a class="code" href="classTry.html">Try<Resources></a> consumed = <a class="code" href="namespacemesos_1_1internal_1_1protobuf.html#aaad34fc9798891303cecdba77c1e473c">protobuf::getConsumedResources</a>(operation->info());</div> +<div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(consumed);</div> +<div class="line"><a name="l02547"></a><span class="lineno"> 2547</span> </div> +<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a30fc4fe000da99818bfcee5bb780e5d4">contains</a>(consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()))</div> +<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  << <span class="stringliteral">"Tried to recover resources "</span> << consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()</div> +<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  << <span class="stringliteral">" which do not seem used"</span>;</div> +<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span> </div> +<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId].<a class="code" href="namespacestrings.html#a269921757daf11096d3f5e02686f8444">contains</a>(consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()))</div> +<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  << <span class="stringliteral">"Tried to recover resources "</span> << consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>() << <span class="stringliteral">" of agent "</span></div> +<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  << slaveId << <span class="stringliteral">" which do not seem used"</span>;</div> <div class="line"><a name="l02555"></a><span class="lineno"> 2555</span> </div> -<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  <span class="keyword">const</span> SlaveID& slaveId = operation->slave_id();</div> -<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span> </div> -<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  Resource consumed;</div> -<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  <span class="keywordflow">switch</span> (operation->info().type()) {</div> -<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a5e5ce150a3e1b42ffcc0fd9e5ed659ab">Offer::Operation::LAUNCH</a>:</div> -<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#ac32a101c068371a2114b0f63a0c45db2">Offer::Operation::LAUNCH_GROUP</a>:</div> -<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a07ba9c332393ad463065495f37c5bced">Offer::Operation::RESERVE</a>:</div> -<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a7502aad15971920c0d5907ca2f010859">Offer::Operation::UNRESERVE</a>:</div> -<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a3fe53df8c99e8dce61568ce527030ce7">Offer::Operation::CREATE</a>:</div> -<div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a8a7409ebbb940e352722588a8e0bb106">Offer::Operation::DESTROY</a>:</div> -<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  <span class="comment">// These operations are speculatively applied and not</span></div> -<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>  <span class="comment">// tracked as used resources.</span></div> -<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#ae67135425b0456ebae180d4186e250f8">Offer::Operation::CREATE_VOLUME</a>:</div> -<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  consumed = operation->info().create_volume().source();</div> -<div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#a03cc7ba94a59d223379c2a43146c30d7">Offer::Operation::DESTROY_VOLUME</a>:</div> -<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  consumed = operation->info().destroy_volume().volume();</div> -<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#ab988081deb1490a177a1f122f70afd50">Offer::Operation::CREATE_BLOCK</a>:</div> -<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  consumed = operation->info().create_block().source();</div> -<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  <span class="keywordflow">case</span> <a class="code" href="namespacemesos_1_1internal_1_1tests_1_1common.html#abc0b608e4e39374cf9b22671ff4988a4">Offer::Operation::DESTROY_BLOCK</a>:</div> -<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  consumed = operation->info().destroy_block().block();</div> -<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>  <span class="keywordflow">case</span> <a class="code" href="namespacerouting_1_1diagnosis_1_1socket_1_1state.html#a4cceb5a8a4b3f5e1323fdf4a14c5d2a6">Offer::Operation::UNKNOWN</a>:</div> -<div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  LOG(WARNING) << <span class="stringliteral">"Ignoring unknown offer operation"</span>;</div> -<div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  }</div> -<div class="line"><a name="l02585"></a><span class="lineno"> 2585</span> </div> -<div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a30fc4fe000da99818bfcee5bb780e5d4">contains</a>(consumed))</div> -<div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  << <span class="stringliteral">"Tried to recover resources "</span> << consumed</div> -<div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  << <span class="stringliteral">" which do not seem used"</span>;</div> -<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span> </div> -<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId].<a class="code" href="namespacestrings.html#a269921757daf11096d3f5e02686f8444">contains</a>(consumed))</div> -<div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>  << <span class="stringliteral">"Tried to recover resources "</span> << consumed << <span class="stringliteral">" of agent "</span></div> -<div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>  << slaveId << <span class="stringliteral">" which do not seem used"</span>;</div> +<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a> -= consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>();</div> +<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId] -= consumed.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>();</div> +<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId].empty()) {</div> +<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>.erase(slaveId);</div> +<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  }</div> +<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span> </div> +<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  <span class="comment">// If we are no longer subscribed to the role to which these</span></div> +<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  <span class="comment">// resources are being returned to, and we have no more resources</span></div> +<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <span class="comment">// allocated to us for that role, stop tracking the framework</span></div> +<div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  <span class="comment">// under the role.</span></div> +<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  <a class="code" href="foreach_8hpp.html#acac417231a256d7c6164a86db970da86">foreachkey</a> (<span class="keyword">const</span> std::string& role, consumed->allocations()) {</div> +<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>  <span class="keyword">auto</span> allocatedToRole = [&role](<span class="keyword">const</span> Resource& resource) {</div> +<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  <span class="keywordflow">return</span> resource.allocation_info().role() == role;</div> +<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  };</div> +<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span> </div> +<div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>.count(role) == 0 &&</div> +<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>()) {</div> +<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a965f66810b71a0d2bab683fee1b6a9b6">totalOfferedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>());</div> +<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a3edaf411ec6e409a3f8b2a77988ef65a">untrackUnderRole</a>(role);</div> +<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  }</div> +<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  }</div> +<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  }</div> +<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span> </div> +<div class="line"><a name="l02579"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#ad28965b324be81c14e5d41524e917beb"> 2579</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ad28965b324be81c14e5d41524e917beb">removeOfferOperation</a>(OfferOperation* operation)</div> +<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  {</div> +<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>  <a class="code" href="classTry.html">Try<UUID></a> uuid = UUID::fromBytes(operation->operation_uuid());</div> +<div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(uuid);</div> +<div class="line"><a name="l02583"></a><span class="lineno"> 2583</span> </div> +<div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a650e493bb396d724446d9571e5842901">offerOperations</a>.<a class="code" href="classhashmap.html#ac142b3f8b73c76d5d4545bbd299007e5">contains</a>(uuid.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()))</div> +<div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  << <span class="stringliteral">"Unknown offer operation '"</span> << operation->info().id()</div> +<div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  << <span class="stringliteral">"' (uuid: "</span> << uuid-><a class="code" href="structid_1_1UUID.html#af024badbc379374ac635031eed57dc5f">toString</a>() << <span class="stringliteral">") "</span></div> +<div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  << <span class="stringliteral">"of framework "</span> << operation->framework_id();</div> +<div class="line"><a name="l02588"></a><span class="lineno"> 2588</span> </div> +<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a650e493bb396d724446d9571e5842901">offerOperations</a>.erase(uuid.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div> +<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>  }</div> +<div class="line"><a name="l02591"></a><span class="lineno"> 2591</span> </div> +<div class="line"><a name="l02592"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417"> 2592</a></span>  <span class="keyword">const</span> FrameworkID <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417">id</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> info.id(); }</div> <div class="line"><a name="l02593"></a><span class="lineno"> 2593</span> </div> -<div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a> -= consumed;</div> -<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId] -= consumed;</div> -<div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>[slaveId].empty()) {</div> -<div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a9085d3f2c156a7772cbd243776a62491">usedResources</a>.erase(slaveId);</div> -<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  }</div> -<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span> </div> -<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="comment">// If we are no longer subscribed to the role to which these</span></div> -<div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  <span class="comment">// resources are being returned to, and we have no more resources</span></div> -<div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="comment">// allocated to us for that role, stop tracking the framework</span></div> -<div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="comment">// under the role.</span></div> -<div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  <span class="keyword">const</span> std::string& role = consumed.allocation_info().role();</div> -<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span> </div> -<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  <span class="keyword">auto</span> allocatedToRole = [&role](<span class="keyword">const</span> Resource& resource) {</div> -<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  <span class="keywordflow">return</span> resource.allocation_info().role() == role;</div> -<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  };</div> -<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span> </div> -<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>.count(role) == 0 &&</div> -<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>()) {</div> -<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a965f66810b71a0d2bab683fee1b6a9b6">totalOfferedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>());</div> -<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a3edaf411ec6e409a3f8b2a77988ef65a">untrackUnderRole</a>(role);</div> -<div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  }</div> -<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  }</div> -<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span> </div> -<div class="line"><a name="l02617"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#ad28965b324be81c14e5d41524e917beb"> 2617</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ad28965b324be81c14e5d41524e917beb">removeOfferOperation</a>(OfferOperation* operation)</div> -<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  {</div> -<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  <a class="code" href="classTry.html">Try<UUID></a> uuid = UUID::fromBytes(operation->operation_uuid());</div> -<div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(uuid);</div> -<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span> </div> -<div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a650e493bb396d724446d9571e5842901">offerOperations</a>.<a class="code" href="classhashmap.html#ac142b3f8b73c76d5d4545bbd299007e5">contains</a>(uuid.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()))</div> -<div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  << <span class="stringliteral">"Unknown offer operation '"</span> << operation->info().id()</div> -<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  << <span class="stringliteral">"' (uuid: "</span> << uuid-><a class="code" href="structid_1_1UUID.html#af024badbc379374ac635031eed57dc5f">toString</a>() << <span class="stringliteral">") "</span></div> -<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  << <span class="stringliteral">"of framework "</span> << operation->framework_id();</div> -<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span> </div> -<div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a650e493bb396d724446d9571e5842901">offerOperations</a>.erase(uuid.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div> -<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  }</div> -<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span> </div> -<div class="line"><a name="l02630"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417"> 2630</a></span>  <span class="keyword">const</span> FrameworkID <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417">id</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> info.id(); }</div> -<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span> </div> -<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  <span class="comment">// Update fields in 'info' using those in 'newInfo'. Currently this</span></div> -<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  <span class="comment">// only updates `role`/`roles`, 'name', 'failover_timeout', 'hostname',</span></div> -<div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  <span class="comment">// 'webui_url', 'capabilities', and 'labels'.</span></div> -<div class="line"><a name="l02635"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#a8f5f1a0e7c16c0e7750373c1146dc3a1"> 2635</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a8f5f1a0e7c16c0e7750373c1146dc3a1">update</a>(<span class="keyword">const</span> FrameworkInfo& newInfo)</div> -<div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  {</div> -<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  <span class="comment">// We only merge 'info' from the same framework 'id'.</span></div> -<div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  CHECK_EQ(info.id(), newInfo.id());</div> +<div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  <span class="comment">// Update fields in 'info' using those in 'newInfo'. Currently this</span></div> +<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="comment">// only updates `role`/`roles`, 'name', 'failover_timeout', 'hostname',</span></div> +<div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  <span class="comment">// 'webui_url', 'capabilities', and 'labels'.</span></div> +<div class="line"><a name="l02597"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#a8f5f1a0e7c16c0e7750373c1146dc3a1"> 2597</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a8f5f1a0e7c16c0e7750373c1146dc3a1">update</a>(<span class="keyword">const</span> FrameworkInfo& newInfo)</div> +<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  {</div> +<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <span class="comment">// We only merge 'info' from the same framework 'id'.</span></div> +<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  CHECK_EQ(info.id(), newInfo.id());</div> +<div class="line"><a name="l02601"></a><span class="lineno"> 2601</span> </div> +<div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="comment">// Save the old list of roles for later.</span></div> +<div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  std::set<std::string> oldRoles = <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>;</div> +<div class="line"><a name="l02604"></a><span class="lineno"> 2604</span> </div> +<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  <span class="comment">// TODO(jmlvanre): Merge other fields as per design doc in</span></div> +<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  <span class="comment">// MESOS-703.</span></div> +<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span> </div> +<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  info.clear_role();</div> +<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  info.clear_roles();</div> +<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span> </div> +<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  <span class="keywordflow">if</span> (newInfo.has_role()) {</div> +<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  info.set_role(newInfo.role());</div> +<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  }</div> +<div class="line"><a name="l02614"></a><span class="lineno"> 2614</span> </div> +<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  <span class="keywordflow">if</span> (newInfo.roles_size() > 0) {</div> +<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  info.mutable_roles()->CopyFrom(newInfo.roles());</div> +<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  }</div> +<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span> </div> +<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a> = <a class="code" href="namespacemesos_1_1internal_1_1protobuf_1_1framework.html#a34d007aecebcd1c9dbd3ee0ad1d39155">protobuf::framework::getRoles</a>(newInfo);</div> +<div class="line"><a name="l02620"></a><span class="lineno"> 2620</span> </div> +<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  <span class="keywordflow">if</span> (newInfo.user() != info.user()) {</div> +<div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  LOG(WARNING) << <span class="stringliteral">"Cannot update FrameworkInfo.user to '"</span> << newInfo.user()</div> +<div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  << <span class="stringliteral">"' for framework "</span> << <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417">id</a>() << <span class="stringliteral">". Check MESOS-703"</span>;</div> +<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  }</div> +<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span> </div> +<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  info.set_name(newInfo.name());</div> +<div class="line"><a name="l02627"></a><span class="lineno"> 2627</span> </div> +<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  <span class="keywordflow">if</span> (newInfo.has_failover_timeout()) {</div> +<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  info.set_failover_timeout(newInfo.failover_timeout());</div> +<div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  } <span class="keywordflow">else</span> {</div> +<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  info.clear_failover_timeout();</div> +<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  }</div> +<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span> </div> +<div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  <span class="keywordflow">if</span> (newInfo.checkpoint() != info.checkpoint()) {</div> +<div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>  LOG(WARNING) << <span class="stringliteral">"Cannot update FrameworkInfo.checkpoint to '"</span></div> +<div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  << <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(newInfo.checkpoint()) << <span class="stringliteral">"' for framework "</span></div> +<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  << <span class="keywordtype">id</span>() << <span class="stringliteral">". Check MESOS-703"</span>;</div> +<div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  }</div> <div class="line"><a name="l02639"></a><span class="lineno"> 2639</span> </div> -<div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  <span class="comment">// Save the old list of roles for later.</span></div> -<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  std::set<std::string> oldRoles = <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>;</div> -<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span> </div> -<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  <span class="comment">// TODO(jmlvanre): Merge other fields as per design doc in</span></div> -<div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  <span class="comment">// MESOS-703.</span></div> +<div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  <span class="keywordflow">if</span> (newInfo.has_hostname()) {</div> +<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  info.set_hostname(newInfo.hostname());</div> +<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  } <span class="keywordflow">else</span> {</div> +<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  info.clear_hostname();</div> +<div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  }</div> <div class="line"><a name="l02645"></a><span class="lineno"> 2645</span> </div> -<div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  info.clear_role();</div> -<div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  info.clear_roles();</div> -<div class="line"><a name="l02648"></a><span class="lineno"> 2648</span> </div> -<div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  <span class="keywordflow">if</span> (newInfo.has_role()) {</div> -<div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  info.set_role(newInfo.role());</div> -<div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  }</div> -<div class="line"><a name="l02652"></a><span class="lineno"> 2652</span> </div> -<div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  <span class="keywordflow">if</span> (newInfo.roles_size() > 0) {</div> -<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  info.mutable_roles()->CopyFrom(newInfo.roles());</div> -<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  }</div> -<div class="line"><a name="l02656"></a><span class="lineno"> 2656</span> </div> -<div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a> = <a class="code" href="namespacemesos_1_1internal_1_1protobuf_1_1framework.html#a34d007aecebcd1c9dbd3ee0ad1d39155">protobuf::framework::getRoles</a>(newInfo);</div> -<div class="line"><a name="l02658"></a><span class="lineno"> 2658</span> </div> -<div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="keywordflow">if</span> (newInfo.user() != info.user()) {</div> -<div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  LOG(WARNING) << <span class="stringliteral">"Cannot update FrameworkInfo.user to '"</span> << newInfo.user()</div> -<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  << <span class="stringliteral">"' for framework "</span> << <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417">id</a>() << <span class="stringliteral">". Check MESOS-703"</span>;</div> +<div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  <span class="keywordflow">if</span> (newInfo.principal() != info.principal()) {</div> +<div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  LOG(WARNING) << <span class="stringliteral">"Cannot update FrameworkInfo.principal to '"</span></div> +<div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  << newInfo.principal() << <span class="stringliteral">"' for framework "</span> << <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417">id</a>()</div> +<div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  << <span class="stringliteral">". Check MESOS-703"</span>;</div> +<div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  }</div> +<div class="line"><a name="l02651"></a><span class="lineno"> 2651</span> </div> +<div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>  <span class="keywordflow">if</span> (newInfo.has_webui_url()) {</div> +<div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  info.set_webui_url(newInfo.webui_url());</div> +<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  } <span class="keywordflow">else</span> {</div> +<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  info.clear_webui_url();</div> +<div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  }</div> +<div class="line"><a name="l02657"></a><span class="lineno"> 2657</span> </div> +<div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  <span class="keywordflow">if</span> (newInfo.capabilities_size() > 0) {</div> +<div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  info.mutable_capabilities()->CopyFrom(newInfo.capabilities());</div> +<div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  } <span class="keywordflow">else</span> {</div> +<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  info.clear_capabilities();</div> <div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  }</div> -<div class="line"><a name="l02663"></a><span class="lineno"> 2663</span> </div> -<div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>  info.set_name(newInfo.name());</div> -<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span> </div> -<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  <span class="keywordflow">if</span> (newInfo.has_failover_timeout()) {</div> -<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  info.set_failover_timeout(newInfo.failover_timeout());</div> -<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  } <span class="keywordflow">else</span> {</div> -<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  info.clear_failover_timeout();</div> -<div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  }</div> -<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span> </div> -<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  <span class="keywordflow">if</span> (newInfo.checkpoint() != info.checkpoint()) {</div> -<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  LOG(WARNING) << <span class="stringliteral">"Cannot update FrameworkInfo.checkpoint to '"</span></div> -<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  << <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(newInfo.checkpoint()) << <span class="stringliteral">"' for framework "</span></div> -<div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  << <span class="keywordtype">id</span>() << <span class="stringliteral">". Check MESOS-703"</span>;</div> -<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  }</div> -<div class="line"><a name="l02677"></a><span class="lineno"> 2677</span> </div> -<div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  <span class="keywordflow">if</span> (newInfo.has_hostname()) {</div> -<div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  info.set_hostname(newInfo.hostname());</div> -<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  } <span class="keywordflow">else</span> {</div> -<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  info.clear_hostname();</div> -<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  }</div> -<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span> </div> -<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  <span class="keywordflow">if</span> (newInfo.principal() != info.principal()) {</div> -<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  LOG(WARNING) << <span class="stringliteral">"Cannot update FrameworkInfo.principal to '"</span></div> -<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  << newInfo.principal() << <span class="stringliteral">"' for framework "</span> << <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ac971d54c3567de6411c6aa7e998c5417">id</a>()</div> -<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  << <span class="stringliteral">". Check MESOS-703"</span>;</div> -<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  }</div> -<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span> </div> -<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  <span class="keywordflow">if</span> (newInfo.has_webui_url()) {</div> -<div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  info.set_webui_url(newInfo.webui_url());</div> -<div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  } <span class="keywordflow">else</span> {</div> -<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  info.clear_webui_url();</div> -<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  }</div> -<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span> </div> -<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  <span class="keywordflow">if</span> (newInfo.capabilities_size() > 0) {</div> -<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  info.mutable_capabilities()->CopyFrom(newInfo.capabilities());</div> -<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  } <span class="keywordflow">else</span> {</div> -<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  info.clear_capabilities();</div> -<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  }</div> -<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a4bd6909f50c4594e8db3f4f791814dc7">capabilities</a> = <a class="code" href="structmesos_1_1internal_1_1protobuf_1_1framework_1_1Capabilities.html">protobuf::framework::Capabilities</a>(info.capabilities());</div> -<div class="line"><a name="l02702"></a><span class="lineno"> 2702</span> </div> -<div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  <span class="keywordflow">if</span> (newInfo.has_labels()) {</div> -<div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  info.mutable_labels()->CopyFrom(newInfo.labels());</div> -<div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  } <span class="keywordflow">else</span> {</div> -<div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  info.clear_labels();</div> -<div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  }</div> -<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span> </div> -<div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  <span class="keyword">const</span> std::set<std::string>& newRoles = <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>;</div> -<div class="line"><a name="l02710"></a><span class="lineno"> 2710</span> </div> -<div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  <span class="keyword">const</span> std::set<std::string> removedRoles = [&]() {</div> -<div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  std::set<std::string> result = oldRoles;</div> -<div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, newRoles) {</div> -<div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  result.erase(role);</div> -<div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  }</div> -<div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  }();</div> -<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span> </div> -<div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, removedRoles) {</div> -<div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  <span class="keyword">auto</span> allocatedToRole = [&role](<span class="keyword">const</span> Resource& resource) {</div> -<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  <span class="keywordflow">return</span> resource.allocation_info().role() == role;</div> -<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  };</div> +<div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a4bd6909f50c4594e8db3f4f791814dc7">capabilities</a> = <a class="code" href="structmesos_1_1internal_1_1protobuf_1_1framework_1_1Capabilities.html">protobuf::framework::Capabilities</a>(info.capabilities());</div> +<div class="line"><a name="l02664"></a><span class="lineno"> 2664</span> </div> +<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  <span class="keywordflow">if</span> (newInfo.has_labels()) {</div> +<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  info.mutable_labels()->CopyFrom(newInfo.labels());</div> +<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  } <span class="keywordflow">else</span> {</div> +<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  info.clear_labels();</div> +<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  }</div> +<div class="line"><a name="l02670"></a><span class="lineno"> 2670</span> </div> +<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  <span class="keyword">const</span> std::set<std::string>& newRoles = <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a2d8cbc0dbd23317d8194398a3810a5b5">roles</a>;</div> +<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span> </div> +<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  <span class="keyword">const</span> std::set<std::string> removedRoles = [&]() {</div> +<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  std::set<std::string> result = oldRoles;</div> +<div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, newRoles) {</div> +<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  result.erase(role);</div> +<div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  }</div> +<div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  }();</div> +<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span> </div> +<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, removedRoles) {</div> +<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  <span class="keyword">auto</span> allocatedToRole = [&role](<span class="keyword">const</span> Resource& resource) {</div> +<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  <span class="keywordflow">return</span> resource.allocation_info().role() == role;</div> +<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  };</div> +<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span> </div> +<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  <span class="comment">// Stop tracking the framework under this role if there are</span></div> +<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  <span class="comment">// no longer any resources allocated to it.</span></div> +<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>()) {</div> +<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a965f66810b71a0d2bab683fee1b6a9b6">totalOfferedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>());</div> +<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a3edaf411ec6e409a3f8b2a77988ef65a">untrackUnderRole</a>(role);</div> +<div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  }</div> +<div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  }</div> +<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span> </div> +<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  <span class="keyword">const</span> std::set<std::string> addedRoles = [&]() {</div> +<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  std::set<std::string> result = newRoles;</div> +<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, oldRoles) {</div> +<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  result.erase(role);</div> +<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  }</div> +<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  }();</div> +<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span> </div> +<div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, addedRoles) {</div> +<div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  <span class="comment">// NOTE: It's possible that we're already tracking this framework</span></div> +<div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  <span class="comment">// under the role because a framework can unsubscribe from a role</span></div> +<div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  <span class="comment">// while it still has resources allocated to the role.</span></div> +<div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  <span class="keywordflow">if</span> (!<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a614fb3ba127133b939e2a733c6ecbf2a">isTrackedUnderRole</a>(role)) {</div> +<div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#afa185682905163563412aa1915e612c8">trackUnderRole</a>(role);</div> +<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  }</div> +<div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  }</div> +<div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  }</div> +<div class="line"><a name="l02711"></a><span class="lineno"> 2711</span> </div> +<div class="line"><a name="l02712"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#aa21baf526b32c397ea45f103cea5dd15"> 2712</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#aa21baf526b32c397ea45f103cea5dd15">updateConnection</a>(<span class="keyword">const</span> <a class="code" href="structprocess_1_1UPID.html">process::UPID</a>& newPid)</div> +<div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  {</div> +<div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  <span class="comment">// Cleanup the HTTP connnection if this is a downgrade from HTTP</span></div> +<div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="comment">// to PID. Note that the connection may already be closed.</span></div> +<div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a>.isSome()) {</div> +<div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a54362f290514769903a61d7cd0d6506b">closeHttpConnection</a>();</div> +<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  }</div> +<div class="line"><a name="l02719"></a><span class="lineno"> 2719</span> </div> +<div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  <span class="comment">// TODO(benh): unlink(oldPid);</span></div> +<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  pid = newPid;</div> +<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  }</div> <div class="line"><a name="l02723"></a><span class="lineno"> 2723</span> </div> -<div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  <span class="comment">// Stop tracking the framework under this role if there are</span></div> -<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="comment">// no longer any resources allocated to it.</span></div> -<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a35847f2388d25e0cb9b3a9d0a722fbdd">totalUsedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>()) {</div> -<div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  CHECK(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a965f66810b71a0d2bab683fee1b6a9b6">totalOfferedResources</a>.<a class="code" href="classmesos_1_1Resources.html#a62ae547c0d24fdfb139549e9b8126fdf">filter</a>(allocatedToRole).<a class="code" href="classmesos_1_1Resources.html#ab46b900ebe62b19390d9a2a82b46eb15">empty</a>());</div> -<div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a3edaf411ec6e409a3f8b2a77988ef65a">untrackUnderRole</a>(role);</div> -<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  }</div> -<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  }</div> -<div class="line"><a name="l02731"></a><span class="lineno"> 2731</span> </div> -<div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="keyword">const</span> std::set<std::string> addedRoles = [&]() {</div> -<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  std::set<std::string> result = newRoles;</div> -<div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, oldRoles) {</div> -<div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  result.erase(role);</div> -<div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  }</div> -<div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  }();</div> +<div class="line"><a name="l02724"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#aab28c60e6ecfa298c41f4e006f73a911"> 2724</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#aab28c60e6ecfa298c41f4e006f73a911">updateConnection</a>(<span class="keyword">const</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1HttpConnection.html">HttpConnection</a>& newHttp)</div> +<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  {</div> +<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="keywordflow">if</span> (pid.isSome()) {</div> +<div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  <span class="comment">// Wipe the PID if this is an upgrade from PID to HTTP.</span></div> +<div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <span class="comment">// TODO(benh): unlink(oldPid);</span></div> +<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  pid = <a class="code" href="structNone.html">None</a>();</div> +<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a>.isSome()) {</div> +<div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  <span class="comment">// Cleanup the old HTTP connection.</span></div> +<div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="comment">// Note that master creates a new HTTP connection for every</span></div> +<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  <span class="comment">// subscribe request, so 'newHttp' should always be different</span></div> +<div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  <span class="comment">// from 'http'.</span></div> +<div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a54362f290514769903a61d7cd0d6506b">closeHttpConnection</a>();</div> +<div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  }</div> +<div class="line"><a name="l02737"></a><span class="lineno"> 2737</span> </div> +<div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#ab8738e43a60086f3b434c0278933e85e">CHECK_NONE</a>(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a>);</div> <div class="line"><a name="l02739"></a><span class="lineno"> 2739</span> </div> -<div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="keywordflow">foreach</span> (<span class="keyword">const</span> std::string& role, addedRoles) {</div> -<div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  <span class="comment">// NOTE: It's possible that we're already tracking this framework</span></div> -<div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  <span class="comment">// under the role because a framework can unsubscribe from a role</span></div> -<div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  <span class="comment">// while it still has resources allocated to the role.</span></div> -<div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  <span class="keywordflow">if</span> (!<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a614fb3ba127133b939e2a733c6ecbf2a">isTrackedUnderRole</a>(role)) {</div> -<div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#afa185682905163563412aa1915e612c8">trackUnderRole</a>(role);</div> -<div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  }</div> -<div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  }</div> -<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  }</div> -<div class="line"><a name="l02749"></a><span class="lineno"> 2749</span> </div> -<div class="line"><a name="l02750"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#aa21baf526b32c397ea45f103cea5dd15"> 2750</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#aa21baf526b32c397ea45f103cea5dd15">updateConnection</a>(<span class="keyword">const</span> <a class="code" href="structprocess_1_1UPID.html">process::UPID</a>& newPid)</div> -<div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  {</div> -<div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  <span class="comment">// Cleanup the HTTP connnection if this is a downgrade from HTTP</span></div> -<div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  <span class="comment">// to PID. Note that the connection may already be closed.</span></div> -<div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a>.isSome()) {</div> -<div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a54362f290514769903a61d7cd0d6506b">closeHttpConnection</a>();</div> -<div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  }</div> -<div class="line"><a name="l02757"></a><span class="lineno"> 2757</span> </div> -<div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  <span class="comment">// TODO(benh): unlink(oldPid);</span></div> -<div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  pid = newPid;</div> -<div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  }</div> +<div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a> = newHttp;</div> +<div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  }</div> +<div class="line"><a name="l02742"></a><span class="lineno"> 2742</span> </div> +<div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  <span class="comment">// Closes the HTTP connection and stops the heartbeat.</span></div> +<div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  <span class="comment">//</span></div> +<div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  <span class="comment">// TODO(vinod): Currently `state` variable is set separately</span></div> +<div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  <span class="comment">// from this method. We need to make sure these are in sync.</span></div> +<div class="line"><a name="l02747"></a><span class="lineno"><a class="line" href="structmesos_1_1internal_1_1master_1_1Framework.html#a54362f290514769903a61d7cd0d6506b"> 2747</a></span>  <span class="keywordtype">void</span> <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a54362f290514769903a61d7cd0d6506b">closeHttpConnection</a>()</div> +<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  {</div> +<div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a>);</div> +<div class="line"><a name="l02750"></a><span class="lineno"> 2750</span> </div> +<div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  <span class="keywordflow">if</span> (<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#ab741aebff99e28269136e04ab76800fa">connected</a>() && !<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a>.get().close()) {</div> +<div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  LOG(WARNING) << <span class="stringliteral">"Failed to close HTTP pipe for "</span> << *<span class="keyword">this</span>;</div> +<div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  }</div> +<div class="line"><a name="l02754"></a><span class="lineno"> 2754</span> </div> +<div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  <a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a574beb521d564fcbbbce942e694d106c">http</a> = <a class="code" href="structNone.html">None</a>();</div> +<div class="line"><a name="l02756"></a><span class="lineno"> 2756</span> </div> +<div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  <a class="code" href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(<a class="code" href="structmesos_1_1internal_1_1master_1_1Framework.html#a36dcfd05ca84ba51bc10c73dce933d70">heartbeater</a>);</div> +<div class="line"><a name="l02758"></a><span class="lineno"> 2758</span> </div> +<div class="line"><a name="l0275
<TRUNCATED>
