hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From git-site-r...@apache.org
Subject [11/16] hbase-site git commit: Published site at .
Date Wed, 10 Jan 2018 15:31:27 GMT
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/828b306f/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
index 4f74984..fa489c5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
@@ -46,37 +46,37 @@
 <span class="sourceLineNo">038</span>import java.util.Map;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import java.util.Map.Entry;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import java.util.Objects;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import java.util.Optional;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.util.Set;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.concurrent.CountDownLatch;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import java.util.concurrent.ExecutionException;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import java.util.concurrent.Future;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import java.util.concurrent.TimeUnit;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import java.util.concurrent.TimeoutException;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import java.util.function.Function;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import java.util.regex.Pattern;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import java.util.stream.Collectors;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import javax.servlet.ServletException;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import javax.servlet.http.HttpServlet;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import javax.servlet.http.HttpServletRequest;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import javax.servlet.http.HttpServletResponse;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.conf.Configuration;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.fs.Path;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.ClusterMetrics;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.ClusterMetrics.Option;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.ClusterMetricsBuilder;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.HConstants;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.InvalidFamilyOperationException;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.71"></a>
+<span class="sourceLineNo">041</span>import java.util.Set;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import java.util.concurrent.CountDownLatch;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import java.util.concurrent.ExecutionException;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import java.util.concurrent.Future;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import java.util.concurrent.TimeUnit;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import java.util.concurrent.TimeoutException;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import java.util.function.Function;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import java.util.regex.Pattern;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import java.util.stream.Collectors;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import javax.servlet.ServletException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import javax.servlet.http.HttpServlet;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import javax.servlet.http.HttpServletRequest;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import javax.servlet.http.HttpServletResponse;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.conf.Configuration;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.fs.Path;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.ClusterMetrics;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.ClusterMetrics.Option;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.ClusterMetricsBuilder;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.CoordinatedStateException;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.HConstants;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.InvalidFamilyOperationException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.MasterNotRunningException;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.ReplicationPeerNotFoundException;<a name="line.71"></a>
 <span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ServerLoad;<a name="line.72"></a>
 <span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.ServerMetricsBuilder;<a name="line.73"></a>
 <span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.ServerName;<a name="line.74"></a>
@@ -3350,186 +3350,185 @@
 <span class="sourceLineNo">3342</span>      cpHost.preGetReplicationPeerConfig(peerId);<a name="line.3342"></a>
 <span class="sourceLineNo">3343</span>    }<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>    LOG.info(getClientIdAuditPrefix() + " get replication peer config, id=" + peerId);<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>    Optional&lt;ReplicationPeerConfig&gt; peerConfig =<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      this.replicationPeerManager.getPeerConfig(peerId);<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span><a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>    if (cpHost != null) {<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>      cpHost.postGetReplicationPeerConfig(peerId);<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>    }<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    return peerConfig.orElse(null);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>  }<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  @Override<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>  public long updateReplicationPeerConfig(String peerId, ReplicationPeerConfig peerConfig)<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      throws ReplicationException, IOException {<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    LOG.info(getClientIdAuditPrefix() + " update replication peer config, id=" + peerId +<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>      ", config=" + peerConfig);<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    return executePeerProcedure(new UpdatePeerConfigProcedure(peerId, peerConfig));<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>  }<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span><a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>  @Override<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>  public List&lt;ReplicationPeerDescription&gt; listReplicationPeers(String regex)<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>      throws ReplicationException, IOException {<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    if (cpHost != null) {<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>      cpHost.preListReplicationPeers(regex);<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    }<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    LOG.info(getClientIdAuditPrefix() + " list replication peers, regex=" + regex);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    Pattern pattern = regex == null ? null : Pattern.compile(regex);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    List&lt;ReplicationPeerDescription&gt; peers =<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      this.replicationPeerManager.listPeers(pattern);<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    if (cpHost != null) {<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      cpHost.postListReplicationPeers(regex);<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    }<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    return peers;<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>  }<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span><a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>  /**<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>   * Mark region server(s) as decommissioned (previously called 'draining') to prevent additional<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>   * regions from getting assigned to them. Also unload the regions on the servers asynchronously.0<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>   * @param servers Region servers to decommission.<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>   * @throws HBaseIOException<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>   */<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>  public void decommissionRegionServers(final List&lt;ServerName&gt; servers, final boolean offload)<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>      throws HBaseIOException {<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    List&lt;ServerName&gt; serversAdded = new ArrayList&lt;&gt;(servers.size());<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>    // Place the decommission marker first.<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>    String parentZnode = getZooKeeper().znodePaths.drainingZNode;<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>    for (ServerName server : servers) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>      try {<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        String node = ZNodePaths.joinZNode(parentZnode, server.getServerName());<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        ZKUtil.createAndFailSilent(getZooKeeper(), node);<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>      } catch (KeeperException ke) {<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        throw new HBaseIOException(<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>            this.zooKeeper.prefix("Unable to decommission '" + server.getServerName() + "'."), ke);<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      if (this.serverManager.addServerToDrainList(server)) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>        serversAdded.add(server);<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      }<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>    }<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>    // Move the regions off the decommissioned servers.<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    if (offload) {<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>      final List&lt;ServerName&gt; destServers = this.serverManager.createDestinationServersList();<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>      for (ServerName server : serversAdded) {<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        final List&lt;RegionInfo&gt; regionsOnServer =<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>            this.assignmentManager.getRegionStates().getServerRegionInfoSet(server);<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        for (RegionInfo hri : regionsOnServer) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          ServerName dest = balancer.randomAssignment(hri, destServers);<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>          if (dest == null) {<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>            throw new HBaseIOException("Unable to determine a plan to move " + hri);<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>          }<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>          RegionPlan rp = new RegionPlan(hri, server, dest);<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>          this.assignmentManager.moveAsync(rp);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>        }<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>      }<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    }<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>  }<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span><a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>  /**<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>   * List region servers marked as decommissioned (previously called 'draining') to not get regions<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>   * assigned to them.<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>   * @return List of decommissioned servers.<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>   */<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  public List&lt;ServerName&gt; listDecommissionedRegionServers() {<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span>    return this.serverManager.getDrainingServersList();<a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  }<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span><a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>  /**<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * Remove decommission marker (previously called 'draining') from a region server to allow regions<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   * assignments. Load regions onto the server asynchronously if a list of regions is given<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @param server Region server to remove decommission marker from.<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   * @throws HBaseIOException<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   */<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>  public void recommissionRegionServer(final ServerName server,<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>      final List&lt;byte[]&gt; encodedRegionNames) throws HBaseIOException {<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>    // Remove the server from decommissioned (draining) server list.<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>    String parentZnode = getZooKeeper().znodePaths.drainingZNode;<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    String node = ZNodePaths.joinZNode(parentZnode, server.getServerName());<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    try {<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>      ZKUtil.deleteNodeFailSilent(getZooKeeper(), node);<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    } catch (KeeperException ke) {<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span>      throw new HBaseIOException(<a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>          this.zooKeeper.prefix("Unable to recommission '" + server.getServerName() + "'."), ke);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    }<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    this.serverManager.removeServerFromDrainList(server);<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span><a name="line.3446"></a>
-<span class="sourceLineNo">3447</span>    // Load the regions onto the server if we are given a list of regions.<a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>    if (encodedRegionNames == null || encodedRegionNames.isEmpty()) {<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      return;<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>    }<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>    if (!this.serverManager.isServerOnline(server)) {<a name="line.3451"></a>
-<span class="sourceLineNo">3452</span>      return;<a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>    }<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>    for (byte[] encodedRegionName : encodedRegionNames) {<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span>      RegionState regionState =<a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>          assignmentManager.getRegionStates().getRegionState(Bytes.toString(encodedRegionName));<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      if (regionState == null) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        LOG.warn("Unknown region " + Bytes.toStringBinary(encodedRegionName));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        continue;<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>      }<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>      RegionInfo hri = regionState.getRegion();<a name="line.3461"></a>
-<span class="sourceLineNo">3462</span>      if (server.equals(regionState.getServerName())) {<a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        LOG.info("Skipping move of region " + hri.getRegionNameAsString()<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          + " because region already assigned to the same server " + server + ".");<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>        continue;<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>      }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span>      RegionPlan rp = new RegionPlan(hri, regionState.getServerName(), server);<a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>      this.assignmentManager.moveAsync(rp);<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>    }<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>  }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>  @Override<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>  public LockManager getLockManager() {<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>    return lockManager;<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>  }<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span><a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>  @Override<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>  public boolean recoverMeta() throws IOException {<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>    ProcedurePrepareLatch latch = ProcedurePrepareLatch.createLatch(2, 0);<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>    LOG.info("Running RecoverMetaProcedure to ensure proper hbase:meta deploy.");<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>    long procId = procedureExecutor.submitProcedure(new RecoverMetaProcedure(null, true, latch));<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>    latch.await();<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>    LOG.info("hbase:meta (default replica) deployed at=" +<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>        getMetaTableLocator().getMetaRegionLocation(getZooKeeper()));<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>    return assignmentManager.isMetaInitialized();<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>  }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span><a name="line.3487"></a>
-<span class="sourceLineNo">3488</span>  public QuotaObserverChore getQuotaObserverChore() {<a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    return this.quotaObserverChore;<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>  }<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span><a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>  public SpaceQuotaSnapshotNotifier getSpaceQuotaSnapshotNotifier() {<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>    return this.spaceQuotaSnapshotNotifier;<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>  }<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span><a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>  @SuppressWarnings("unchecked")<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>  private RemoteProcedure&lt;MasterProcedureEnv, ?&gt; getRemoteProcedure(long procId) {<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>    Procedure&lt;?&gt; procedure = procedureExecutor.getProcedure(procId);<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    if (procedure == null) {<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>      return null;<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span>    }<a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>    assert procedure instanceof RemoteProcedure;<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    return (RemoteProcedure&lt;MasterProcedureEnv, ?&gt;) procedure;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>  }<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>  public void remoteProcedureCompleted(long procId) {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>    RemoteProcedure&lt;MasterProcedureEnv, ?&gt; procedure = getRemoteProcedure(procId);<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    if (procedure != null) {<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span>      procedure.remoteOperationCompleted(procedureExecutor.getEnvironment());<a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    }<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>  }<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span><a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>  public void remoteProcedureFailed(long procId, RemoteProcedureException error) {<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>    RemoteProcedure&lt;MasterProcedureEnv, ?&gt; procedure = getRemoteProcedure(procId);<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    if (procedure != null) {<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span>      procedure.remoteOperationFailed(procedureExecutor.getEnvironment(), error);<a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    }<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>  }<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span><a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>  @Override<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span>    return replicationPeerManager;<a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>  }<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>}<a name="line.3524"></a>
+<span class="sourceLineNo">3345</span>    ReplicationPeerConfig peerConfig = this.replicationPeerManager.getPeerConfig(peerId)<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>        .orElseThrow(() -&gt; new ReplicationPeerNotFoundException(peerId));<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>    if (cpHost != null) {<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>      cpHost.postGetReplicationPeerConfig(peerId);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    }<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    return peerConfig;<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public long updateReplicationPeerConfig(String peerId, ReplicationPeerConfig peerConfig)<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      throws ReplicationException, IOException {<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>    LOG.info(getClientIdAuditPrefix() + " update replication peer config, id=" + peerId +<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>      ", config=" + peerConfig);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>    return executePeerProcedure(new UpdatePeerConfigProcedure(peerId, peerConfig));<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>  }<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>  @Override<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>  public List&lt;ReplicationPeerDescription&gt; listReplicationPeers(String regex)<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span>      throws ReplicationException, IOException {<a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    if (cpHost != null) {<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>      cpHost.preListReplicationPeers(regex);<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    }<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    LOG.info(getClientIdAuditPrefix() + " list replication peers, regex=" + regex);<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    Pattern pattern = regex == null ? null : Pattern.compile(regex);<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    List&lt;ReplicationPeerDescription&gt; peers =<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>      this.replicationPeerManager.listPeers(pattern);<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    if (cpHost != null) {<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>      cpHost.postListReplicationPeers(regex);<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    }<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    return peers;<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span>  }<a name="line.3375"></a>
+<span class="sourceLineNo">3376</span><a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>  /**<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>   * Mark region server(s) as decommissioned (previously called 'draining') to prevent additional<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>   * regions from getting assigned to them. Also unload the regions on the servers asynchronously.0<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>   * @param servers Region servers to decommission.<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>   * @throws HBaseIOException<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>   */<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>  public void decommissionRegionServers(final List&lt;ServerName&gt; servers, final boolean offload)<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>      throws HBaseIOException {<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    List&lt;ServerName&gt; serversAdded = new ArrayList&lt;&gt;(servers.size());<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // Place the decommission marker first.<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    String parentZnode = getZooKeeper().znodePaths.drainingZNode;<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    for (ServerName server : servers) {<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>      try {<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>        String node = ZNodePaths.joinZNode(parentZnode, server.getServerName());<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>        ZKUtil.createAndFailSilent(getZooKeeper(), node);<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span>      } catch (KeeperException ke) {<a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>        throw new HBaseIOException(<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>            this.zooKeeper.prefix("Unable to decommission '" + server.getServerName() + "'."), ke);<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>      }<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>      if (this.serverManager.addServerToDrainList(server)) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>        serversAdded.add(server);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      }<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>    }<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>    // Move the regions off the decommissioned servers.<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>    if (offload) {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>      final List&lt;ServerName&gt; destServers = this.serverManager.createDestinationServersList();<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>      for (ServerName server : serversAdded) {<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>        final List&lt;RegionInfo&gt; regionsOnServer =<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>            this.assignmentManager.getRegionStates().getServerRegionInfoSet(server);<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>        for (RegionInfo hri : regionsOnServer) {<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>          ServerName dest = balancer.randomAssignment(hri, destServers);<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>          if (dest == null) {<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>            throw new HBaseIOException("Unable to determine a plan to move " + hri);<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>          }<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>          RegionPlan rp = new RegionPlan(hri, server, dest);<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>          this.assignmentManager.moveAsync(rp);<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>        }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span>      }<a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>    }<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>  }<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span><a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>  /**<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   * List region servers marked as decommissioned (previously called 'draining') to not get regions<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>   * assigned to them.<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>   * @return List of decommissioned servers.<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>   */<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>  public List&lt;ServerName&gt; listDecommissionedRegionServers() {<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    return this.serverManager.getDrainingServersList();<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>  }<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span><a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>  /**<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>   * Remove decommission marker (previously called 'draining') from a region server to allow regions<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>   * assignments. Load regions onto the server asynchronously if a list of regions is given<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>   * @param server Region server to remove decommission marker from.<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>   * @throws HBaseIOException<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>   */<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>  public void recommissionRegionServer(final ServerName server,<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>      final List&lt;byte[]&gt; encodedRegionNames) throws HBaseIOException {<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span>    // Remove the server from decommissioned (draining) server list.<a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>    String parentZnode = getZooKeeper().znodePaths.drainingZNode;<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>    String node = ZNodePaths.joinZNode(parentZnode, server.getServerName());<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>    try {<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>      ZKUtil.deleteNodeFailSilent(getZooKeeper(), node);<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>    } catch (KeeperException ke) {<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>      throw new HBaseIOException(<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>          this.zooKeeper.prefix("Unable to recommission '" + server.getServerName() + "'."), ke);<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>    }<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>    this.serverManager.removeServerFromDrainList(server);<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span><a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>    // Load the regions onto the server if we are given a list of regions.<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>    if (encodedRegionNames == null || encodedRegionNames.isEmpty()) {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>      return;<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    }<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    if (!this.serverManager.isServerOnline(server)) {<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>      return;<a name="line.3451"></a>
+<span class="sourceLineNo">3452</span>    }<a name="line.3452"></a>
+<span class="sourceLineNo">3453</span>    for (byte[] encodedRegionName : encodedRegionNames) {<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>      RegionState regionState =<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>          assignmentManager.getRegionStates().getRegionState(Bytes.toString(encodedRegionName));<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      if (regionState == null) {<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span>        LOG.warn("Unknown region " + Bytes.toStringBinary(encodedRegionName));<a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>        continue;<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      }<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      RegionInfo hri = regionState.getRegion();<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>      if (server.equals(regionState.getServerName())) {<a name="line.3461"></a>
+<span class="sourceLineNo">3462</span>        LOG.info("Skipping move of region " + hri.getRegionNameAsString()<a name="line.3462"></a>
+<span class="sourceLineNo">3463</span>          + " because region already assigned to the same server " + server + ".");<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>        continue;<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span>      }<a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      RegionPlan rp = new RegionPlan(hri, regionState.getServerName(), server);<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      this.assignmentManager.moveAsync(rp);<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>    }<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>  }<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span><a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>  @Override<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span>  public LockManager getLockManager() {<a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>    return lockManager;<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>  }<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span><a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>  @Override<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span>  public boolean recoverMeta() throws IOException {<a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>    ProcedurePrepareLatch latch = ProcedurePrepareLatch.createLatch(2, 0);<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>    LOG.info("Running RecoverMetaProcedure to ensure proper hbase:meta deploy.");<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>    long procId = procedureExecutor.submitProcedure(new RecoverMetaProcedure(null, true, latch));<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span>    latch.await();<a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>    LOG.info("hbase:meta (default replica) deployed at=" +<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>        getMetaTableLocator().getMetaRegionLocation(getZooKeeper()));<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>    return assignmentManager.isMetaInitialized();<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>  }<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span><a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>  public QuotaObserverChore getQuotaObserverChore() {<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>    return this.quotaObserverChore;<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>  }<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span><a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>  public SpaceQuotaSnapshotNotifier getSpaceQuotaSnapshotNotifier() {<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>    return this.spaceQuotaSnapshotNotifier;<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>  }<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span><a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>  @SuppressWarnings("unchecked")<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>  private RemoteProcedure&lt;MasterProcedureEnv, ?&gt; getRemoteProcedure(long procId) {<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>    Procedure&lt;?&gt; procedure = procedureExecutor.getProcedure(procId);<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span>    if (procedure == null) {<a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>      return null;<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>    }<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>    assert procedure instanceof RemoteProcedure;<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>    return (RemoteProcedure&lt;MasterProcedureEnv, ?&gt;) procedure;<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>  }<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span><a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>  public void remoteProcedureCompleted(long procId) {<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>    RemoteProcedure&lt;MasterProcedureEnv, ?&gt; procedure = getRemoteProcedure(procId);<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>    if (procedure != null) {<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      procedure.remoteOperationCompleted(procedureExecutor.getEnvironment());<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  public void remoteProcedureFailed(long procId, RemoteProcedureException error) {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    RemoteProcedure&lt;MasterProcedureEnv, ?&gt; procedure = getRemoteProcedure(procId);<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    if (procedure != null) {<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span>      procedure.remoteOperationFailed(procedureExecutor.getEnvironment(), error);<a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    }<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>  }<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span><a name="line.3518"></a>
+<span class="sourceLineNo">3519</span>  @Override<a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>    return replicationPeerManager;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>  }<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>}<a name="line.3523"></a>
 
 
 


Mime
View raw message