blob: 89cb8ab39b7d434883a79e521a44ca0d45444628 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (17) -->
<title>Source code</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="source: package: org.apache.hadoop.hbase.client, class: RawAsyncHBaseAdmin, class: ProcedureBiConsumer">
<meta name="generator" content="javadoc/SourceToHTMLConverter">
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
</head>
<body class="source-page">
<main role="main">
<div class="source-container">
<pre><span class="source-line-no">001</span><span id="line-1">/*</span>
<span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span>
<span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span>
<span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span>
<span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span>
<span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span>
<span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span>
<span class="source-line-no">009</span><span id="line-9"> *</span>
<span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="source-line-no">011</span><span id="line-11"> *</span>
<span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span>
<span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span>
<span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span>
<span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span>
<span class="source-line-no">017</span><span id="line-17"> */</span>
<span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.client;</span>
<span class="source-line-no">019</span><span id="line-19"></span>
<span class="source-line-no">020</span><span id="line-20">import static org.apache.hadoop.hbase.HConstants.HIGH_QOS;</span>
<span class="source-line-no">021</span><span id="line-21">import static org.apache.hadoop.hbase.TableName.META_TABLE_NAME;</span>
<span class="source-line-no">022</span><span id="line-22">import static org.apache.hadoop.hbase.util.FutureUtils.addListener;</span>
<span class="source-line-no">023</span><span id="line-23">import static org.apache.hadoop.hbase.util.FutureUtils.unwrapCompletionException;</span>
<span class="source-line-no">024</span><span id="line-24"></span>
<span class="source-line-no">025</span><span id="line-25">import edu.umd.cs.findbugs.annotations.Nullable;</span>
<span class="source-line-no">026</span><span id="line-26">import java.io.IOException;</span>
<span class="source-line-no">027</span><span id="line-27">import java.net.URI;</span>
<span class="source-line-no">028</span><span id="line-28">import java.util.ArrayList;</span>
<span class="source-line-no">029</span><span id="line-29">import java.util.Arrays;</span>
<span class="source-line-no">030</span><span id="line-30">import java.util.Collections;</span>
<span class="source-line-no">031</span><span id="line-31">import java.util.EnumSet;</span>
<span class="source-line-no">032</span><span id="line-32">import java.util.HashMap;</span>
<span class="source-line-no">033</span><span id="line-33">import java.util.List;</span>
<span class="source-line-no">034</span><span id="line-34">import java.util.Map;</span>
<span class="source-line-no">035</span><span id="line-35">import java.util.Optional;</span>
<span class="source-line-no">036</span><span id="line-36">import java.util.Set;</span>
<span class="source-line-no">037</span><span id="line-37">import java.util.concurrent.CompletableFuture;</span>
<span class="source-line-no">038</span><span id="line-38">import java.util.concurrent.ConcurrentHashMap;</span>
<span class="source-line-no">039</span><span id="line-39">import java.util.concurrent.ConcurrentLinkedQueue;</span>
<span class="source-line-no">040</span><span id="line-40">import java.util.concurrent.TimeUnit;</span>
<span class="source-line-no">041</span><span id="line-41">import java.util.concurrent.atomic.AtomicReference;</span>
<span class="source-line-no">042</span><span id="line-42">import java.util.function.BiConsumer;</span>
<span class="source-line-no">043</span><span id="line-43">import java.util.function.Consumer;</span>
<span class="source-line-no">044</span><span id="line-44">import java.util.function.Function;</span>
<span class="source-line-no">045</span><span id="line-45">import java.util.function.Supplier;</span>
<span class="source-line-no">046</span><span id="line-46">import java.util.regex.Pattern;</span>
<span class="source-line-no">047</span><span id="line-47">import java.util.stream.Collectors;</span>
<span class="source-line-no">048</span><span id="line-48">import java.util.stream.Stream;</span>
<span class="source-line-no">049</span><span id="line-49">import org.apache.hadoop.conf.Configuration;</span>
<span class="source-line-no">050</span><span id="line-50">import org.apache.hadoop.hbase.CacheEvictionStats;</span>
<span class="source-line-no">051</span><span id="line-51">import org.apache.hadoop.hbase.CacheEvictionStatsAggregator;</span>
<span class="source-line-no">052</span><span id="line-52">import org.apache.hadoop.hbase.CatalogFamilyFormat;</span>
<span class="source-line-no">053</span><span id="line-53">import org.apache.hadoop.hbase.ClientMetaTableAccessor;</span>
<span class="source-line-no">054</span><span id="line-54">import org.apache.hadoop.hbase.ClusterMetrics;</span>
<span class="source-line-no">055</span><span id="line-55">import org.apache.hadoop.hbase.ClusterMetrics.Option;</span>
<span class="source-line-no">056</span><span id="line-56">import org.apache.hadoop.hbase.ClusterMetricsBuilder;</span>
<span class="source-line-no">057</span><span id="line-57">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
<span class="source-line-no">058</span><span id="line-58">import org.apache.hadoop.hbase.HConstants;</span>
<span class="source-line-no">059</span><span id="line-59">import org.apache.hadoop.hbase.HRegionLocation;</span>
<span class="source-line-no">060</span><span id="line-60">import org.apache.hadoop.hbase.NamespaceDescriptor;</span>
<span class="source-line-no">061</span><span id="line-61">import org.apache.hadoop.hbase.RegionLocations;</span>
<span class="source-line-no">062</span><span id="line-62">import org.apache.hadoop.hbase.RegionMetrics;</span>
<span class="source-line-no">063</span><span id="line-63">import org.apache.hadoop.hbase.RegionMetricsBuilder;</span>
<span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.hbase.ServerName;</span>
<span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.TableExistsException;</span>
<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.TableName;</span>
<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.TableNotDisabledException;</span>
<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.TableNotEnabledException;</span>
<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.TableNotFoundException;</span>
<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.UnknownRegionException;</span>
<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.AdminRequestCallerBuilder;</span>
<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.MasterRequestCallerBuilder;</span>
<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.ServerRequestCallerBuilder;</span>
<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.client.Scan.ReadType;</span>
<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.client.replication.ReplicationPeerConfigUtil;</span>
<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.client.replication.TableCFs;</span>
<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.client.security.SecurityCapability;</span>
<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.exceptions.DeserializationException;</span>
<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.ipc.HBaseRpcController;</span>
<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.net.Address;</span>
<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.quotas.QuotaFilter;</span>
<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.quotas.QuotaSettings;</span>
<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.hbase.quotas.QuotaTableUtil;</span>
<span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot;</span>
<span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.hbase.replication.ReplicationException;</span>
<span class="source-line-no">086</span><span id="line-86">import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;</span>
<span class="source-line-no">087</span><span id="line-87">import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;</span>
<span class="source-line-no">088</span><span id="line-88">import org.apache.hadoop.hbase.replication.SyncReplicationState;</span>
<span class="source-line-no">089</span><span id="line-89">import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;</span>
<span class="source-line-no">090</span><span id="line-90">import org.apache.hadoop.hbase.security.access.GetUserPermissionsRequest;</span>
<span class="source-line-no">091</span><span id="line-91">import org.apache.hadoop.hbase.security.access.Permission;</span>
<span class="source-line-no">092</span><span id="line-92">import org.apache.hadoop.hbase.security.access.ShadedAccessControlUtil;</span>
<span class="source-line-no">093</span><span id="line-93">import org.apache.hadoop.hbase.security.access.UserPermission;</span>
<span class="source-line-no">094</span><span id="line-94">import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;</span>
<span class="source-line-no">095</span><span id="line-95">import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;</span>
<span class="source-line-no">096</span><span id="line-96">import org.apache.hadoop.hbase.snapshot.SnapshotCreationException;</span>
<span class="source-line-no">097</span><span id="line-97">import org.apache.hadoop.hbase.util.Bytes;</span>
<span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.util.ForeignExceptionUtil;</span>
<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.util.Pair;</span>
<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.util.Strings;</span>
<span class="source-line-no">102</span><span id="line-102">import org.apache.yetus.audience.InterfaceAudience;</span>
<span class="source-line-no">103</span><span id="line-103">import org.slf4j.Logger;</span>
<span class="source-line-no">104</span><span id="line-104">import org.slf4j.LoggerFactory;</span>
<span class="source-line-no">105</span><span id="line-105"></span>
<span class="source-line-no">106</span><span id="line-106">import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;</span>
<span class="source-line-no">107</span><span id="line-107">import org.apache.hbase.thirdparty.com.google.protobuf.Message;</span>
<span class="source-line-no">108</span><span id="line-108">import org.apache.hbase.thirdparty.com.google.protobuf.RpcCallback;</span>
<span class="source-line-no">109</span><span id="line-109">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
<span class="source-line-no">110</span><span id="line-110">import org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer;</span>
<span class="source-line-no">111</span><span id="line-111">import org.apache.hbase.thirdparty.io.netty.util.Timeout;</span>
<span class="source-line-no">112</span><span id="line-112">import org.apache.hbase.thirdparty.io.netty.util.TimerTask;</span>
<span class="source-line-no">113</span><span id="line-113">import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils;</span>
<span class="source-line-no">114</span><span id="line-114"></span>
<span class="source-line-no">115</span><span id="line-115">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
<span class="source-line-no">116</span><span id="line-116">import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;</span>
<span class="source-line-no">117</span><span id="line-117">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos;</span>
<span class="source-line-no">118</span><span id="line-118">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.GetUserPermissionsResponse;</span>
<span class="source-line-no">119</span><span id="line-119">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.GrantRequest;</span>
<span class="source-line-no">120</span><span id="line-120">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.GrantResponse;</span>
<span class="source-line-no">121</span><span id="line-121">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.HasUserPermissionsRequest;</span>
<span class="source-line-no">122</span><span id="line-122">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.HasUserPermissionsResponse;</span>
<span class="source-line-no">123</span><span id="line-123">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeRequest;</span>
<span class="source-line-no">124</span><span id="line-124">import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeResponse;</span>
<span class="source-line-no">125</span><span id="line-125">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;</span>
<span class="source-line-no">126</span><span id="line-126">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest;</span>
<span class="source-line-no">127</span><span id="line-127">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesResponse;</span>
<span class="source-line-no">128</span><span id="line-128">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest;</span>
<span class="source-line-no">129</span><span id="line-129">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheResponse;</span>
<span class="source-line-no">130</span><span id="line-130">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest;</span>
<span class="source-line-no">131</span><span id="line-131">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse;</span>
<span class="source-line-no">132</span><span id="line-132">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactionSwitchRequest;</span>
<span class="source-line-no">133</span><span id="line-133">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactionSwitchResponse;</span>
<span class="source-line-no">134</span><span id="line-134">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest;</span>
<span class="source-line-no">135</span><span id="line-135">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionResponse;</span>
<span class="source-line-no">136</span><span id="line-136">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;</span>
<span class="source-line-no">137</span><span id="line-137">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;</span>
<span class="source-line-no">138</span><span id="line-138">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;</span>
<span class="source-line-no">139</span><span id="line-139">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;</span>
<span class="source-line-no">140</span><span id="line-140">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;</span>
<span class="source-line-no">141</span><span id="line-141">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse;</span>
<span class="source-line-no">142</span><span id="line-142">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionLoadRequest;</span>
<span class="source-line-no">143</span><span id="line-143">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionLoadResponse;</span>
<span class="source-line-no">144</span><span id="line-144">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterRequest;</span>
<span class="source-line-no">145</span><span id="line-145">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterResponse;</span>
<span class="source-line-no">146</span><span id="line-146">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest;</span>
<span class="source-line-no">147</span><span id="line-147">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerResponse;</span>
<span class="source-line-no">148</span><span id="line-148">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationRequest;</span>
<span class="source-line-no">149</span><span id="line-149">import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationResponse;</span>
<span class="source-line-no">150</span><span id="line-150">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;</span>
<span class="source-line-no">151</span><span id="line-151">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameStringPair;</span>
<span class="source-line-no">152</span><span id="line-152">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription;</span>
<span class="source-line-no">153</span><span id="line-153">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;</span>
<span class="source-line-no">154</span><span id="line-154">import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.TableSchema;</span>
<span class="source-line-no">155</span><span id="line-155">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;</span>
<span class="source-line-no">156</span><span id="line-156">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AbortProcedureRequest;</span>
<span class="source-line-no">157</span><span id="line-157">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AbortProcedureResponse;</span>
<span class="source-line-no">158</span><span id="line-158">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AddColumnRequest;</span>
<span class="source-line-no">159</span><span id="line-159">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AddColumnResponse;</span>
<span class="source-line-no">160</span><span id="line-160">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignRegionRequest;</span>
<span class="source-line-no">161</span><span id="line-161">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignRegionResponse;</span>
<span class="source-line-no">162</span><span id="line-162">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersRequest;</span>
<span class="source-line-no">163</span><span id="line-163">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClearDeadServersResponse;</span>
<span class="source-line-no">164</span><span id="line-164">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceRequest;</span>
<span class="source-line-no">165</span><span id="line-165">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateNamespaceResponse;</span>
<span class="source-line-no">166</span><span id="line-166">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableRequest;</span>
<span class="source-line-no">167</span><span id="line-167">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.CreateTableResponse;</span>
<span class="source-line-no">168</span><span id="line-168">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersRequest;</span>
<span class="source-line-no">169</span><span id="line-169">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersResponse;</span>
<span class="source-line-no">170</span><span id="line-170">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteColumnRequest;</span>
<span class="source-line-no">171</span><span id="line-171">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteColumnResponse;</span>
<span class="source-line-no">172</span><span id="line-172">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteNamespaceRequest;</span>
<span class="source-line-no">173</span><span id="line-173">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteNamespaceResponse;</span>
<span class="source-line-no">174</span><span id="line-174">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteSnapshotRequest;</span>
<span class="source-line-no">175</span><span id="line-175">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteSnapshotResponse;</span>
<span class="source-line-no">176</span><span id="line-176">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteTableRequest;</span>
<span class="source-line-no">177</span><span id="line-177">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DeleteTableResponse;</span>
<span class="source-line-no">178</span><span id="line-178">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DisableTableRequest;</span>
<span class="source-line-no">179</span><span id="line-179">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DisableTableResponse;</span>
<span class="source-line-no">180</span><span id="line-180">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableCatalogJanitorRequest;</span>
<span class="source-line-no">181</span><span id="line-181">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableCatalogJanitorResponse;</span>
<span class="source-line-no">182</span><span id="line-182">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableRequest;</span>
<span class="source-line-no">183</span><span id="line-183">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableResponse;</span>
<span class="source-line-no">184</span><span id="line-184">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureRequest;</span>
<span class="source-line-no">185</span><span id="line-185">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;</span>
<span class="source-line-no">186</span><span id="line-186">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreRequest;</span>
<span class="source-line-no">187</span><span id="line-187">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreResponse;</span>
<span class="source-line-no">188</span><span id="line-188">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushTableRequest;</span>
<span class="source-line-no">189</span><span id="line-189">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushTableResponse;</span>
<span class="source-line-no">190</span><span id="line-190">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;</span>
<span class="source-line-no">191</span><span id="line-191">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusResponse;</span>
<span class="source-line-no">192</span><span id="line-192">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;</span>
<span class="source-line-no">193</span><span id="line-193">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsResponse;</span>
<span class="source-line-no">194</span><span id="line-194">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksRequest;</span>
<span class="source-line-no">195</span><span id="line-195">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksResponse;</span>
<span class="source-line-no">196</span><span id="line-196">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorRequest;</span>
<span class="source-line-no">197</span><span id="line-197">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetNamespaceDescriptorResponse;</span>
<span class="source-line-no">198</span><span id="line-198">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProcedureResultRequest;</span>
<span class="source-line-no">199</span><span id="line-199">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProcedureResultResponse;</span>
<span class="source-line-no">200</span><span id="line-200">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProceduresRequest;</span>
<span class="source-line-no">201</span><span id="line-201">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProceduresResponse;</span>
<span class="source-line-no">202</span><span id="line-202">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsRequest;</span>
<span class="source-line-no">203</span><span id="line-203">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsResponse;</span>
<span class="source-line-no">204</span><span id="line-204">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableNamesRequest;</span>
<span class="source-line-no">205</span><span id="line-205">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableNamesResponse;</span>
<span class="source-line-no">206</span><span id="line-206">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledRequest;</span>
<span class="source-line-no">207</span><span id="line-207">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledResponse;</span>
<span class="source-line-no">208</span><span id="line-208">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCatalogJanitorEnabledRequest;</span>
<span class="source-line-no">209</span><span id="line-209">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCatalogJanitorEnabledResponse;</span>
<span class="source-line-no">210</span><span id="line-210">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCleanerChoreEnabledRequest;</span>
<span class="source-line-no">211</span><span id="line-211">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsCleanerChoreEnabledResponse;</span>
<span class="source-line-no">212</span><span id="line-212">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsInMaintenanceModeRequest;</span>
<span class="source-line-no">213</span><span id="line-213">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsInMaintenanceModeResponse;</span>
<span class="source-line-no">214</span><span id="line-214">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledRequest;</span>
<span class="source-line-no">215</span><span id="line-215">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledResponse;</span>
<span class="source-line-no">216</span><span id="line-216">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsProcedureDoneRequest;</span>
<span class="source-line-no">217</span><span id="line-217">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsProcedureDoneResponse;</span>
<span class="source-line-no">218</span><span id="line-218">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsRpcThrottleEnabledRequest;</span>
<span class="source-line-no">219</span><span id="line-219">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsRpcThrottleEnabledResponse;</span>
<span class="source-line-no">220</span><span id="line-220">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotCleanupEnabledResponse;</span>
<span class="source-line-no">221</span><span id="line-221">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotDoneRequest;</span>
<span class="source-line-no">222</span><span id="line-222">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotDoneResponse;</span>
<span class="source-line-no">223</span><span id="line-223">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledRequest;</span>
<span class="source-line-no">224</span><span id="line-224">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledResponse;</span>
<span class="source-line-no">225</span><span id="line-225">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListDecommissionedRegionServersRequest;</span>
<span class="source-line-no">226</span><span id="line-226">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListDecommissionedRegionServersResponse;</span>
<span class="source-line-no">227</span><span id="line-227">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListNamespaceDescriptorsRequest;</span>
<span class="source-line-no">228</span><span id="line-228">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListNamespaceDescriptorsResponse;</span>
<span class="source-line-no">229</span><span id="line-229">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListNamespacesRequest;</span>
<span class="source-line-no">230</span><span id="line-230">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListNamespacesResponse;</span>
<span class="source-line-no">231</span><span id="line-231">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableDescriptorsByNamespaceRequest;</span>
<span class="source-line-no">232</span><span id="line-232">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableDescriptorsByNamespaceResponse;</span>
<span class="source-line-no">233</span><span id="line-233">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableDescriptorsByStateRequest;</span>
<span class="source-line-no">234</span><span id="line-234">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableDescriptorsByStateResponse;</span>
<span class="source-line-no">235</span><span id="line-235">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableNamesByNamespaceRequest;</span>
<span class="source-line-no">236</span><span id="line-236">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableNamesByNamespaceResponse;</span>
<span class="source-line-no">237</span><span id="line-237">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableNamesByStateRequest;</span>
<span class="source-line-no">238</span><span id="line-238">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ListTableNamesByStateResponse;</span>
<span class="source-line-no">239</span><span id="line-239">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampForRegionRequest;</span>
<span class="source-line-no">240</span><span id="line-240">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampRequest;</span>
<span class="source-line-no">241</span><span id="line-241">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MajorCompactionTimestampResponse;</span>
<span class="source-line-no">242</span><span id="line-242">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService;</span>
<span class="source-line-no">243</span><span id="line-243">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MergeTableRegionsRequest;</span>
<span class="source-line-no">244</span><span id="line-244">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MergeTableRegionsResponse;</span>
<span class="source-line-no">245</span><span id="line-245">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyColumnRequest;</span>
<span class="source-line-no">246</span><span id="line-246">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyColumnResponse;</span>
<span class="source-line-no">247</span><span id="line-247">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyColumnStoreFileTrackerRequest;</span>
<span class="source-line-no">248</span><span id="line-248">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyColumnStoreFileTrackerResponse;</span>
<span class="source-line-no">249</span><span id="line-249">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyNamespaceRequest;</span>
<span class="source-line-no">250</span><span id="line-250">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyNamespaceResponse;</span>
<span class="source-line-no">251</span><span id="line-251">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyTableRequest;</span>
<span class="source-line-no">252</span><span id="line-252">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyTableResponse;</span>
<span class="source-line-no">253</span><span id="line-253">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyTableStoreFileTrackerRequest;</span>
<span class="source-line-no">254</span><span id="line-254">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ModifyTableStoreFileTrackerResponse;</span>
<span class="source-line-no">255</span><span id="line-255">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MoveRegionRequest;</span>
<span class="source-line-no">256</span><span id="line-256">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MoveRegionResponse;</span>
<span class="source-line-no">257</span><span id="line-257">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeRequest;</span>
<span class="source-line-no">258</span><span id="line-258">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.NormalizeResponse;</span>
<span class="source-line-no">259</span><span id="line-259">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.OfflineRegionRequest;</span>
<span class="source-line-no">260</span><span id="line-260">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.OfflineRegionResponse;</span>
<span class="source-line-no">261</span><span id="line-261">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RecommissionRegionServerRequest;</span>
<span class="source-line-no">262</span><span id="line-262">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RecommissionRegionServerResponse;</span>
<span class="source-line-no">263</span><span id="line-263">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RestoreSnapshotRequest;</span>
<span class="source-line-no">264</span><span id="line-264">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RestoreSnapshotResponse;</span>
<span class="source-line-no">265</span><span id="line-265">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCatalogScanRequest;</span>
<span class="source-line-no">266</span><span id="line-266">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCatalogScanResponse;</span>
<span class="source-line-no">267</span><span id="line-267">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCleanerChoreRequest;</span>
<span class="source-line-no">268</span><span id="line-268">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCleanerChoreResponse;</span>
<span class="source-line-no">269</span><span id="line-269">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesRequest;</span>
<span class="source-line-no">270</span><span id="line-270">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesResponse;</span>
<span class="source-line-no">271</span><span id="line-271">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetBalancerRunningRequest;</span>
<span class="source-line-no">272</span><span id="line-272">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetBalancerRunningResponse;</span>
<span class="source-line-no">273</span><span id="line-273">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetCleanerChoreRunningRequest;</span>
<span class="source-line-no">274</span><span id="line-274">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetCleanerChoreRunningResponse;</span>
<span class="source-line-no">275</span><span id="line-275">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningRequest;</span>
<span class="source-line-no">276</span><span id="line-276">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetNormalizerRunningResponse;</span>
<span class="source-line-no">277</span><span id="line-277">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaRequest;</span>
<span class="source-line-no">278</span><span id="line-278">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaResponse;</span>
<span class="source-line-no">279</span><span id="line-279">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSnapshotCleanupResponse;</span>
<span class="source-line-no">280</span><span id="line-280">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledRequest;</span>
<span class="source-line-no">281</span><span id="line-281">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledResponse;</span>
<span class="source-line-no">282</span><span id="line-282">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ShutdownRequest;</span>
<span class="source-line-no">283</span><span id="line-283">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ShutdownResponse;</span>
<span class="source-line-no">284</span><span id="line-284">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SnapshotRequest;</span>
<span class="source-line-no">285</span><span id="line-285">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SnapshotResponse;</span>
<span class="source-line-no">286</span><span id="line-286">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SplitTableRegionRequest;</span>
<span class="source-line-no">287</span><span id="line-287">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SplitTableRegionResponse;</span>
<span class="source-line-no">288</span><span id="line-288">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.StopMasterRequest;</span>
<span class="source-line-no">289</span><span id="line-289">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.StopMasterResponse;</span>
<span class="source-line-no">290</span><span id="line-290">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SwitchExceedThrottleQuotaRequest;</span>
<span class="source-line-no">291</span><span id="line-291">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SwitchExceedThrottleQuotaResponse;</span>
<span class="source-line-no">292</span><span id="line-292">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SwitchRpcThrottleRequest;</span>
<span class="source-line-no">293</span><span id="line-293">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SwitchRpcThrottleResponse;</span>
<span class="source-line-no">294</span><span id="line-294">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.TruncateTableRequest;</span>
<span class="source-line-no">295</span><span id="line-295">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.TruncateTableResponse;</span>
<span class="source-line-no">296</span><span id="line-296">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionRequest;</span>
<span class="source-line-no">297</span><span id="line-297">import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignRegionResponse;</span>
<span class="source-line-no">298</span><span id="line-298">import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;</span>
<span class="source-line-no">299</span><span id="line-299">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetQuotaStatesRequest;</span>
<span class="source-line-no">300</span><span id="line-300">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetQuotaStatesResponse;</span>
<span class="source-line-no">301</span><span id="line-301">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesRequest;</span>
<span class="source-line-no">302</span><span id="line-302">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesResponse;</span>
<span class="source-line-no">303</span><span id="line-303">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaRegionSizesResponse.RegionSizes;</span>
<span class="source-line-no">304</span><span id="line-304">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsRequest;</span>
<span class="source-line-no">305</span><span id="line-305">import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsResponse;</span>
<span class="source-line-no">306</span><span id="line-306">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.AddRSGroupRequest;</span>
<span class="source-line-no">307</span><span id="line-307">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.AddRSGroupResponse;</span>
<span class="source-line-no">308</span><span id="line-308">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupRequest;</span>
<span class="source-line-no">309</span><span id="line-309">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupResponse;</span>
<span class="source-line-no">310</span><span id="line-310">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetConfiguredNamespacesAndTablesInRSGroupRequest;</span>
<span class="source-line-no">311</span><span id="line-311">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetConfiguredNamespacesAndTablesInRSGroupResponse;</span>
<span class="source-line-no">312</span><span id="line-312">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerRequest;</span>
<span class="source-line-no">313</span><span id="line-313">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerResponse;</span>
<span class="source-line-no">314</span><span id="line-314">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfTableRequest;</span>
<span class="source-line-no">315</span><span id="line-315">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfTableResponse;</span>
<span class="source-line-no">316</span><span id="line-316">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoRequest;</span>
<span class="source-line-no">317</span><span id="line-317">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoResponse;</span>
<span class="source-line-no">318</span><span id="line-318">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosRequest;</span>
<span class="source-line-no">319</span><span id="line-319">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosResponse;</span>
<span class="source-line-no">320</span><span id="line-320">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.ListTablesInRSGroupRequest;</span>
<span class="source-line-no">321</span><span id="line-321">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.ListTablesInRSGroupResponse;</span>
<span class="source-line-no">322</span><span id="line-322">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.MoveServersRequest;</span>
<span class="source-line-no">323</span><span id="line-323">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.MoveServersResponse;</span>
<span class="source-line-no">324</span><span id="line-324">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupRequest;</span>
<span class="source-line-no">325</span><span id="line-325">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse;</span>
<span class="source-line-no">326</span><span id="line-326">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.RemoveServersRequest;</span>
<span class="source-line-no">327</span><span id="line-327">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.RemoveServersResponse;</span>
<span class="source-line-no">328</span><span id="line-328">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.RenameRSGroupRequest;</span>
<span class="source-line-no">329</span><span id="line-329">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.RenameRSGroupResponse;</span>
<span class="source-line-no">330</span><span id="line-330">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.UpdateRSGroupConfigRequest;</span>
<span class="source-line-no">331</span><span id="line-331">import org.apache.hadoop.hbase.shaded.protobuf.generated.RSGroupAdminProtos.UpdateRSGroupConfigResponse;</span>
<span class="source-line-no">332</span><span id="line-332">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerRequest;</span>
<span class="source-line-no">333</span><span id="line-333">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.AddReplicationPeerResponse;</span>
<span class="source-line-no">334</span><span id="line-334">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerRequest;</span>
<span class="source-line-no">335</span><span id="line-335">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.DisableReplicationPeerResponse;</span>
<span class="source-line-no">336</span><span id="line-336">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerRequest;</span>
<span class="source-line-no">337</span><span id="line-337">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.EnableReplicationPeerResponse;</span>
<span class="source-line-no">338</span><span id="line-338">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigRequest;</span>
<span class="source-line-no">339</span><span id="line-339">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerConfigResponse;</span>
<span class="source-line-no">340</span><span id="line-340">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerModificationProceduresRequest;</span>
<span class="source-line-no">341</span><span id="line-341">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerModificationProceduresResponse;</span>
<span class="source-line-no">342</span><span id="line-342">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerStateRequest;</span>
<span class="source-line-no">343</span><span id="line-343">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.GetReplicationPeerStateResponse;</span>
<span class="source-line-no">344</span><span id="line-344">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.IsReplicationPeerModificationEnabledRequest;</span>
<span class="source-line-no">345</span><span id="line-345">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.IsReplicationPeerModificationEnabledResponse;</span>
<span class="source-line-no">346</span><span id="line-346">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersRequest;</span>
<span class="source-line-no">347</span><span id="line-347">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ListReplicationPeersResponse;</span>
<span class="source-line-no">348</span><span id="line-348">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerRequest;</span>
<span class="source-line-no">349</span><span id="line-349">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.RemoveReplicationPeerResponse;</span>
<span class="source-line-no">350</span><span id="line-350">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ReplicationPeerModificationSwitchRequest;</span>
<span class="source-line-no">351</span><span id="line-351">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.ReplicationPeerModificationSwitchResponse;</span>
<span class="source-line-no">352</span><span id="line-352">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.TransitReplicationPeerSyncReplicationStateRequest;</span>
<span class="source-line-no">353</span><span id="line-353">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.TransitReplicationPeerSyncReplicationStateResponse;</span>
<span class="source-line-no">354</span><span id="line-354">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigRequest;</span>
<span class="source-line-no">355</span><span id="line-355">import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos.UpdateReplicationPeerConfigResponse;</span>
<span class="source-line-no">356</span><span id="line-356">import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos;</span>
<span class="source-line-no">357</span><span id="line-357"></span>
<span class="source-line-no">358</span><span id="line-358">/**</span>
<span class="source-line-no">359</span><span id="line-359"> * The implementation of AsyncAdmin.</span>
<span class="source-line-no">360</span><span id="line-360"> * &lt;p&gt;</span>
<span class="source-line-no">361</span><span id="line-361"> * The word 'Raw' means that this is a low level class. The returned {@link CompletableFuture} will</span>
<span class="source-line-no">362</span><span id="line-362"> * be finished inside the rpc framework thread, which means that the callbacks registered to the</span>
<span class="source-line-no">363</span><span id="line-363"> * {@link CompletableFuture} will also be executed inside the rpc framework thread. So users who use</span>
<span class="source-line-no">364</span><span id="line-364"> * this class should not try to do time consuming tasks in the callbacks.</span>
<span class="source-line-no">365</span><span id="line-365"> * @since 2.0.0</span>
<span class="source-line-no">366</span><span id="line-366"> * @see AsyncHBaseAdmin</span>
<span class="source-line-no">367</span><span id="line-367"> * @see AsyncConnection#getAdmin()</span>
<span class="source-line-no">368</span><span id="line-368"> * @see AsyncConnection#getAdminBuilder()</span>
<span class="source-line-no">369</span><span id="line-369"> */</span>
<span class="source-line-no">370</span><span id="line-370">@InterfaceAudience.Private</span>
<span class="source-line-no">371</span><span id="line-371">class RawAsyncHBaseAdmin implements AsyncAdmin {</span>
<span class="source-line-no">372</span><span id="line-372"></span>
<span class="source-line-no">373</span><span id="line-373"> public static final String FLUSH_TABLE_PROCEDURE_SIGNATURE = "flush-table-proc";</span>
<span class="source-line-no">374</span><span id="line-374"></span>
<span class="source-line-no">375</span><span id="line-375"> private static final Logger LOG = LoggerFactory.getLogger(AsyncHBaseAdmin.class);</span>
<span class="source-line-no">376</span><span id="line-376"></span>
<span class="source-line-no">377</span><span id="line-377"> private final AsyncConnectionImpl connection;</span>
<span class="source-line-no">378</span><span id="line-378"></span>
<span class="source-line-no">379</span><span id="line-379"> private final HashedWheelTimer retryTimer;</span>
<span class="source-line-no">380</span><span id="line-380"></span>
<span class="source-line-no">381</span><span id="line-381"> private final AsyncTable&lt;AdvancedScanResultConsumer&gt; metaTable;</span>
<span class="source-line-no">382</span><span id="line-382"></span>
<span class="source-line-no">383</span><span id="line-383"> private final long rpcTimeoutNs;</span>
<span class="source-line-no">384</span><span id="line-384"></span>
<span class="source-line-no">385</span><span id="line-385"> private final long operationTimeoutNs;</span>
<span class="source-line-no">386</span><span id="line-386"></span>
<span class="source-line-no">387</span><span id="line-387"> private final long pauseNs;</span>
<span class="source-line-no">388</span><span id="line-388"></span>
<span class="source-line-no">389</span><span id="line-389"> private final long pauseNsForServerOverloaded;</span>
<span class="source-line-no">390</span><span id="line-390"></span>
<span class="source-line-no">391</span><span id="line-391"> private final int maxAttempts;</span>
<span class="source-line-no">392</span><span id="line-392"></span>
<span class="source-line-no">393</span><span id="line-393"> private final int startLogErrorsCnt;</span>
<span class="source-line-no">394</span><span id="line-394"></span>
<span class="source-line-no">395</span><span id="line-395"> private final NonceGenerator ng;</span>
<span class="source-line-no">396</span><span id="line-396"></span>
<span class="source-line-no">397</span><span id="line-397"> RawAsyncHBaseAdmin(AsyncConnectionImpl connection, HashedWheelTimer retryTimer,</span>
<span class="source-line-no">398</span><span id="line-398"> AsyncAdminBuilderBase builder) {</span>
<span class="source-line-no">399</span><span id="line-399"> this.connection = connection;</span>
<span class="source-line-no">400</span><span id="line-400"> this.retryTimer = retryTimer;</span>
<span class="source-line-no">401</span><span id="line-401"> this.metaTable = connection.getTable(META_TABLE_NAME);</span>
<span class="source-line-no">402</span><span id="line-402"> this.rpcTimeoutNs = builder.rpcTimeoutNs;</span>
<span class="source-line-no">403</span><span id="line-403"> this.operationTimeoutNs = builder.operationTimeoutNs;</span>
<span class="source-line-no">404</span><span id="line-404"> this.pauseNs = builder.pauseNs;</span>
<span class="source-line-no">405</span><span id="line-405"> if (builder.pauseNsForServerOverloaded &lt; builder.pauseNs) {</span>
<span class="source-line-no">406</span><span id="line-406"> LOG.warn(</span>
<span class="source-line-no">407</span><span id="line-407"> "Configured value of pauseNsForServerOverloaded is {} ms, which is less than"</span>
<span class="source-line-no">408</span><span id="line-408"> + " the normal pause value {} ms, use the greater one instead",</span>
<span class="source-line-no">409</span><span id="line-409"> TimeUnit.NANOSECONDS.toMillis(builder.pauseNsForServerOverloaded),</span>
<span class="source-line-no">410</span><span id="line-410"> TimeUnit.NANOSECONDS.toMillis(builder.pauseNs));</span>
<span class="source-line-no">411</span><span id="line-411"> this.pauseNsForServerOverloaded = builder.pauseNs;</span>
<span class="source-line-no">412</span><span id="line-412"> } else {</span>
<span class="source-line-no">413</span><span id="line-413"> this.pauseNsForServerOverloaded = builder.pauseNsForServerOverloaded;</span>
<span class="source-line-no">414</span><span id="line-414"> }</span>
<span class="source-line-no">415</span><span id="line-415"> this.maxAttempts = builder.maxAttempts;</span>
<span class="source-line-no">416</span><span id="line-416"> this.startLogErrorsCnt = builder.startLogErrorsCnt;</span>
<span class="source-line-no">417</span><span id="line-417"> this.ng = connection.getNonceGenerator();</span>
<span class="source-line-no">418</span><span id="line-418"> }</span>
<span class="source-line-no">419</span><span id="line-419"></span>
<span class="source-line-no">420</span><span id="line-420"> &lt;T&gt; MasterRequestCallerBuilder&lt;T&gt; newMasterCaller() {</span>
<span class="source-line-no">421</span><span id="line-421"> return this.connection.callerFactory.&lt;T&gt; masterRequest()</span>
<span class="source-line-no">422</span><span id="line-422"> .rpcTimeout(rpcTimeoutNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">423</span><span id="line-423"> .operationTimeout(operationTimeoutNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">424</span><span id="line-424"> .pause(pauseNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">425</span><span id="line-425"> .pauseForServerOverloaded(pauseNsForServerOverloaded, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">426</span><span id="line-426"> .maxAttempts(maxAttempts).startLogErrorsCnt(startLogErrorsCnt);</span>
<span class="source-line-no">427</span><span id="line-427"> }</span>
<span class="source-line-no">428</span><span id="line-428"></span>
<span class="source-line-no">429</span><span id="line-429"> private &lt;T&gt; AdminRequestCallerBuilder&lt;T&gt; newAdminCaller() {</span>
<span class="source-line-no">430</span><span id="line-430"> return this.connection.callerFactory.&lt;T&gt; adminRequest()</span>
<span class="source-line-no">431</span><span id="line-431"> .rpcTimeout(rpcTimeoutNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">432</span><span id="line-432"> .operationTimeout(operationTimeoutNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">433</span><span id="line-433"> .pause(pauseNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">434</span><span id="line-434"> .pauseForServerOverloaded(pauseNsForServerOverloaded, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">435</span><span id="line-435"> .maxAttempts(maxAttempts).startLogErrorsCnt(startLogErrorsCnt);</span>
<span class="source-line-no">436</span><span id="line-436"> }</span>
<span class="source-line-no">437</span><span id="line-437"></span>
<span class="source-line-no">438</span><span id="line-438"> @FunctionalInterface</span>
<span class="source-line-no">439</span><span id="line-439"> private interface MasterRpcCall&lt;RESP, REQ&gt; {</span>
<span class="source-line-no">440</span><span id="line-440"> void call(MasterService.Interface stub, HBaseRpcController controller, REQ req,</span>
<span class="source-line-no">441</span><span id="line-441"> RpcCallback&lt;RESP&gt; done);</span>
<span class="source-line-no">442</span><span id="line-442"> }</span>
<span class="source-line-no">443</span><span id="line-443"></span>
<span class="source-line-no">444</span><span id="line-444"> @FunctionalInterface</span>
<span class="source-line-no">445</span><span id="line-445"> private interface AdminRpcCall&lt;RESP, REQ&gt; {</span>
<span class="source-line-no">446</span><span id="line-446"> void call(AdminService.Interface stub, HBaseRpcController controller, REQ req,</span>
<span class="source-line-no">447</span><span id="line-447"> RpcCallback&lt;RESP&gt; done);</span>
<span class="source-line-no">448</span><span id="line-448"> }</span>
<span class="source-line-no">449</span><span id="line-449"></span>
<span class="source-line-no">450</span><span id="line-450"> @FunctionalInterface</span>
<span class="source-line-no">451</span><span id="line-451"> private interface Converter&lt;D, S&gt; {</span>
<span class="source-line-no">452</span><span id="line-452"> D convert(S src) throws IOException;</span>
<span class="source-line-no">453</span><span id="line-453"> }</span>
<span class="source-line-no">454</span><span id="line-454"></span>
<span class="source-line-no">455</span><span id="line-455"> private &lt;PREQ, PRESP, RESP&gt; CompletableFuture&lt;RESP&gt; call(HBaseRpcController controller,</span>
<span class="source-line-no">456</span><span id="line-456"> MasterService.Interface stub, PREQ preq, MasterRpcCall&lt;PRESP, PREQ&gt; rpcCall,</span>
<span class="source-line-no">457</span><span id="line-457"> Converter&lt;RESP, PRESP&gt; respConverter) {</span>
<span class="source-line-no">458</span><span id="line-458"> CompletableFuture&lt;RESP&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">459</span><span id="line-459"> rpcCall.call(stub, controller, preq, new RpcCallback&lt;PRESP&gt;() {</span>
<span class="source-line-no">460</span><span id="line-460"></span>
<span class="source-line-no">461</span><span id="line-461"> @Override</span>
<span class="source-line-no">462</span><span id="line-462"> public void run(PRESP resp) {</span>
<span class="source-line-no">463</span><span id="line-463"> if (controller.failed()) {</span>
<span class="source-line-no">464</span><span id="line-464"> future.completeExceptionally(controller.getFailed());</span>
<span class="source-line-no">465</span><span id="line-465"> } else {</span>
<span class="source-line-no">466</span><span id="line-466"> try {</span>
<span class="source-line-no">467</span><span id="line-467"> future.complete(respConverter.convert(resp));</span>
<span class="source-line-no">468</span><span id="line-468"> } catch (IOException e) {</span>
<span class="source-line-no">469</span><span id="line-469"> future.completeExceptionally(e);</span>
<span class="source-line-no">470</span><span id="line-470"> }</span>
<span class="source-line-no">471</span><span id="line-471"> }</span>
<span class="source-line-no">472</span><span id="line-472"> }</span>
<span class="source-line-no">473</span><span id="line-473"> });</span>
<span class="source-line-no">474</span><span id="line-474"> return future;</span>
<span class="source-line-no">475</span><span id="line-475"> }</span>
<span class="source-line-no">476</span><span id="line-476"></span>
<span class="source-line-no">477</span><span id="line-477"> private &lt;PREQ, PRESP, RESP&gt; CompletableFuture&lt;RESP&gt; adminCall(HBaseRpcController controller,</span>
<span class="source-line-no">478</span><span id="line-478"> AdminService.Interface stub, PREQ preq, AdminRpcCall&lt;PRESP, PREQ&gt; rpcCall,</span>
<span class="source-line-no">479</span><span id="line-479"> Converter&lt;RESP, PRESP&gt; respConverter) {</span>
<span class="source-line-no">480</span><span id="line-480"> CompletableFuture&lt;RESP&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">481</span><span id="line-481"> rpcCall.call(stub, controller, preq, new RpcCallback&lt;PRESP&gt;() {</span>
<span class="source-line-no">482</span><span id="line-482"></span>
<span class="source-line-no">483</span><span id="line-483"> @Override</span>
<span class="source-line-no">484</span><span id="line-484"> public void run(PRESP resp) {</span>
<span class="source-line-no">485</span><span id="line-485"> if (controller.failed()) {</span>
<span class="source-line-no">486</span><span id="line-486"> future.completeExceptionally(controller.getFailed());</span>
<span class="source-line-no">487</span><span id="line-487"> } else {</span>
<span class="source-line-no">488</span><span id="line-488"> try {</span>
<span class="source-line-no">489</span><span id="line-489"> future.complete(respConverter.convert(resp));</span>
<span class="source-line-no">490</span><span id="line-490"> } catch (IOException e) {</span>
<span class="source-line-no">491</span><span id="line-491"> future.completeExceptionally(e);</span>
<span class="source-line-no">492</span><span id="line-492"> }</span>
<span class="source-line-no">493</span><span id="line-493"> }</span>
<span class="source-line-no">494</span><span id="line-494"> }</span>
<span class="source-line-no">495</span><span id="line-495"> });</span>
<span class="source-line-no">496</span><span id="line-496"> return future;</span>
<span class="source-line-no">497</span><span id="line-497"> }</span>
<span class="source-line-no">498</span><span id="line-498"></span>
<span class="source-line-no">499</span><span id="line-499"> private &lt;PREQ, PRESP&gt; CompletableFuture&lt;Void&gt; procedureCall(PREQ preq,</span>
<span class="source-line-no">500</span><span id="line-500"> MasterRpcCall&lt;PRESP, PREQ&gt; rpcCall, Converter&lt;Long, PRESP&gt; respConverter,</span>
<span class="source-line-no">501</span><span id="line-501"> ProcedureBiConsumer consumer) {</span>
<span class="source-line-no">502</span><span id="line-502"> return procedureCall(b -&gt; {</span>
<span class="source-line-no">503</span><span id="line-503"> }, preq, rpcCall, respConverter, consumer);</span>
<span class="source-line-no">504</span><span id="line-504"> }</span>
<span class="source-line-no">505</span><span id="line-505"></span>
<span class="source-line-no">506</span><span id="line-506"> private &lt;PREQ, PRESP&gt; CompletableFuture&lt;Void&gt; procedureCall(TableName tableName, PREQ preq,</span>
<span class="source-line-no">507</span><span id="line-507"> MasterRpcCall&lt;PRESP, PREQ&gt; rpcCall, Converter&lt;Long, PRESP&gt; respConverter,</span>
<span class="source-line-no">508</span><span id="line-508"> ProcedureBiConsumer consumer) {</span>
<span class="source-line-no">509</span><span id="line-509"> return procedureCall(b -&gt; b.priority(tableName), preq, rpcCall, respConverter, consumer);</span>
<span class="source-line-no">510</span><span id="line-510"> }</span>
<span class="source-line-no">511</span><span id="line-511"></span>
<span class="source-line-no">512</span><span id="line-512"> private &lt;PREQ, PRESP&gt; CompletableFuture&lt;Void&gt; procedureCall(</span>
<span class="source-line-no">513</span><span id="line-513"> Consumer&lt;MasterRequestCallerBuilder&lt;?&gt;&gt; prioritySetter, PREQ preq,</span>
<span class="source-line-no">514</span><span id="line-514"> MasterRpcCall&lt;PRESP, PREQ&gt; rpcCall, Converter&lt;Long, PRESP&gt; respConverter,</span>
<span class="source-line-no">515</span><span id="line-515"> ProcedureBiConsumer consumer) {</span>
<span class="source-line-no">516</span><span id="line-516"> MasterRequestCallerBuilder&lt;Long&gt; builder = this.&lt;Long&gt; newMasterCaller().action((controller,</span>
<span class="source-line-no">517</span><span id="line-517"> stub) -&gt; this.&lt;PREQ, PRESP, Long&gt; call(controller, stub, preq, rpcCall, respConverter));</span>
<span class="source-line-no">518</span><span id="line-518"> prioritySetter.accept(builder);</span>
<span class="source-line-no">519</span><span id="line-519"> CompletableFuture&lt;Long&gt; procFuture = builder.call();</span>
<span class="source-line-no">520</span><span id="line-520"> CompletableFuture&lt;Void&gt; future = waitProcedureResult(procFuture);</span>
<span class="source-line-no">521</span><span id="line-521"> addListener(future, consumer);</span>
<span class="source-line-no">522</span><span id="line-522"> return future;</span>
<span class="source-line-no">523</span><span id="line-523"> }</span>
<span class="source-line-no">524</span><span id="line-524"></span>
<span class="source-line-no">525</span><span id="line-525"> @Override</span>
<span class="source-line-no">526</span><span id="line-526"> public CompletableFuture&lt;Boolean&gt; tableExists(TableName tableName) {</span>
<span class="source-line-no">527</span><span id="line-527"> if (TableName.isMetaTableName(tableName)) {</span>
<span class="source-line-no">528</span><span id="line-528"> return CompletableFuture.completedFuture(true);</span>
<span class="source-line-no">529</span><span id="line-529"> }</span>
<span class="source-line-no">530</span><span id="line-530"> return ClientMetaTableAccessor.tableExists(metaTable, tableName);</span>
<span class="source-line-no">531</span><span id="line-531"> }</span>
<span class="source-line-no">532</span><span id="line-532"></span>
<span class="source-line-no">533</span><span id="line-533"> @Override</span>
<span class="source-line-no">534</span><span id="line-534"> public CompletableFuture&lt;List&lt;TableDescriptor&gt;&gt; listTableDescriptors(boolean includeSysTables) {</span>
<span class="source-line-no">535</span><span id="line-535"> return getTableDescriptors(</span>
<span class="source-line-no">536</span><span id="line-536"> RequestConverter.buildGetTableDescriptorsRequest(null, includeSysTables));</span>
<span class="source-line-no">537</span><span id="line-537"> }</span>
<span class="source-line-no">538</span><span id="line-538"></span>
<span class="source-line-no">539</span><span id="line-539"> /**</span>
<span class="source-line-no">540</span><span id="line-540"> * {@link #listTableDescriptors(boolean)}</span>
<span class="source-line-no">541</span><span id="line-541"> */</span>
<span class="source-line-no">542</span><span id="line-542"> @Override</span>
<span class="source-line-no">543</span><span id="line-543"> public CompletableFuture&lt;List&lt;TableDescriptor&gt;&gt; listTableDescriptors(Pattern pattern,</span>
<span class="source-line-no">544</span><span id="line-544"> boolean includeSysTables) {</span>
<span class="source-line-no">545</span><span id="line-545"> Preconditions.checkNotNull(pattern, "pattern is null. If you don't specify a pattern, "</span>
<span class="source-line-no">546</span><span id="line-546"> + "use listTableDescriptors(boolean) instead");</span>
<span class="source-line-no">547</span><span id="line-547"> return getTableDescriptors(</span>
<span class="source-line-no">548</span><span id="line-548"> RequestConverter.buildGetTableDescriptorsRequest(pattern, includeSysTables));</span>
<span class="source-line-no">549</span><span id="line-549"> }</span>
<span class="source-line-no">550</span><span id="line-550"></span>
<span class="source-line-no">551</span><span id="line-551"> @Override</span>
<span class="source-line-no">552</span><span id="line-552"> public CompletableFuture&lt;List&lt;TableDescriptor&gt;&gt; listTableDescriptors(List&lt;TableName&gt; tableNames) {</span>
<span class="source-line-no">553</span><span id="line-553"> Preconditions.checkNotNull(tableNames, "tableNames is null. If you don't specify tableNames, "</span>
<span class="source-line-no">554</span><span id="line-554"> + "use listTableDescriptors(boolean) instead");</span>
<span class="source-line-no">555</span><span id="line-555"> if (tableNames.isEmpty()) {</span>
<span class="source-line-no">556</span><span id="line-556"> return CompletableFuture.completedFuture(Collections.emptyList());</span>
<span class="source-line-no">557</span><span id="line-557"> }</span>
<span class="source-line-no">558</span><span id="line-558"> return getTableDescriptors(RequestConverter.buildGetTableDescriptorsRequest(tableNames));</span>
<span class="source-line-no">559</span><span id="line-559"> }</span>
<span class="source-line-no">560</span><span id="line-560"></span>
<span class="source-line-no">561</span><span id="line-561"> private CompletableFuture&lt;List&lt;TableDescriptor&gt;&gt;</span>
<span class="source-line-no">562</span><span id="line-562"> getTableDescriptors(GetTableDescriptorsRequest request) {</span>
<span class="source-line-no">563</span><span id="line-563"> return this.&lt;List&lt;TableDescriptor&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">564</span><span id="line-564"> .action((controller, stub) -&gt; this.&lt;GetTableDescriptorsRequest, GetTableDescriptorsResponse,</span>
<span class="source-line-no">565</span><span id="line-565"> List&lt;TableDescriptor&gt;&gt; call(controller, stub, request,</span>
<span class="source-line-no">566</span><span id="line-566"> (s, c, req, done) -&gt; s.getTableDescriptors(c, req, done),</span>
<span class="source-line-no">567</span><span id="line-567"> (resp) -&gt; ProtobufUtil.toTableDescriptorList(resp)))</span>
<span class="source-line-no">568</span><span id="line-568"> .call();</span>
<span class="source-line-no">569</span><span id="line-569"> }</span>
<span class="source-line-no">570</span><span id="line-570"></span>
<span class="source-line-no">571</span><span id="line-571"> @Override</span>
<span class="source-line-no">572</span><span id="line-572"> public CompletableFuture&lt;List&lt;TableName&gt;&gt; listTableNames(boolean includeSysTables) {</span>
<span class="source-line-no">573</span><span id="line-573"> return getTableNames(RequestConverter.buildGetTableNamesRequest(null, includeSysTables));</span>
<span class="source-line-no">574</span><span id="line-574"> }</span>
<span class="source-line-no">575</span><span id="line-575"></span>
<span class="source-line-no">576</span><span id="line-576"> @Override</span>
<span class="source-line-no">577</span><span id="line-577"> public CompletableFuture&lt;List&lt;TableName&gt;&gt; listTableNames(Pattern pattern,</span>
<span class="source-line-no">578</span><span id="line-578"> boolean includeSysTables) {</span>
<span class="source-line-no">579</span><span id="line-579"> Preconditions.checkNotNull(pattern,</span>
<span class="source-line-no">580</span><span id="line-580"> "pattern is null. If you don't specify a pattern, use listTableNames(boolean) instead");</span>
<span class="source-line-no">581</span><span id="line-581"> return getTableNames(RequestConverter.buildGetTableNamesRequest(pattern, includeSysTables));</span>
<span class="source-line-no">582</span><span id="line-582"> }</span>
<span class="source-line-no">583</span><span id="line-583"></span>
<span class="source-line-no">584</span><span id="line-584"> @Override</span>
<span class="source-line-no">585</span><span id="line-585"> public CompletableFuture&lt;List&lt;TableName&gt;&gt; listTableNamesByState(boolean isEnabled) {</span>
<span class="source-line-no">586</span><span id="line-586"> return this.&lt;List&lt;TableName&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">587</span><span id="line-587"> .action((controller, stub) -&gt; this.&lt;ListTableNamesByStateRequest,</span>
<span class="source-line-no">588</span><span id="line-588"> ListTableNamesByStateResponse, List&lt;TableName&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">589</span><span id="line-589"> ListTableNamesByStateRequest.newBuilder().setIsEnabled(isEnabled).build(),</span>
<span class="source-line-no">590</span><span id="line-590"> (s, c, req, done) -&gt; s.listTableNamesByState(c, req, done),</span>
<span class="source-line-no">591</span><span id="line-591"> (resp) -&gt; ProtobufUtil.toTableNameList(resp.getTableNamesList())))</span>
<span class="source-line-no">592</span><span id="line-592"> .call();</span>
<span class="source-line-no">593</span><span id="line-593"> }</span>
<span class="source-line-no">594</span><span id="line-594"></span>
<span class="source-line-no">595</span><span id="line-595"> private CompletableFuture&lt;List&lt;TableName&gt;&gt; getTableNames(GetTableNamesRequest request) {</span>
<span class="source-line-no">596</span><span id="line-596"> return this.&lt;List&lt;TableName&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">597</span><span id="line-597"> .action((controller, stub) -&gt; this.&lt;GetTableNamesRequest, GetTableNamesResponse,</span>
<span class="source-line-no">598</span><span id="line-598"> List&lt;TableName&gt;&gt; call(controller, stub, request,</span>
<span class="source-line-no">599</span><span id="line-599"> (s, c, req, done) -&gt; s.getTableNames(c, req, done),</span>
<span class="source-line-no">600</span><span id="line-600"> (resp) -&gt; ProtobufUtil.toTableNameList(resp.getTableNamesList())))</span>
<span class="source-line-no">601</span><span id="line-601"> .call();</span>
<span class="source-line-no">602</span><span id="line-602"> }</span>
<span class="source-line-no">603</span><span id="line-603"></span>
<span class="source-line-no">604</span><span id="line-604"> @Override</span>
<span class="source-line-no">605</span><span id="line-605"> public CompletableFuture&lt;List&lt;TableDescriptor&gt;&gt; listTableDescriptorsByNamespace(String name) {</span>
<span class="source-line-no">606</span><span id="line-606"> return this.&lt;List&lt;TableDescriptor&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">607</span><span id="line-607"> .action((controller, stub) -&gt; this.&lt;ListTableDescriptorsByNamespaceRequest,</span>
<span class="source-line-no">608</span><span id="line-608"> ListTableDescriptorsByNamespaceResponse, List&lt;TableDescriptor&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">609</span><span id="line-609"> ListTableDescriptorsByNamespaceRequest.newBuilder().setNamespaceName(name).build(),</span>
<span class="source-line-no">610</span><span id="line-610"> (s, c, req, done) -&gt; s.listTableDescriptorsByNamespace(c, req, done),</span>
<span class="source-line-no">611</span><span id="line-611"> (resp) -&gt; ProtobufUtil.toTableDescriptorList(resp)))</span>
<span class="source-line-no">612</span><span id="line-612"> .call();</span>
<span class="source-line-no">613</span><span id="line-613"> }</span>
<span class="source-line-no">614</span><span id="line-614"></span>
<span class="source-line-no">615</span><span id="line-615"> @Override</span>
<span class="source-line-no">616</span><span id="line-616"> public CompletableFuture&lt;List&lt;TableDescriptor&gt;&gt; listTableDescriptorsByState(boolean isEnabled) {</span>
<span class="source-line-no">617</span><span id="line-617"> return this.&lt;List&lt;TableDescriptor&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">618</span><span id="line-618"> .action((controller, stub) -&gt; this.&lt;ListTableDescriptorsByStateRequest,</span>
<span class="source-line-no">619</span><span id="line-619"> ListTableDescriptorsByStateResponse, List&lt;TableDescriptor&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">620</span><span id="line-620"> ListTableDescriptorsByStateRequest.newBuilder().setIsEnabled(isEnabled).build(),</span>
<span class="source-line-no">621</span><span id="line-621"> (s, c, req, done) -&gt; s.listTableDescriptorsByState(c, req, done),</span>
<span class="source-line-no">622</span><span id="line-622"> (resp) -&gt; ProtobufUtil.toTableDescriptorList(resp)))</span>
<span class="source-line-no">623</span><span id="line-623"> .call();</span>
<span class="source-line-no">624</span><span id="line-624"> }</span>
<span class="source-line-no">625</span><span id="line-625"></span>
<span class="source-line-no">626</span><span id="line-626"> @Override</span>
<span class="source-line-no">627</span><span id="line-627"> public CompletableFuture&lt;List&lt;TableName&gt;&gt; listTableNamesByNamespace(String name) {</span>
<span class="source-line-no">628</span><span id="line-628"> return this.&lt;List&lt;TableName&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">629</span><span id="line-629"> .action((controller, stub) -&gt; this.&lt;ListTableNamesByNamespaceRequest,</span>
<span class="source-line-no">630</span><span id="line-630"> ListTableNamesByNamespaceResponse, List&lt;TableName&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">631</span><span id="line-631"> ListTableNamesByNamespaceRequest.newBuilder().setNamespaceName(name).build(),</span>
<span class="source-line-no">632</span><span id="line-632"> (s, c, req, done) -&gt; s.listTableNamesByNamespace(c, req, done),</span>
<span class="source-line-no">633</span><span id="line-633"> (resp) -&gt; ProtobufUtil.toTableNameList(resp.getTableNameList())))</span>
<span class="source-line-no">634</span><span id="line-634"> .call();</span>
<span class="source-line-no">635</span><span id="line-635"> }</span>
<span class="source-line-no">636</span><span id="line-636"></span>
<span class="source-line-no">637</span><span id="line-637"> @Override</span>
<span class="source-line-no">638</span><span id="line-638"> public CompletableFuture&lt;TableDescriptor&gt; getDescriptor(TableName tableName) {</span>
<span class="source-line-no">639</span><span id="line-639"> CompletableFuture&lt;TableDescriptor&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">640</span><span id="line-640"> addListener(this.&lt;List&lt;TableSchema&gt;&gt; newMasterCaller().priority(tableName)</span>
<span class="source-line-no">641</span><span id="line-641"> .action((controller, stub) -&gt; this.&lt;GetTableDescriptorsRequest, GetTableDescriptorsResponse,</span>
<span class="source-line-no">642</span><span id="line-642"> List&lt;TableSchema&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">643</span><span id="line-643"> RequestConverter.buildGetTableDescriptorsRequest(tableName),</span>
<span class="source-line-no">644</span><span id="line-644"> (s, c, req, done) -&gt; s.getTableDescriptors(c, req, done),</span>
<span class="source-line-no">645</span><span id="line-645"> (resp) -&gt; resp.getTableSchemaList()))</span>
<span class="source-line-no">646</span><span id="line-646"> .call(), (tableSchemas, error) -&gt; {</span>
<span class="source-line-no">647</span><span id="line-647"> if (error != null) {</span>
<span class="source-line-no">648</span><span id="line-648"> future.completeExceptionally(error);</span>
<span class="source-line-no">649</span><span id="line-649"> return;</span>
<span class="source-line-no">650</span><span id="line-650"> }</span>
<span class="source-line-no">651</span><span id="line-651"> if (!tableSchemas.isEmpty()) {</span>
<span class="source-line-no">652</span><span id="line-652"> future.complete(ProtobufUtil.toTableDescriptor(tableSchemas.get(0)));</span>
<span class="source-line-no">653</span><span id="line-653"> } else {</span>
<span class="source-line-no">654</span><span id="line-654"> future.completeExceptionally(new TableNotFoundException(tableName.getNameAsString()));</span>
<span class="source-line-no">655</span><span id="line-655"> }</span>
<span class="source-line-no">656</span><span id="line-656"> });</span>
<span class="source-line-no">657</span><span id="line-657"> return future;</span>
<span class="source-line-no">658</span><span id="line-658"> }</span>
<span class="source-line-no">659</span><span id="line-659"></span>
<span class="source-line-no">660</span><span id="line-660"> @Override</span>
<span class="source-line-no">661</span><span id="line-661"> public CompletableFuture&lt;Void&gt; createTable(TableDescriptor desc) {</span>
<span class="source-line-no">662</span><span id="line-662"> return createTable(desc.getTableName(),</span>
<span class="source-line-no">663</span><span id="line-663"> RequestConverter.buildCreateTableRequest(desc, null, ng.getNonceGroup(), ng.newNonce()));</span>
<span class="source-line-no">664</span><span id="line-664"> }</span>
<span class="source-line-no">665</span><span id="line-665"></span>
<span class="source-line-no">666</span><span id="line-666"> @Override</span>
<span class="source-line-no">667</span><span id="line-667"> public CompletableFuture&lt;Void&gt; createTable(TableDescriptor desc, byte[] startKey, byte[] endKey,</span>
<span class="source-line-no">668</span><span id="line-668"> int numRegions) {</span>
<span class="source-line-no">669</span><span id="line-669"> try {</span>
<span class="source-line-no">670</span><span id="line-670"> return createTable(desc, getSplitKeys(startKey, endKey, numRegions));</span>
<span class="source-line-no">671</span><span id="line-671"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">672</span><span id="line-672"> return failedFuture(e);</span>
<span class="source-line-no">673</span><span id="line-673"> }</span>
<span class="source-line-no">674</span><span id="line-674"> }</span>
<span class="source-line-no">675</span><span id="line-675"></span>
<span class="source-line-no">676</span><span id="line-676"> @Override</span>
<span class="source-line-no">677</span><span id="line-677"> public CompletableFuture&lt;Void&gt; createTable(TableDescriptor desc, byte[][] splitKeys) {</span>
<span class="source-line-no">678</span><span id="line-678"> Preconditions.checkNotNull(splitKeys, "splitKeys is null. If you don't specify splitKeys,"</span>
<span class="source-line-no">679</span><span id="line-679"> + " use createTable(TableDescriptor) instead");</span>
<span class="source-line-no">680</span><span id="line-680"> try {</span>
<span class="source-line-no">681</span><span id="line-681"> verifySplitKeys(splitKeys);</span>
<span class="source-line-no">682</span><span id="line-682"> return createTable(desc.getTableName(), RequestConverter.buildCreateTableRequest(desc,</span>
<span class="source-line-no">683</span><span id="line-683"> splitKeys, ng.getNonceGroup(), ng.newNonce()));</span>
<span class="source-line-no">684</span><span id="line-684"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">685</span><span id="line-685"> return failedFuture(e);</span>
<span class="source-line-no">686</span><span id="line-686"> }</span>
<span class="source-line-no">687</span><span id="line-687"> }</span>
<span class="source-line-no">688</span><span id="line-688"></span>
<span class="source-line-no">689</span><span id="line-689"> private CompletableFuture&lt;Void&gt; createTable(TableName tableName, CreateTableRequest request) {</span>
<span class="source-line-no">690</span><span id="line-690"> Preconditions.checkNotNull(tableName, "table name is null");</span>
<span class="source-line-no">691</span><span id="line-691"> return this.&lt;CreateTableRequest, CreateTableResponse&gt; procedureCall(tableName, request,</span>
<span class="source-line-no">692</span><span id="line-692"> (s, c, req, done) -&gt; s.createTable(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">693</span><span id="line-693"> new CreateTableProcedureBiConsumer(tableName));</span>
<span class="source-line-no">694</span><span id="line-694"> }</span>
<span class="source-line-no">695</span><span id="line-695"></span>
<span class="source-line-no">696</span><span id="line-696"> @Override</span>
<span class="source-line-no">697</span><span id="line-697"> public CompletableFuture&lt;Void&gt; modifyTable(TableDescriptor desc) {</span>
<span class="source-line-no">698</span><span id="line-698"> return modifyTable(desc, true);</span>
<span class="source-line-no">699</span><span id="line-699"> }</span>
<span class="source-line-no">700</span><span id="line-700"></span>
<span class="source-line-no">701</span><span id="line-701"> @Override</span>
<span class="source-line-no">702</span><span id="line-702"> public CompletableFuture&lt;Void&gt; modifyTable(TableDescriptor desc, boolean reopenRegions) {</span>
<span class="source-line-no">703</span><span id="line-703"> return this.&lt;ModifyTableRequest, ModifyTableResponse&gt; procedureCall(desc.getTableName(),</span>
<span class="source-line-no">704</span><span id="line-704"> RequestConverter.buildModifyTableRequest(desc.getTableName(), desc, ng.getNonceGroup(),</span>
<span class="source-line-no">705</span><span id="line-705"> ng.newNonce(), reopenRegions),</span>
<span class="source-line-no">706</span><span id="line-706"> (s, c, req, done) -&gt; s.modifyTable(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">707</span><span id="line-707"> new ModifyTableProcedureBiConsumer(this, desc.getTableName()));</span>
<span class="source-line-no">708</span><span id="line-708"> }</span>
<span class="source-line-no">709</span><span id="line-709"></span>
<span class="source-line-no">710</span><span id="line-710"> @Override</span>
<span class="source-line-no">711</span><span id="line-711"> public CompletableFuture&lt;Void&gt; modifyTableStoreFileTracker(TableName tableName, String dstSFT) {</span>
<span class="source-line-no">712</span><span id="line-712"> return this.&lt;ModifyTableStoreFileTrackerRequest,</span>
<span class="source-line-no">713</span><span id="line-713"> ModifyTableStoreFileTrackerResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">714</span><span id="line-714"> RequestConverter.buildModifyTableStoreFileTrackerRequest(tableName, dstSFT,</span>
<span class="source-line-no">715</span><span id="line-715"> ng.getNonceGroup(), ng.newNonce()),</span>
<span class="source-line-no">716</span><span id="line-716"> (s, c, req, done) -&gt; s.modifyTableStoreFileTracker(c, req, done),</span>
<span class="source-line-no">717</span><span id="line-717"> (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">718</span><span id="line-718"> new ModifyTableStoreFileTrackerProcedureBiConsumer(this, tableName));</span>
<span class="source-line-no">719</span><span id="line-719"> }</span>
<span class="source-line-no">720</span><span id="line-720"></span>
<span class="source-line-no">721</span><span id="line-721"> @Override</span>
<span class="source-line-no">722</span><span id="line-722"> public CompletableFuture&lt;Void&gt; deleteTable(TableName tableName) {</span>
<span class="source-line-no">723</span><span id="line-723"> return this.&lt;DeleteTableRequest, DeleteTableResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">724</span><span id="line-724"> RequestConverter.buildDeleteTableRequest(tableName, ng.getNonceGroup(), ng.newNonce()),</span>
<span class="source-line-no">725</span><span id="line-725"> (s, c, req, done) -&gt; s.deleteTable(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">726</span><span id="line-726"> new DeleteTableProcedureBiConsumer(tableName));</span>
<span class="source-line-no">727</span><span id="line-727"> }</span>
<span class="source-line-no">728</span><span id="line-728"></span>
<span class="source-line-no">729</span><span id="line-729"> @Override</span>
<span class="source-line-no">730</span><span id="line-730"> public CompletableFuture&lt;Void&gt; truncateTable(TableName tableName, boolean preserveSplits) {</span>
<span class="source-line-no">731</span><span id="line-731"> return this.&lt;TruncateTableRequest, TruncateTableResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">732</span><span id="line-732"> RequestConverter.buildTruncateTableRequest(tableName, preserveSplits, ng.getNonceGroup(),</span>
<span class="source-line-no">733</span><span id="line-733"> ng.newNonce()),</span>
<span class="source-line-no">734</span><span id="line-734"> (s, c, req, done) -&gt; s.truncateTable(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">735</span><span id="line-735"> new TruncateTableProcedureBiConsumer(tableName));</span>
<span class="source-line-no">736</span><span id="line-736"> }</span>
<span class="source-line-no">737</span><span id="line-737"></span>
<span class="source-line-no">738</span><span id="line-738"> @Override</span>
<span class="source-line-no">739</span><span id="line-739"> public CompletableFuture&lt;Void&gt; enableTable(TableName tableName) {</span>
<span class="source-line-no">740</span><span id="line-740"> return this.&lt;EnableTableRequest, EnableTableResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">741</span><span id="line-741"> RequestConverter.buildEnableTableRequest(tableName, ng.getNonceGroup(), ng.newNonce()),</span>
<span class="source-line-no">742</span><span id="line-742"> (s, c, req, done) -&gt; s.enableTable(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">743</span><span id="line-743"> new EnableTableProcedureBiConsumer(tableName));</span>
<span class="source-line-no">744</span><span id="line-744"> }</span>
<span class="source-line-no">745</span><span id="line-745"></span>
<span class="source-line-no">746</span><span id="line-746"> @Override</span>
<span class="source-line-no">747</span><span id="line-747"> public CompletableFuture&lt;Void&gt; disableTable(TableName tableName) {</span>
<span class="source-line-no">748</span><span id="line-748"> return this.&lt;DisableTableRequest, DisableTableResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">749</span><span id="line-749"> RequestConverter.buildDisableTableRequest(tableName, ng.getNonceGroup(), ng.newNonce()),</span>
<span class="source-line-no">750</span><span id="line-750"> (s, c, req, done) -&gt; s.disableTable(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">751</span><span id="line-751"> new DisableTableProcedureBiConsumer(tableName));</span>
<span class="source-line-no">752</span><span id="line-752"> }</span>
<span class="source-line-no">753</span><span id="line-753"></span>
<span class="source-line-no">754</span><span id="line-754"> /**</span>
<span class="source-line-no">755</span><span id="line-755"> * Utility for completing passed TableState {@link CompletableFuture} &lt;code&gt;future&lt;/code&gt; using</span>
<span class="source-line-no">756</span><span id="line-756"> * passed parameters. Sets error or boolean result ('true' if table matches the passed-in</span>
<span class="source-line-no">757</span><span id="line-757"> * targetState).</span>
<span class="source-line-no">758</span><span id="line-758"> */</span>
<span class="source-line-no">759</span><span id="line-759"> private static CompletableFuture&lt;Boolean&gt; completeCheckTableState(</span>
<span class="source-line-no">760</span><span id="line-760"> CompletableFuture&lt;Boolean&gt; future, TableState tableState, Throwable error,</span>
<span class="source-line-no">761</span><span id="line-761"> TableState.State targetState, TableName tableName) {</span>
<span class="source-line-no">762</span><span id="line-762"> if (error != null) {</span>
<span class="source-line-no">763</span><span id="line-763"> future.completeExceptionally(error);</span>
<span class="source-line-no">764</span><span id="line-764"> } else {</span>
<span class="source-line-no">765</span><span id="line-765"> if (tableState != null) {</span>
<span class="source-line-no">766</span><span id="line-766"> future.complete(tableState.inStates(targetState));</span>
<span class="source-line-no">767</span><span id="line-767"> } else {</span>
<span class="source-line-no">768</span><span id="line-768"> future.completeExceptionally(new TableNotFoundException(tableName));</span>
<span class="source-line-no">769</span><span id="line-769"> }</span>
<span class="source-line-no">770</span><span id="line-770"> }</span>
<span class="source-line-no">771</span><span id="line-771"> return future;</span>
<span class="source-line-no">772</span><span id="line-772"> }</span>
<span class="source-line-no">773</span><span id="line-773"></span>
<span class="source-line-no">774</span><span id="line-774"> @Override</span>
<span class="source-line-no">775</span><span id="line-775"> public CompletableFuture&lt;Boolean&gt; isTableEnabled(TableName tableName) {</span>
<span class="source-line-no">776</span><span id="line-776"> if (TableName.isMetaTableName(tableName)) {</span>
<span class="source-line-no">777</span><span id="line-777"> return CompletableFuture.completedFuture(true);</span>
<span class="source-line-no">778</span><span id="line-778"> }</span>
<span class="source-line-no">779</span><span id="line-779"> CompletableFuture&lt;Boolean&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">780</span><span id="line-780"> addListener(ClientMetaTableAccessor.getTableState(metaTable, tableName),</span>
<span class="source-line-no">781</span><span id="line-781"> (tableState, error) -&gt; {</span>
<span class="source-line-no">782</span><span id="line-782"> completeCheckTableState(future, tableState.isPresent() ? tableState.get() : null, error,</span>
<span class="source-line-no">783</span><span id="line-783"> TableState.State.ENABLED, tableName);</span>
<span class="source-line-no">784</span><span id="line-784"> });</span>
<span class="source-line-no">785</span><span id="line-785"> return future;</span>
<span class="source-line-no">786</span><span id="line-786"> }</span>
<span class="source-line-no">787</span><span id="line-787"></span>
<span class="source-line-no">788</span><span id="line-788"> @Override</span>
<span class="source-line-no">789</span><span id="line-789"> public CompletableFuture&lt;Boolean&gt; isTableDisabled(TableName tableName) {</span>
<span class="source-line-no">790</span><span id="line-790"> if (TableName.isMetaTableName(tableName)) {</span>
<span class="source-line-no">791</span><span id="line-791"> return CompletableFuture.completedFuture(false);</span>
<span class="source-line-no">792</span><span id="line-792"> }</span>
<span class="source-line-no">793</span><span id="line-793"> CompletableFuture&lt;Boolean&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">794</span><span id="line-794"> addListener(ClientMetaTableAccessor.getTableState(metaTable, tableName),</span>
<span class="source-line-no">795</span><span id="line-795"> (tableState, error) -&gt; {</span>
<span class="source-line-no">796</span><span id="line-796"> completeCheckTableState(future, tableState.isPresent() ? tableState.get() : null, error,</span>
<span class="source-line-no">797</span><span id="line-797"> TableState.State.DISABLED, tableName);</span>
<span class="source-line-no">798</span><span id="line-798"> });</span>
<span class="source-line-no">799</span><span id="line-799"> return future;</span>
<span class="source-line-no">800</span><span id="line-800"> }</span>
<span class="source-line-no">801</span><span id="line-801"></span>
<span class="source-line-no">802</span><span id="line-802"> @Override</span>
<span class="source-line-no">803</span><span id="line-803"> public CompletableFuture&lt;Boolean&gt; isTableAvailable(TableName tableName) {</span>
<span class="source-line-no">804</span><span id="line-804"> if (TableName.isMetaTableName(tableName)) {</span>
<span class="source-line-no">805</span><span id="line-805"> return connection.registry.getMetaRegionLocations().thenApply(locs -&gt; Stream</span>
<span class="source-line-no">806</span><span id="line-806"> .of(locs.getRegionLocations()).allMatch(loc -&gt; loc != null &amp;&amp; loc.getServerName() != null));</span>
<span class="source-line-no">807</span><span id="line-807"> }</span>
<span class="source-line-no">808</span><span id="line-808"> CompletableFuture&lt;Boolean&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">809</span><span id="line-809"> addListener(isTableEnabled(tableName), (enabled, error) -&gt; {</span>
<span class="source-line-no">810</span><span id="line-810"> if (error != null) {</span>
<span class="source-line-no">811</span><span id="line-811"> if (error instanceof TableNotFoundException) {</span>
<span class="source-line-no">812</span><span id="line-812"> future.complete(false);</span>
<span class="source-line-no">813</span><span id="line-813"> } else {</span>
<span class="source-line-no">814</span><span id="line-814"> future.completeExceptionally(error);</span>
<span class="source-line-no">815</span><span id="line-815"> }</span>
<span class="source-line-no">816</span><span id="line-816"> return;</span>
<span class="source-line-no">817</span><span id="line-817"> }</span>
<span class="source-line-no">818</span><span id="line-818"> if (!enabled) {</span>
<span class="source-line-no">819</span><span id="line-819"> future.complete(false);</span>
<span class="source-line-no">820</span><span id="line-820"> } else {</span>
<span class="source-line-no">821</span><span id="line-821"> addListener(ClientMetaTableAccessor.getTableHRegionLocations(metaTable, tableName),</span>
<span class="source-line-no">822</span><span id="line-822"> (locations, error1) -&gt; {</span>
<span class="source-line-no">823</span><span id="line-823"> if (error1 != null) {</span>
<span class="source-line-no">824</span><span id="line-824"> future.completeExceptionally(error1);</span>
<span class="source-line-no">825</span><span id="line-825"> return;</span>
<span class="source-line-no">826</span><span id="line-826"> }</span>
<span class="source-line-no">827</span><span id="line-827"> List&lt;HRegionLocation&gt; notDeployedRegions = locations.stream()</span>
<span class="source-line-no">828</span><span id="line-828"> .filter(loc -&gt; loc.getServerName() == null).collect(Collectors.toList());</span>
<span class="source-line-no">829</span><span id="line-829"> if (notDeployedRegions.size() &gt; 0) {</span>
<span class="source-line-no">830</span><span id="line-830"> if (LOG.isDebugEnabled()) {</span>
<span class="source-line-no">831</span><span id="line-831"> LOG.debug("Table " + tableName + " has " + notDeployedRegions.size() + " regions");</span>
<span class="source-line-no">832</span><span id="line-832"> }</span>
<span class="source-line-no">833</span><span id="line-833"> future.complete(false);</span>
<span class="source-line-no">834</span><span id="line-834"> return;</span>
<span class="source-line-no">835</span><span id="line-835"> }</span>
<span class="source-line-no">836</span><span id="line-836"> future.complete(true);</span>
<span class="source-line-no">837</span><span id="line-837"> });</span>
<span class="source-line-no">838</span><span id="line-838"> }</span>
<span class="source-line-no">839</span><span id="line-839"> });</span>
<span class="source-line-no">840</span><span id="line-840"> return future;</span>
<span class="source-line-no">841</span><span id="line-841"> }</span>
<span class="source-line-no">842</span><span id="line-842"></span>
<span class="source-line-no">843</span><span id="line-843"> @Override</span>
<span class="source-line-no">844</span><span id="line-844"> public CompletableFuture&lt;Void&gt; addColumnFamily(TableName tableName,</span>
<span class="source-line-no">845</span><span id="line-845"> ColumnFamilyDescriptor columnFamily) {</span>
<span class="source-line-no">846</span><span id="line-846"> return this.&lt;AddColumnRequest, AddColumnResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">847</span><span id="line-847"> RequestConverter.buildAddColumnRequest(tableName, columnFamily, ng.getNonceGroup(),</span>
<span class="source-line-no">848</span><span id="line-848"> ng.newNonce()),</span>
<span class="source-line-no">849</span><span id="line-849"> (s, c, req, done) -&gt; s.addColumn(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">850</span><span id="line-850"> new AddColumnFamilyProcedureBiConsumer(tableName));</span>
<span class="source-line-no">851</span><span id="line-851"> }</span>
<span class="source-line-no">852</span><span id="line-852"></span>
<span class="source-line-no">853</span><span id="line-853"> @Override</span>
<span class="source-line-no">854</span><span id="line-854"> public CompletableFuture&lt;Void&gt; deleteColumnFamily(TableName tableName, byte[] columnFamily) {</span>
<span class="source-line-no">855</span><span id="line-855"> return this.&lt;DeleteColumnRequest, DeleteColumnResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">856</span><span id="line-856"> RequestConverter.buildDeleteColumnRequest(tableName, columnFamily, ng.getNonceGroup(),</span>
<span class="source-line-no">857</span><span id="line-857"> ng.newNonce()),</span>
<span class="source-line-no">858</span><span id="line-858"> (s, c, req, done) -&gt; s.deleteColumn(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">859</span><span id="line-859"> new DeleteColumnFamilyProcedureBiConsumer(tableName));</span>
<span class="source-line-no">860</span><span id="line-860"> }</span>
<span class="source-line-no">861</span><span id="line-861"></span>
<span class="source-line-no">862</span><span id="line-862"> @Override</span>
<span class="source-line-no">863</span><span id="line-863"> public CompletableFuture&lt;Void&gt; modifyColumnFamily(TableName tableName,</span>
<span class="source-line-no">864</span><span id="line-864"> ColumnFamilyDescriptor columnFamily) {</span>
<span class="source-line-no">865</span><span id="line-865"> return this.&lt;ModifyColumnRequest, ModifyColumnResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">866</span><span id="line-866"> RequestConverter.buildModifyColumnRequest(tableName, columnFamily, ng.getNonceGroup(),</span>
<span class="source-line-no">867</span><span id="line-867"> ng.newNonce()),</span>
<span class="source-line-no">868</span><span id="line-868"> (s, c, req, done) -&gt; s.modifyColumn(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">869</span><span id="line-869"> new ModifyColumnFamilyProcedureBiConsumer(tableName));</span>
<span class="source-line-no">870</span><span id="line-870"> }</span>
<span class="source-line-no">871</span><span id="line-871"></span>
<span class="source-line-no">872</span><span id="line-872"> @Override</span>
<span class="source-line-no">873</span><span id="line-873"> public CompletableFuture&lt;Void&gt; modifyColumnFamilyStoreFileTracker(TableName tableName,</span>
<span class="source-line-no">874</span><span id="line-874"> byte[] family, String dstSFT) {</span>
<span class="source-line-no">875</span><span id="line-875"> return this.&lt;ModifyColumnStoreFileTrackerRequest,</span>
<span class="source-line-no">876</span><span id="line-876"> ModifyColumnStoreFileTrackerResponse&gt; procedureCall(tableName,</span>
<span class="source-line-no">877</span><span id="line-877"> RequestConverter.buildModifyColumnStoreFileTrackerRequest(tableName, family, dstSFT,</span>
<span class="source-line-no">878</span><span id="line-878"> ng.getNonceGroup(), ng.newNonce()),</span>
<span class="source-line-no">879</span><span id="line-879"> (s, c, req, done) -&gt; s.modifyColumnStoreFileTracker(c, req, done),</span>
<span class="source-line-no">880</span><span id="line-880"> (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">881</span><span id="line-881"> new ModifyColumnFamilyStoreFileTrackerProcedureBiConsumer(tableName));</span>
<span class="source-line-no">882</span><span id="line-882"> }</span>
<span class="source-line-no">883</span><span id="line-883"></span>
<span class="source-line-no">884</span><span id="line-884"> @Override</span>
<span class="source-line-no">885</span><span id="line-885"> public CompletableFuture&lt;Void&gt; createNamespace(NamespaceDescriptor descriptor) {</span>
<span class="source-line-no">886</span><span id="line-886"> return this.&lt;CreateNamespaceRequest, CreateNamespaceResponse&gt; procedureCall(</span>
<span class="source-line-no">887</span><span id="line-887"> RequestConverter.buildCreateNamespaceRequest(descriptor),</span>
<span class="source-line-no">888</span><span id="line-888"> (s, c, req, done) -&gt; s.createNamespace(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">889</span><span id="line-889"> new CreateNamespaceProcedureBiConsumer(descriptor.getName()));</span>
<span class="source-line-no">890</span><span id="line-890"> }</span>
<span class="source-line-no">891</span><span id="line-891"></span>
<span class="source-line-no">892</span><span id="line-892"> @Override</span>
<span class="source-line-no">893</span><span id="line-893"> public CompletableFuture&lt;Void&gt; modifyNamespace(NamespaceDescriptor descriptor) {</span>
<span class="source-line-no">894</span><span id="line-894"> return this.&lt;ModifyNamespaceRequest, ModifyNamespaceResponse&gt; procedureCall(</span>
<span class="source-line-no">895</span><span id="line-895"> RequestConverter.buildModifyNamespaceRequest(descriptor),</span>
<span class="source-line-no">896</span><span id="line-896"> (s, c, req, done) -&gt; s.modifyNamespace(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">897</span><span id="line-897"> new ModifyNamespaceProcedureBiConsumer(descriptor.getName()));</span>
<span class="source-line-no">898</span><span id="line-898"> }</span>
<span class="source-line-no">899</span><span id="line-899"></span>
<span class="source-line-no">900</span><span id="line-900"> @Override</span>
<span class="source-line-no">901</span><span id="line-901"> public CompletableFuture&lt;Void&gt; deleteNamespace(String name) {</span>
<span class="source-line-no">902</span><span id="line-902"> return this.&lt;DeleteNamespaceRequest, DeleteNamespaceResponse&gt; procedureCall(</span>
<span class="source-line-no">903</span><span id="line-903"> RequestConverter.buildDeleteNamespaceRequest(name),</span>
<span class="source-line-no">904</span><span id="line-904"> (s, c, req, done) -&gt; s.deleteNamespace(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">905</span><span id="line-905"> new DeleteNamespaceProcedureBiConsumer(name));</span>
<span class="source-line-no">906</span><span id="line-906"> }</span>
<span class="source-line-no">907</span><span id="line-907"></span>
<span class="source-line-no">908</span><span id="line-908"> @Override</span>
<span class="source-line-no">909</span><span id="line-909"> public CompletableFuture&lt;NamespaceDescriptor&gt; getNamespaceDescriptor(String name) {</span>
<span class="source-line-no">910</span><span id="line-910"> return this.&lt;NamespaceDescriptor&gt; newMasterCaller()</span>
<span class="source-line-no">911</span><span id="line-911"> .action((controller, stub) -&gt; this.&lt;GetNamespaceDescriptorRequest,</span>
<span class="source-line-no">912</span><span id="line-912"> GetNamespaceDescriptorResponse, NamespaceDescriptor&gt; call(controller, stub,</span>
<span class="source-line-no">913</span><span id="line-913"> RequestConverter.buildGetNamespaceDescriptorRequest(name),</span>
<span class="source-line-no">914</span><span id="line-914"> (s, c, req, done) -&gt; s.getNamespaceDescriptor(c, req, done),</span>
<span class="source-line-no">915</span><span id="line-915"> (resp) -&gt; ProtobufUtil.toNamespaceDescriptor(resp.getNamespaceDescriptor())))</span>
<span class="source-line-no">916</span><span id="line-916"> .call();</span>
<span class="source-line-no">917</span><span id="line-917"> }</span>
<span class="source-line-no">918</span><span id="line-918"></span>
<span class="source-line-no">919</span><span id="line-919"> @Override</span>
<span class="source-line-no">920</span><span id="line-920"> public CompletableFuture&lt;List&lt;String&gt;&gt; listNamespaces() {</span>
<span class="source-line-no">921</span><span id="line-921"> return this.&lt;List&lt;String&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">922</span><span id="line-922"> .action((controller, stub) -&gt; this.&lt;ListNamespacesRequest, ListNamespacesResponse,</span>
<span class="source-line-no">923</span><span id="line-923"> List&lt;String&gt;&gt; call(controller, stub, ListNamespacesRequest.newBuilder().build(),</span>
<span class="source-line-no">924</span><span id="line-924"> (s, c, req, done) -&gt; s.listNamespaces(c, req, done),</span>
<span class="source-line-no">925</span><span id="line-925"> (resp) -&gt; resp.getNamespaceNameList()))</span>
<span class="source-line-no">926</span><span id="line-926"> .call();</span>
<span class="source-line-no">927</span><span id="line-927"> }</span>
<span class="source-line-no">928</span><span id="line-928"></span>
<span class="source-line-no">929</span><span id="line-929"> @Override</span>
<span class="source-line-no">930</span><span id="line-930"> public CompletableFuture&lt;List&lt;NamespaceDescriptor&gt;&gt; listNamespaceDescriptors() {</span>
<span class="source-line-no">931</span><span id="line-931"> return this.&lt;List&lt;NamespaceDescriptor&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">932</span><span id="line-932"> .action((controller, stub) -&gt; this.&lt;ListNamespaceDescriptorsRequest,</span>
<span class="source-line-no">933</span><span id="line-933"> ListNamespaceDescriptorsResponse, List&lt;NamespaceDescriptor&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">934</span><span id="line-934"> ListNamespaceDescriptorsRequest.newBuilder().build(),</span>
<span class="source-line-no">935</span><span id="line-935"> (s, c, req, done) -&gt; s.listNamespaceDescriptors(c, req, done),</span>
<span class="source-line-no">936</span><span id="line-936"> (resp) -&gt; ProtobufUtil.toNamespaceDescriptorList(resp)))</span>
<span class="source-line-no">937</span><span id="line-937"> .call();</span>
<span class="source-line-no">938</span><span id="line-938"> }</span>
<span class="source-line-no">939</span><span id="line-939"></span>
<span class="source-line-no">940</span><span id="line-940"> @Override</span>
<span class="source-line-no">941</span><span id="line-941"> public CompletableFuture&lt;List&lt;RegionInfo&gt;&gt; getRegions(ServerName serverName) {</span>
<span class="source-line-no">942</span><span id="line-942"> return this.&lt;List&lt;RegionInfo&gt;&gt; newAdminCaller()</span>
<span class="source-line-no">943</span><span id="line-943"> .action((controller, stub) -&gt; this.&lt;GetOnlineRegionRequest, GetOnlineRegionResponse,</span>
<span class="source-line-no">944</span><span id="line-944"> List&lt;RegionInfo&gt;&gt; adminCall(controller, stub,</span>
<span class="source-line-no">945</span><span id="line-945"> RequestConverter.buildGetOnlineRegionRequest(),</span>
<span class="source-line-no">946</span><span id="line-946"> (s, c, req, done) -&gt; s.getOnlineRegion(c, req, done),</span>
<span class="source-line-no">947</span><span id="line-947"> resp -&gt; ProtobufUtil.getRegionInfos(resp)))</span>
<span class="source-line-no">948</span><span id="line-948"> .serverName(serverName).call();</span>
<span class="source-line-no">949</span><span id="line-949"> }</span>
<span class="source-line-no">950</span><span id="line-950"></span>
<span class="source-line-no">951</span><span id="line-951"> @Override</span>
<span class="source-line-no">952</span><span id="line-952"> public CompletableFuture&lt;List&lt;RegionInfo&gt;&gt; getRegions(TableName tableName) {</span>
<span class="source-line-no">953</span><span id="line-953"> if (tableName.equals(META_TABLE_NAME)) {</span>
<span class="source-line-no">954</span><span id="line-954"> return connection.registry.getMetaRegionLocations()</span>
<span class="source-line-no">955</span><span id="line-955"> .thenApply(locs -&gt; Stream.of(locs.getRegionLocations()).map(HRegionLocation::getRegion)</span>
<span class="source-line-no">956</span><span id="line-956"> .collect(Collectors.toList()));</span>
<span class="source-line-no">957</span><span id="line-957"> } else {</span>
<span class="source-line-no">958</span><span id="line-958"> return ClientMetaTableAccessor.getTableHRegionLocations(metaTable, tableName).thenApply(</span>
<span class="source-line-no">959</span><span id="line-959"> locs -&gt; locs.stream().map(HRegionLocation::getRegion).collect(Collectors.toList()));</span>
<span class="source-line-no">960</span><span id="line-960"> }</span>
<span class="source-line-no">961</span><span id="line-961"> }</span>
<span class="source-line-no">962</span><span id="line-962"></span>
<span class="source-line-no">963</span><span id="line-963"> @Override</span>
<span class="source-line-no">964</span><span id="line-964"> public CompletableFuture&lt;Void&gt; flush(TableName tableName) {</span>
<span class="source-line-no">965</span><span id="line-965"> return flush(tableName, Collections.emptyList());</span>
<span class="source-line-no">966</span><span id="line-966"> }</span>
<span class="source-line-no">967</span><span id="line-967"></span>
<span class="source-line-no">968</span><span id="line-968"> @Override</span>
<span class="source-line-no">969</span><span id="line-969"> public CompletableFuture&lt;Void&gt; flush(TableName tableName, byte[] columnFamily) {</span>
<span class="source-line-no">970</span><span id="line-970"> return flush(tableName, Collections.singletonList(columnFamily));</span>
<span class="source-line-no">971</span><span id="line-971"> }</span>
<span class="source-line-no">972</span><span id="line-972"></span>
<span class="source-line-no">973</span><span id="line-973"> @Override</span>
<span class="source-line-no">974</span><span id="line-974"> public CompletableFuture&lt;Void&gt; flush(TableName tableName, List&lt;byte[]&gt; columnFamilyList) {</span>
<span class="source-line-no">975</span><span id="line-975"> // This is for keeping compatibility with old implementation.</span>
<span class="source-line-no">976</span><span id="line-976"> // If the server version is lower than the client version, it's possible that the</span>
<span class="source-line-no">977</span><span id="line-977"> // flushTable method is not present in the server side, if so, we need to fall back</span>
<span class="source-line-no">978</span><span id="line-978"> // to the old implementation.</span>
<span class="source-line-no">979</span><span id="line-979"> List&lt;byte[]&gt; columnFamilies = columnFamilyList.stream()</span>
<span class="source-line-no">980</span><span id="line-980"> .filter(cf -&gt; cf != null &amp;&amp; cf.length &gt; 0).distinct().collect(Collectors.toList());</span>
<span class="source-line-no">981</span><span id="line-981"> FlushTableRequest request = RequestConverter.buildFlushTableRequest(tableName, columnFamilies,</span>
<span class="source-line-no">982</span><span id="line-982"> ng.getNonceGroup(), ng.newNonce());</span>
<span class="source-line-no">983</span><span id="line-983"> CompletableFuture&lt;Void&gt; procFuture = this.&lt;FlushTableRequest, FlushTableResponse&gt; procedureCall(</span>
<span class="source-line-no">984</span><span id="line-984"> tableName, request, (s, c, req, done) -&gt; s.flushTable(c, req, done),</span>
<span class="source-line-no">985</span><span id="line-985"> (resp) -&gt; resp.getProcId(), new FlushTableProcedureBiConsumer(tableName));</span>
<span class="source-line-no">986</span><span id="line-986"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">987</span><span id="line-987"> addListener(procFuture, (ret, error) -&gt; {</span>
<span class="source-line-no">988</span><span id="line-988"> if (error != null) {</span>
<span class="source-line-no">989</span><span id="line-989"> if (error instanceof TableNotFoundException || error instanceof TableNotEnabledException) {</span>
<span class="source-line-no">990</span><span id="line-990"> future.completeExceptionally(error);</span>
<span class="source-line-no">991</span><span id="line-991"> } else if (error instanceof DoNotRetryIOException) {</span>
<span class="source-line-no">992</span><span id="line-992"> // usually this is caused by the method is not present on the server or</span>
<span class="source-line-no">993</span><span id="line-993"> // the hbase hadoop version does not match the running hadoop version.</span>
<span class="source-line-no">994</span><span id="line-994"> // if that happens, we need fall back to the old flush implementation.</span>
<span class="source-line-no">995</span><span id="line-995"> LOG.info("Unrecoverable error in master side. Fallback to FlushTableProcedure V1", error);</span>
<span class="source-line-no">996</span><span id="line-996"> legacyFlush(future, tableName, columnFamilies);</span>
<span class="source-line-no">997</span><span id="line-997"> } else {</span>
<span class="source-line-no">998</span><span id="line-998"> future.completeExceptionally(error);</span>
<span class="source-line-no">999</span><span id="line-999"> }</span>
<span class="source-line-no">1000</span><span id="line-1000"> } else {</span>
<span class="source-line-no">1001</span><span id="line-1001"> future.complete(ret);</span>
<span class="source-line-no">1002</span><span id="line-1002"> }</span>
<span class="source-line-no">1003</span><span id="line-1003"> });</span>
<span class="source-line-no">1004</span><span id="line-1004"> return future;</span>
<span class="source-line-no">1005</span><span id="line-1005"> }</span>
<span class="source-line-no">1006</span><span id="line-1006"></span>
<span class="source-line-no">1007</span><span id="line-1007"> private void legacyFlush(CompletableFuture&lt;Void&gt; future, TableName tableName,</span>
<span class="source-line-no">1008</span><span id="line-1008"> List&lt;byte[]&gt; columnFamilies) {</span>
<span class="source-line-no">1009</span><span id="line-1009"> addListener(tableExists(tableName), (exists, err) -&gt; {</span>
<span class="source-line-no">1010</span><span id="line-1010"> if (err != null) {</span>
<span class="source-line-no">1011</span><span id="line-1011"> future.completeExceptionally(err);</span>
<span class="source-line-no">1012</span><span id="line-1012"> } else if (!exists) {</span>
<span class="source-line-no">1013</span><span id="line-1013"> future.completeExceptionally(new TableNotFoundException(tableName));</span>
<span class="source-line-no">1014</span><span id="line-1014"> } else {</span>
<span class="source-line-no">1015</span><span id="line-1015"> addListener(isTableEnabled(tableName), (tableEnabled, err2) -&gt; {</span>
<span class="source-line-no">1016</span><span id="line-1016"> if (err2 != null) {</span>
<span class="source-line-no">1017</span><span id="line-1017"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1018</span><span id="line-1018"> } else if (!tableEnabled) {</span>
<span class="source-line-no">1019</span><span id="line-1019"> future.completeExceptionally(new TableNotEnabledException(tableName));</span>
<span class="source-line-no">1020</span><span id="line-1020"> } else {</span>
<span class="source-line-no">1021</span><span id="line-1021"> Map&lt;String, String&gt; props = new HashMap&lt;&gt;();</span>
<span class="source-line-no">1022</span><span id="line-1022"> if (columnFamilies != null &amp;&amp; !columnFamilies.isEmpty()) {</span>
<span class="source-line-no">1023</span><span id="line-1023"> props.put(HConstants.FAMILY_KEY_STR, Strings.JOINER</span>
<span class="source-line-no">1024</span><span id="line-1024"> .join(columnFamilies.stream().map(Bytes::toString).collect(Collectors.toList())));</span>
<span class="source-line-no">1025</span><span id="line-1025"> }</span>
<span class="source-line-no">1026</span><span id="line-1026"> addListener(</span>
<span class="source-line-no">1027</span><span id="line-1027"> execProcedure(FLUSH_TABLE_PROCEDURE_SIGNATURE, tableName.getNameAsString(), props),</span>
<span class="source-line-no">1028</span><span id="line-1028"> (ret, err3) -&gt; {</span>
<span class="source-line-no">1029</span><span id="line-1029"> if (err3 != null) {</span>
<span class="source-line-no">1030</span><span id="line-1030"> future.completeExceptionally(err3);</span>
<span class="source-line-no">1031</span><span id="line-1031"> } else {</span>
<span class="source-line-no">1032</span><span id="line-1032"> future.complete(ret);</span>
<span class="source-line-no">1033</span><span id="line-1033"> }</span>
<span class="source-line-no">1034</span><span id="line-1034"> });</span>
<span class="source-line-no">1035</span><span id="line-1035"> }</span>
<span class="source-line-no">1036</span><span id="line-1036"> });</span>
<span class="source-line-no">1037</span><span id="line-1037"> }</span>
<span class="source-line-no">1038</span><span id="line-1038"> });</span>
<span class="source-line-no">1039</span><span id="line-1039"> }</span>
<span class="source-line-no">1040</span><span id="line-1040"></span>
<span class="source-line-no">1041</span><span id="line-1041"> @Override</span>
<span class="source-line-no">1042</span><span id="line-1042"> public CompletableFuture&lt;Void&gt; flushRegion(byte[] regionName) {</span>
<span class="source-line-no">1043</span><span id="line-1043"> return flushRegionInternal(regionName, null, false).thenAccept(r -&gt; {</span>
<span class="source-line-no">1044</span><span id="line-1044"> });</span>
<span class="source-line-no">1045</span><span id="line-1045"> }</span>
<span class="source-line-no">1046</span><span id="line-1046"></span>
<span class="source-line-no">1047</span><span id="line-1047"> @Override</span>
<span class="source-line-no">1048</span><span id="line-1048"> public CompletableFuture&lt;Void&gt; flushRegion(byte[] regionName, byte[] columnFamily) {</span>
<span class="source-line-no">1049</span><span id="line-1049"> Preconditions.checkNotNull(columnFamily, "columnFamily is null."</span>
<span class="source-line-no">1050</span><span id="line-1050"> + "If you don't specify a columnFamily, use flushRegion(regionName) instead");</span>
<span class="source-line-no">1051</span><span id="line-1051"> return flushRegionInternal(regionName, columnFamily, false).thenAccept(r -&gt; {</span>
<span class="source-line-no">1052</span><span id="line-1052"> });</span>
<span class="source-line-no">1053</span><span id="line-1053"> }</span>
<span class="source-line-no">1054</span><span id="line-1054"></span>
<span class="source-line-no">1055</span><span id="line-1055"> /**</span>
<span class="source-line-no">1056</span><span id="line-1056"> * This method is for internal use only, where we need the response of the flush.</span>
<span class="source-line-no">1057</span><span id="line-1057"> * &lt;p/&gt;</span>
<span class="source-line-no">1058</span><span id="line-1058"> * As it exposes the protobuf message, please do &lt;strong&gt;NOT&lt;/strong&gt; try to expose it as a public</span>
<span class="source-line-no">1059</span><span id="line-1059"> * API.</span>
<span class="source-line-no">1060</span><span id="line-1060"> */</span>
<span class="source-line-no">1061</span><span id="line-1061"> CompletableFuture&lt;FlushRegionResponse&gt; flushRegionInternal(byte[] regionName, byte[] columnFamily,</span>
<span class="source-line-no">1062</span><span id="line-1062"> boolean writeFlushWALMarker) {</span>
<span class="source-line-no">1063</span><span id="line-1063"> CompletableFuture&lt;FlushRegionResponse&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1064</span><span id="line-1064"> addListener(getRegionLocation(regionName), (location, err) -&gt; {</span>
<span class="source-line-no">1065</span><span id="line-1065"> if (err != null) {</span>
<span class="source-line-no">1066</span><span id="line-1066"> future.completeExceptionally(err);</span>
<span class="source-line-no">1067</span><span id="line-1067"> return;</span>
<span class="source-line-no">1068</span><span id="line-1068"> }</span>
<span class="source-line-no">1069</span><span id="line-1069"> ServerName serverName = location.getServerName();</span>
<span class="source-line-no">1070</span><span id="line-1070"> if (serverName == null) {</span>
<span class="source-line-no">1071</span><span id="line-1071"> future</span>
<span class="source-line-no">1072</span><span id="line-1072"> .completeExceptionally(new NoServerForRegionException(Bytes.toStringBinary(regionName)));</span>
<span class="source-line-no">1073</span><span id="line-1073"> return;</span>
<span class="source-line-no">1074</span><span id="line-1074"> }</span>
<span class="source-line-no">1075</span><span id="line-1075"> addListener(flush(serverName, location.getRegion(), columnFamily, writeFlushWALMarker),</span>
<span class="source-line-no">1076</span><span id="line-1076"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1077</span><span id="line-1077"> if (err2 != null) {</span>
<span class="source-line-no">1078</span><span id="line-1078"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1079</span><span id="line-1079"> } else {</span>
<span class="source-line-no">1080</span><span id="line-1080"> future.complete(ret);</span>
<span class="source-line-no">1081</span><span id="line-1081"> }</span>
<span class="source-line-no">1082</span><span id="line-1082"> });</span>
<span class="source-line-no">1083</span><span id="line-1083"> });</span>
<span class="source-line-no">1084</span><span id="line-1084"> return future;</span>
<span class="source-line-no">1085</span><span id="line-1085"> }</span>
<span class="source-line-no">1086</span><span id="line-1086"></span>
<span class="source-line-no">1087</span><span id="line-1087"> private CompletableFuture&lt;FlushRegionResponse&gt; flush(ServerName serverName, RegionInfo regionInfo,</span>
<span class="source-line-no">1088</span><span id="line-1088"> byte[] columnFamily, boolean writeFlushWALMarker) {</span>
<span class="source-line-no">1089</span><span id="line-1089"> return this.&lt;FlushRegionResponse&gt; newAdminCaller().serverName(serverName)</span>
<span class="source-line-no">1090</span><span id="line-1090"> .action((controller, stub) -&gt; this.&lt;FlushRegionRequest, FlushRegionResponse,</span>
<span class="source-line-no">1091</span><span id="line-1091"> FlushRegionResponse&gt; adminCall(controller, stub,</span>
<span class="source-line-no">1092</span><span id="line-1092"> RequestConverter.buildFlushRegionRequest(regionInfo.getRegionName(), columnFamily,</span>
<span class="source-line-no">1093</span><span id="line-1093"> writeFlushWALMarker),</span>
<span class="source-line-no">1094</span><span id="line-1094"> (s, c, req, done) -&gt; s.flushRegion(c, req, done), resp -&gt; resp))</span>
<span class="source-line-no">1095</span><span id="line-1095"> .call();</span>
<span class="source-line-no">1096</span><span id="line-1096"> }</span>
<span class="source-line-no">1097</span><span id="line-1097"></span>
<span class="source-line-no">1098</span><span id="line-1098"> @Override</span>
<span class="source-line-no">1099</span><span id="line-1099"> public CompletableFuture&lt;Void&gt; flushRegionServer(ServerName sn) {</span>
<span class="source-line-no">1100</span><span id="line-1100"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1101</span><span id="line-1101"> addListener(getRegions(sn), (hRegionInfos, err) -&gt; {</span>
<span class="source-line-no">1102</span><span id="line-1102"> if (err != null) {</span>
<span class="source-line-no">1103</span><span id="line-1103"> future.completeExceptionally(err);</span>
<span class="source-line-no">1104</span><span id="line-1104"> return;</span>
<span class="source-line-no">1105</span><span id="line-1105"> }</span>
<span class="source-line-no">1106</span><span id="line-1106"> List&lt;CompletableFuture&lt;Void&gt;&gt; compactFutures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">1107</span><span id="line-1107"> if (hRegionInfos != null) {</span>
<span class="source-line-no">1108</span><span id="line-1108"> hRegionInfos</span>
<span class="source-line-no">1109</span><span id="line-1109"> .forEach(region -&gt; compactFutures.add(flush(sn, region, null, false).thenAccept(r -&gt; {</span>
<span class="source-line-no">1110</span><span id="line-1110"> })));</span>
<span class="source-line-no">1111</span><span id="line-1111"> }</span>
<span class="source-line-no">1112</span><span id="line-1112"> addListener(CompletableFuture.allOf(</span>
<span class="source-line-no">1113</span><span id="line-1113"> compactFutures.toArray(new CompletableFuture&lt;?&gt;[compactFutures.size()])), (ret, err2) -&gt; {</span>
<span class="source-line-no">1114</span><span id="line-1114"> if (err2 != null) {</span>
<span class="source-line-no">1115</span><span id="line-1115"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1116</span><span id="line-1116"> } else {</span>
<span class="source-line-no">1117</span><span id="line-1117"> future.complete(ret);</span>
<span class="source-line-no">1118</span><span id="line-1118"> }</span>
<span class="source-line-no">1119</span><span id="line-1119"> });</span>
<span class="source-line-no">1120</span><span id="line-1120"> });</span>
<span class="source-line-no">1121</span><span id="line-1121"> return future;</span>
<span class="source-line-no">1122</span><span id="line-1122"> }</span>
<span class="source-line-no">1123</span><span id="line-1123"></span>
<span class="source-line-no">1124</span><span id="line-1124"> @Override</span>
<span class="source-line-no">1125</span><span id="line-1125"> public CompletableFuture&lt;Void&gt; compact(TableName tableName, CompactType compactType) {</span>
<span class="source-line-no">1126</span><span id="line-1126"> return compact(tableName, null, false, compactType);</span>
<span class="source-line-no">1127</span><span id="line-1127"> }</span>
<span class="source-line-no">1128</span><span id="line-1128"></span>
<span class="source-line-no">1129</span><span id="line-1129"> @Override</span>
<span class="source-line-no">1130</span><span id="line-1130"> public CompletableFuture&lt;Void&gt; compact(TableName tableName, byte[] columnFamily,</span>
<span class="source-line-no">1131</span><span id="line-1131"> CompactType compactType) {</span>
<span class="source-line-no">1132</span><span id="line-1132"> Preconditions.checkNotNull(columnFamily, "columnFamily is null. "</span>
<span class="source-line-no">1133</span><span id="line-1133"> + "If you don't specify a columnFamily, use compact(TableName) instead");</span>
<span class="source-line-no">1134</span><span id="line-1134"> return compact(tableName, columnFamily, false, compactType);</span>
<span class="source-line-no">1135</span><span id="line-1135"> }</span>
<span class="source-line-no">1136</span><span id="line-1136"></span>
<span class="source-line-no">1137</span><span id="line-1137"> @Override</span>
<span class="source-line-no">1138</span><span id="line-1138"> public CompletableFuture&lt;Void&gt; compactRegion(byte[] regionName) {</span>
<span class="source-line-no">1139</span><span id="line-1139"> return compactRegion(regionName, null, false);</span>
<span class="source-line-no">1140</span><span id="line-1140"> }</span>
<span class="source-line-no">1141</span><span id="line-1141"></span>
<span class="source-line-no">1142</span><span id="line-1142"> @Override</span>
<span class="source-line-no">1143</span><span id="line-1143"> public CompletableFuture&lt;Void&gt; compactRegion(byte[] regionName, byte[] columnFamily) {</span>
<span class="source-line-no">1144</span><span id="line-1144"> Preconditions.checkNotNull(columnFamily, "columnFamily is null."</span>
<span class="source-line-no">1145</span><span id="line-1145"> + " If you don't specify a columnFamily, use compactRegion(regionName) instead");</span>
<span class="source-line-no">1146</span><span id="line-1146"> return compactRegion(regionName, columnFamily, false);</span>
<span class="source-line-no">1147</span><span id="line-1147"> }</span>
<span class="source-line-no">1148</span><span id="line-1148"></span>
<span class="source-line-no">1149</span><span id="line-1149"> @Override</span>
<span class="source-line-no">1150</span><span id="line-1150"> public CompletableFuture&lt;Void&gt; majorCompact(TableName tableName, CompactType compactType) {</span>
<span class="source-line-no">1151</span><span id="line-1151"> return compact(tableName, null, true, compactType);</span>
<span class="source-line-no">1152</span><span id="line-1152"> }</span>
<span class="source-line-no">1153</span><span id="line-1153"></span>
<span class="source-line-no">1154</span><span id="line-1154"> @Override</span>
<span class="source-line-no">1155</span><span id="line-1155"> public CompletableFuture&lt;Void&gt; majorCompact(TableName tableName, byte[] columnFamily,</span>
<span class="source-line-no">1156</span><span id="line-1156"> CompactType compactType) {</span>
<span class="source-line-no">1157</span><span id="line-1157"> Preconditions.checkNotNull(columnFamily, "columnFamily is null."</span>
<span class="source-line-no">1158</span><span id="line-1158"> + "If you don't specify a columnFamily, use compact(TableName) instead");</span>
<span class="source-line-no">1159</span><span id="line-1159"> return compact(tableName, columnFamily, true, compactType);</span>
<span class="source-line-no">1160</span><span id="line-1160"> }</span>
<span class="source-line-no">1161</span><span id="line-1161"></span>
<span class="source-line-no">1162</span><span id="line-1162"> @Override</span>
<span class="source-line-no">1163</span><span id="line-1163"> public CompletableFuture&lt;Void&gt; majorCompactRegion(byte[] regionName) {</span>
<span class="source-line-no">1164</span><span id="line-1164"> return compactRegion(regionName, null, true);</span>
<span class="source-line-no">1165</span><span id="line-1165"> }</span>
<span class="source-line-no">1166</span><span id="line-1166"></span>
<span class="source-line-no">1167</span><span id="line-1167"> @Override</span>
<span class="source-line-no">1168</span><span id="line-1168"> public CompletableFuture&lt;Void&gt; majorCompactRegion(byte[] regionName, byte[] columnFamily) {</span>
<span class="source-line-no">1169</span><span id="line-1169"> Preconditions.checkNotNull(columnFamily, "columnFamily is null."</span>
<span class="source-line-no">1170</span><span id="line-1170"> + " If you don't specify a columnFamily, use majorCompactRegion(regionName) instead");</span>
<span class="source-line-no">1171</span><span id="line-1171"> return compactRegion(regionName, columnFamily, true);</span>
<span class="source-line-no">1172</span><span id="line-1172"> }</span>
<span class="source-line-no">1173</span><span id="line-1173"></span>
<span class="source-line-no">1174</span><span id="line-1174"> @Override</span>
<span class="source-line-no">1175</span><span id="line-1175"> public CompletableFuture&lt;Void&gt; compactRegionServer(ServerName sn) {</span>
<span class="source-line-no">1176</span><span id="line-1176"> return compactRegionServer(sn, false);</span>
<span class="source-line-no">1177</span><span id="line-1177"> }</span>
<span class="source-line-no">1178</span><span id="line-1178"></span>
<span class="source-line-no">1179</span><span id="line-1179"> @Override</span>
<span class="source-line-no">1180</span><span id="line-1180"> public CompletableFuture&lt;Void&gt; majorCompactRegionServer(ServerName sn) {</span>
<span class="source-line-no">1181</span><span id="line-1181"> return compactRegionServer(sn, true);</span>
<span class="source-line-no">1182</span><span id="line-1182"> }</span>
<span class="source-line-no">1183</span><span id="line-1183"></span>
<span class="source-line-no">1184</span><span id="line-1184"> private CompletableFuture&lt;Void&gt; compactRegionServer(ServerName sn, boolean major) {</span>
<span class="source-line-no">1185</span><span id="line-1185"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1186</span><span id="line-1186"> addListener(getRegions(sn), (hRegionInfos, err) -&gt; {</span>
<span class="source-line-no">1187</span><span id="line-1187"> if (err != null) {</span>
<span class="source-line-no">1188</span><span id="line-1188"> future.completeExceptionally(err);</span>
<span class="source-line-no">1189</span><span id="line-1189"> return;</span>
<span class="source-line-no">1190</span><span id="line-1190"> }</span>
<span class="source-line-no">1191</span><span id="line-1191"> List&lt;CompletableFuture&lt;Void&gt;&gt; compactFutures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">1192</span><span id="line-1192"> if (hRegionInfos != null) {</span>
<span class="source-line-no">1193</span><span id="line-1193"> hRegionInfos.forEach(region -&gt; compactFutures.add(compact(sn, region, major, null)));</span>
<span class="source-line-no">1194</span><span id="line-1194"> }</span>
<span class="source-line-no">1195</span><span id="line-1195"> addListener(CompletableFuture.allOf(</span>
<span class="source-line-no">1196</span><span id="line-1196"> compactFutures.toArray(new CompletableFuture&lt;?&gt;[compactFutures.size()])), (ret, err2) -&gt; {</span>
<span class="source-line-no">1197</span><span id="line-1197"> if (err2 != null) {</span>
<span class="source-line-no">1198</span><span id="line-1198"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1199</span><span id="line-1199"> } else {</span>
<span class="source-line-no">1200</span><span id="line-1200"> future.complete(ret);</span>
<span class="source-line-no">1201</span><span id="line-1201"> }</span>
<span class="source-line-no">1202</span><span id="line-1202"> });</span>
<span class="source-line-no">1203</span><span id="line-1203"> });</span>
<span class="source-line-no">1204</span><span id="line-1204"> return future;</span>
<span class="source-line-no">1205</span><span id="line-1205"> }</span>
<span class="source-line-no">1206</span><span id="line-1206"></span>
<span class="source-line-no">1207</span><span id="line-1207"> private CompletableFuture&lt;Void&gt; compactRegion(byte[] regionName, byte[] columnFamily,</span>
<span class="source-line-no">1208</span><span id="line-1208"> boolean major) {</span>
<span class="source-line-no">1209</span><span id="line-1209"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1210</span><span id="line-1210"> addListener(getRegionLocation(regionName), (location, err) -&gt; {</span>
<span class="source-line-no">1211</span><span id="line-1211"> if (err != null) {</span>
<span class="source-line-no">1212</span><span id="line-1212"> future.completeExceptionally(err);</span>
<span class="source-line-no">1213</span><span id="line-1213"> return;</span>
<span class="source-line-no">1214</span><span id="line-1214"> }</span>
<span class="source-line-no">1215</span><span id="line-1215"> ServerName serverName = location.getServerName();</span>
<span class="source-line-no">1216</span><span id="line-1216"> if (serverName == null) {</span>
<span class="source-line-no">1217</span><span id="line-1217"> future</span>
<span class="source-line-no">1218</span><span id="line-1218"> .completeExceptionally(new NoServerForRegionException(Bytes.toStringBinary(regionName)));</span>
<span class="source-line-no">1219</span><span id="line-1219"> return;</span>
<span class="source-line-no">1220</span><span id="line-1220"> }</span>
<span class="source-line-no">1221</span><span id="line-1221"> addListener(compact(location.getServerName(), location.getRegion(), major, columnFamily),</span>
<span class="source-line-no">1222</span><span id="line-1222"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1223</span><span id="line-1223"> if (err2 != null) {</span>
<span class="source-line-no">1224</span><span id="line-1224"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1225</span><span id="line-1225"> } else {</span>
<span class="source-line-no">1226</span><span id="line-1226"> future.complete(ret);</span>
<span class="source-line-no">1227</span><span id="line-1227"> }</span>
<span class="source-line-no">1228</span><span id="line-1228"> });</span>
<span class="source-line-no">1229</span><span id="line-1229"> });</span>
<span class="source-line-no">1230</span><span id="line-1230"> return future;</span>
<span class="source-line-no">1231</span><span id="line-1231"> }</span>
<span class="source-line-no">1232</span><span id="line-1232"></span>
<span class="source-line-no">1233</span><span id="line-1233"> /**</span>
<span class="source-line-no">1234</span><span id="line-1234"> * List all region locations for the specific table.</span>
<span class="source-line-no">1235</span><span id="line-1235"> */</span>
<span class="source-line-no">1236</span><span id="line-1236"> private CompletableFuture&lt;List&lt;HRegionLocation&gt;&gt; getTableHRegionLocations(TableName tableName) {</span>
<span class="source-line-no">1237</span><span id="line-1237"> if (TableName.META_TABLE_NAME.equals(tableName)) {</span>
<span class="source-line-no">1238</span><span id="line-1238"> CompletableFuture&lt;List&lt;HRegionLocation&gt;&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1239</span><span id="line-1239"> addListener(connection.registry.getMetaRegionLocations(), (metaRegions, err) -&gt; {</span>
<span class="source-line-no">1240</span><span id="line-1240"> if (err != null) {</span>
<span class="source-line-no">1241</span><span id="line-1241"> future.completeExceptionally(err);</span>
<span class="source-line-no">1242</span><span id="line-1242"> } else if (</span>
<span class="source-line-no">1243</span><span id="line-1243"> metaRegions == null || metaRegions.isEmpty()</span>
<span class="source-line-no">1244</span><span id="line-1244"> || metaRegions.getDefaultRegionLocation() == null</span>
<span class="source-line-no">1245</span><span id="line-1245"> ) {</span>
<span class="source-line-no">1246</span><span id="line-1246"> future.completeExceptionally(new IOException("meta region does not found"));</span>
<span class="source-line-no">1247</span><span id="line-1247"> } else {</span>
<span class="source-line-no">1248</span><span id="line-1248"> future.complete(Collections.singletonList(metaRegions.getDefaultRegionLocation()));</span>
<span class="source-line-no">1249</span><span id="line-1249"> }</span>
<span class="source-line-no">1250</span><span id="line-1250"> });</span>
<span class="source-line-no">1251</span><span id="line-1251"> return future;</span>
<span class="source-line-no">1252</span><span id="line-1252"> } else {</span>
<span class="source-line-no">1253</span><span id="line-1253"> // For non-meta table, we fetch all locations by scanning hbase:meta table</span>
<span class="source-line-no">1254</span><span id="line-1254"> return ClientMetaTableAccessor.getTableHRegionLocations(metaTable, tableName);</span>
<span class="source-line-no">1255</span><span id="line-1255"> }</span>
<span class="source-line-no">1256</span><span id="line-1256"> }</span>
<span class="source-line-no">1257</span><span id="line-1257"></span>
<span class="source-line-no">1258</span><span id="line-1258"> /**</span>
<span class="source-line-no">1259</span><span id="line-1259"> * Compact column family of a table, Asynchronous operation even if CompletableFuture.get()</span>
<span class="source-line-no">1260</span><span id="line-1260"> */</span>
<span class="source-line-no">1261</span><span id="line-1261"> private CompletableFuture&lt;Void&gt; compact(TableName tableName, byte[] columnFamily, boolean major,</span>
<span class="source-line-no">1262</span><span id="line-1262"> CompactType compactType) {</span>
<span class="source-line-no">1263</span><span id="line-1263"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1264</span><span id="line-1264"></span>
<span class="source-line-no">1265</span><span id="line-1265"> switch (compactType) {</span>
<span class="source-line-no">1266</span><span id="line-1266"> case MOB:</span>
<span class="source-line-no">1267</span><span id="line-1267"> addListener(connection.registry.getActiveMaster(), (serverName, err) -&gt; {</span>
<span class="source-line-no">1268</span><span id="line-1268"> if (err != null) {</span>
<span class="source-line-no">1269</span><span id="line-1269"> future.completeExceptionally(err);</span>
<span class="source-line-no">1270</span><span id="line-1270"> return;</span>
<span class="source-line-no">1271</span><span id="line-1271"> }</span>
<span class="source-line-no">1272</span><span id="line-1272"> RegionInfo regionInfo = RegionInfo.createMobRegionInfo(tableName);</span>
<span class="source-line-no">1273</span><span id="line-1273"> addListener(compact(serverName, regionInfo, major, columnFamily), (ret, err2) -&gt; {</span>
<span class="source-line-no">1274</span><span id="line-1274"> if (err2 != null) {</span>
<span class="source-line-no">1275</span><span id="line-1275"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1276</span><span id="line-1276"> } else {</span>
<span class="source-line-no">1277</span><span id="line-1277"> future.complete(ret);</span>
<span class="source-line-no">1278</span><span id="line-1278"> }</span>
<span class="source-line-no">1279</span><span id="line-1279"> });</span>
<span class="source-line-no">1280</span><span id="line-1280"> });</span>
<span class="source-line-no">1281</span><span id="line-1281"> break;</span>
<span class="source-line-no">1282</span><span id="line-1282"> case NORMAL:</span>
<span class="source-line-no">1283</span><span id="line-1283"> addListener(getTableHRegionLocations(tableName), (locations, err) -&gt; {</span>
<span class="source-line-no">1284</span><span id="line-1284"> if (err != null) {</span>
<span class="source-line-no">1285</span><span id="line-1285"> future.completeExceptionally(err);</span>
<span class="source-line-no">1286</span><span id="line-1286"> return;</span>
<span class="source-line-no">1287</span><span id="line-1287"> }</span>
<span class="source-line-no">1288</span><span id="line-1288"> if (locations == null || locations.isEmpty()) {</span>
<span class="source-line-no">1289</span><span id="line-1289"> future.completeExceptionally(new TableNotFoundException(tableName));</span>
<span class="source-line-no">1290</span><span id="line-1290"> }</span>
<span class="source-line-no">1291</span><span id="line-1291"> CompletableFuture&lt;?&gt;[] compactFutures =</span>
<span class="source-line-no">1292</span><span id="line-1292"> locations.stream().filter(l -&gt; l.getRegion() != null)</span>
<span class="source-line-no">1293</span><span id="line-1293"> .filter(l -&gt; !l.getRegion().isOffline()).filter(l -&gt; l.getServerName() != null)</span>
<span class="source-line-no">1294</span><span id="line-1294"> .map(l -&gt; compact(l.getServerName(), l.getRegion(), major, columnFamily))</span>
<span class="source-line-no">1295</span><span id="line-1295"> .toArray(CompletableFuture&lt;?&gt;[]::new);</span>
<span class="source-line-no">1296</span><span id="line-1296"> // future complete unless all of the compact futures are completed.</span>
<span class="source-line-no">1297</span><span id="line-1297"> addListener(CompletableFuture.allOf(compactFutures), (ret, err2) -&gt; {</span>
<span class="source-line-no">1298</span><span id="line-1298"> if (err2 != null) {</span>
<span class="source-line-no">1299</span><span id="line-1299"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1300</span><span id="line-1300"> } else {</span>
<span class="source-line-no">1301</span><span id="line-1301"> future.complete(ret);</span>
<span class="source-line-no">1302</span><span id="line-1302"> }</span>
<span class="source-line-no">1303</span><span id="line-1303"> });</span>
<span class="source-line-no">1304</span><span id="line-1304"> });</span>
<span class="source-line-no">1305</span><span id="line-1305"> break;</span>
<span class="source-line-no">1306</span><span id="line-1306"> default:</span>
<span class="source-line-no">1307</span><span id="line-1307"> throw new IllegalArgumentException("Unknown compactType: " + compactType);</span>
<span class="source-line-no">1308</span><span id="line-1308"> }</span>
<span class="source-line-no">1309</span><span id="line-1309"> return future;</span>
<span class="source-line-no">1310</span><span id="line-1310"> }</span>
<span class="source-line-no">1311</span><span id="line-1311"></span>
<span class="source-line-no">1312</span><span id="line-1312"> /**</span>
<span class="source-line-no">1313</span><span id="line-1313"> * Compact the region at specific region server.</span>
<span class="source-line-no">1314</span><span id="line-1314"> */</span>
<span class="source-line-no">1315</span><span id="line-1315"> private CompletableFuture&lt;Void&gt; compact(final ServerName sn, final RegionInfo hri,</span>
<span class="source-line-no">1316</span><span id="line-1316"> final boolean major, byte[] columnFamily) {</span>
<span class="source-line-no">1317</span><span id="line-1317"> return this.&lt;Void&gt; newAdminCaller().serverName(sn)</span>
<span class="source-line-no">1318</span><span id="line-1318"> .action((controller, stub) -&gt; this.&lt;CompactRegionRequest, CompactRegionResponse,</span>
<span class="source-line-no">1319</span><span id="line-1319"> Void&gt; adminCall(controller, stub,</span>
<span class="source-line-no">1320</span><span id="line-1320"> RequestConverter.buildCompactRegionRequest(hri.getRegionName(), major, columnFamily),</span>
<span class="source-line-no">1321</span><span id="line-1321"> (s, c, req, done) -&gt; s.compactRegion(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">1322</span><span id="line-1322"> .call();</span>
<span class="source-line-no">1323</span><span id="line-1323"> }</span>
<span class="source-line-no">1324</span><span id="line-1324"></span>
<span class="source-line-no">1325</span><span id="line-1325"> private byte[] toEncodeRegionName(byte[] regionName) {</span>
<span class="source-line-no">1326</span><span id="line-1326"> return RegionInfo.isEncodedRegionName(regionName)</span>
<span class="source-line-no">1327</span><span id="line-1327"> ? regionName</span>
<span class="source-line-no">1328</span><span id="line-1328"> : Bytes.toBytes(RegionInfo.encodeRegionName(regionName));</span>
<span class="source-line-no">1329</span><span id="line-1329"> }</span>
<span class="source-line-no">1330</span><span id="line-1330"></span>
<span class="source-line-no">1331</span><span id="line-1331"> private void checkAndGetTableName(byte[] encodeRegionName, AtomicReference&lt;TableName&gt; tableName,</span>
<span class="source-line-no">1332</span><span id="line-1332"> CompletableFuture&lt;TableName&gt; result) {</span>
<span class="source-line-no">1333</span><span id="line-1333"> addListener(getRegionLocation(encodeRegionName), (location, err) -&gt; {</span>
<span class="source-line-no">1334</span><span id="line-1334"> if (err != null) {</span>
<span class="source-line-no">1335</span><span id="line-1335"> result.completeExceptionally(err);</span>
<span class="source-line-no">1336</span><span id="line-1336"> return;</span>
<span class="source-line-no">1337</span><span id="line-1337"> }</span>
<span class="source-line-no">1338</span><span id="line-1338"> RegionInfo regionInfo = location.getRegion();</span>
<span class="source-line-no">1339</span><span id="line-1339"> if (regionInfo.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) {</span>
<span class="source-line-no">1340</span><span id="line-1340"> result.completeExceptionally(</span>
<span class="source-line-no">1341</span><span id="line-1341"> new IllegalArgumentException("Can't invoke merge on non-default regions directly"));</span>
<span class="source-line-no">1342</span><span id="line-1342"> return;</span>
<span class="source-line-no">1343</span><span id="line-1343"> }</span>
<span class="source-line-no">1344</span><span id="line-1344"> if (!tableName.compareAndSet(null, regionInfo.getTable())) {</span>
<span class="source-line-no">1345</span><span id="line-1345"> if (!tableName.get().equals(regionInfo.getTable())) {</span>
<span class="source-line-no">1346</span><span id="line-1346"> // tables of this two region should be same.</span>
<span class="source-line-no">1347</span><span id="line-1347"> result.completeExceptionally(</span>
<span class="source-line-no">1348</span><span id="line-1348"> new IllegalArgumentException("Cannot merge regions from two different tables "</span>
<span class="source-line-no">1349</span><span id="line-1349"> + tableName.get() + " and " + regionInfo.getTable()));</span>
<span class="source-line-no">1350</span><span id="line-1350"> } else {</span>
<span class="source-line-no">1351</span><span id="line-1351"> result.complete(tableName.get());</span>
<span class="source-line-no">1352</span><span id="line-1352"> }</span>
<span class="source-line-no">1353</span><span id="line-1353"> }</span>
<span class="source-line-no">1354</span><span id="line-1354"> });</span>
<span class="source-line-no">1355</span><span id="line-1355"> }</span>
<span class="source-line-no">1356</span><span id="line-1356"></span>
<span class="source-line-no">1357</span><span id="line-1357"> private CompletableFuture&lt;TableName&gt; checkRegionsAndGetTableName(byte[][] encodedRegionNames) {</span>
<span class="source-line-no">1358</span><span id="line-1358"> AtomicReference&lt;TableName&gt; tableNameRef = new AtomicReference&lt;&gt;();</span>
<span class="source-line-no">1359</span><span id="line-1359"> CompletableFuture&lt;TableName&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1360</span><span id="line-1360"> for (byte[] encodedRegionName : encodedRegionNames) {</span>
<span class="source-line-no">1361</span><span id="line-1361"> checkAndGetTableName(encodedRegionName, tableNameRef, future);</span>
<span class="source-line-no">1362</span><span id="line-1362"> }</span>
<span class="source-line-no">1363</span><span id="line-1363"> return future;</span>
<span class="source-line-no">1364</span><span id="line-1364"> }</span>
<span class="source-line-no">1365</span><span id="line-1365"></span>
<span class="source-line-no">1366</span><span id="line-1366"> @Override</span>
<span class="source-line-no">1367</span><span id="line-1367"> public CompletableFuture&lt;Boolean&gt; mergeSwitch(boolean enabled, boolean drainMerges) {</span>
<span class="source-line-no">1368</span><span id="line-1368"> return setSplitOrMergeOn(enabled, drainMerges, MasterSwitchType.MERGE);</span>
<span class="source-line-no">1369</span><span id="line-1369"> }</span>
<span class="source-line-no">1370</span><span id="line-1370"></span>
<span class="source-line-no">1371</span><span id="line-1371"> @Override</span>
<span class="source-line-no">1372</span><span id="line-1372"> public CompletableFuture&lt;Boolean&gt; isMergeEnabled() {</span>
<span class="source-line-no">1373</span><span id="line-1373"> return isSplitOrMergeOn(MasterSwitchType.MERGE);</span>
<span class="source-line-no">1374</span><span id="line-1374"> }</span>
<span class="source-line-no">1375</span><span id="line-1375"></span>
<span class="source-line-no">1376</span><span id="line-1376"> @Override</span>
<span class="source-line-no">1377</span><span id="line-1377"> public CompletableFuture&lt;Boolean&gt; splitSwitch(boolean enabled, boolean drainSplits) {</span>
<span class="source-line-no">1378</span><span id="line-1378"> return setSplitOrMergeOn(enabled, drainSplits, MasterSwitchType.SPLIT);</span>
<span class="source-line-no">1379</span><span id="line-1379"> }</span>
<span class="source-line-no">1380</span><span id="line-1380"></span>
<span class="source-line-no">1381</span><span id="line-1381"> @Override</span>
<span class="source-line-no">1382</span><span id="line-1382"> public CompletableFuture&lt;Boolean&gt; isSplitEnabled() {</span>
<span class="source-line-no">1383</span><span id="line-1383"> return isSplitOrMergeOn(MasterSwitchType.SPLIT);</span>
<span class="source-line-no">1384</span><span id="line-1384"> }</span>
<span class="source-line-no">1385</span><span id="line-1385"></span>
<span class="source-line-no">1386</span><span id="line-1386"> private CompletableFuture&lt;Boolean&gt; setSplitOrMergeOn(boolean enabled, boolean synchronous,</span>
<span class="source-line-no">1387</span><span id="line-1387"> MasterSwitchType switchType) {</span>
<span class="source-line-no">1388</span><span id="line-1388"> SetSplitOrMergeEnabledRequest request =</span>
<span class="source-line-no">1389</span><span id="line-1389"> RequestConverter.buildSetSplitOrMergeEnabledRequest(enabled, synchronous, switchType);</span>
<span class="source-line-no">1390</span><span id="line-1390"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">1391</span><span id="line-1391"> .action((controller, stub) -&gt; this.&lt;SetSplitOrMergeEnabledRequest,</span>
<span class="source-line-no">1392</span><span id="line-1392"> SetSplitOrMergeEnabledResponse, Boolean&gt; call(controller, stub, request,</span>
<span class="source-line-no">1393</span><span id="line-1393"> (s, c, req, done) -&gt; s.setSplitOrMergeEnabled(c, req, done),</span>
<span class="source-line-no">1394</span><span id="line-1394"> (resp) -&gt; resp.getPrevValueList().get(0)))</span>
<span class="source-line-no">1395</span><span id="line-1395"> .call();</span>
<span class="source-line-no">1396</span><span id="line-1396"> }</span>
<span class="source-line-no">1397</span><span id="line-1397"></span>
<span class="source-line-no">1398</span><span id="line-1398"> private CompletableFuture&lt;Boolean&gt; isSplitOrMergeOn(MasterSwitchType switchType) {</span>
<span class="source-line-no">1399</span><span id="line-1399"> IsSplitOrMergeEnabledRequest request =</span>
<span class="source-line-no">1400</span><span id="line-1400"> RequestConverter.buildIsSplitOrMergeEnabledRequest(switchType);</span>
<span class="source-line-no">1401</span><span id="line-1401"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">1402</span><span id="line-1402"> .action((controller, stub) -&gt; this.&lt;IsSplitOrMergeEnabledRequest,</span>
<span class="source-line-no">1403</span><span id="line-1403"> IsSplitOrMergeEnabledResponse, Boolean&gt; call(controller, stub, request,</span>
<span class="source-line-no">1404</span><span id="line-1404"> (s, c, req, done) -&gt; s.isSplitOrMergeEnabled(c, req, done), (resp) -&gt; resp.getEnabled()))</span>
<span class="source-line-no">1405</span><span id="line-1405"> .call();</span>
<span class="source-line-no">1406</span><span id="line-1406"> }</span>
<span class="source-line-no">1407</span><span id="line-1407"></span>
<span class="source-line-no">1408</span><span id="line-1408"> @Override</span>
<span class="source-line-no">1409</span><span id="line-1409"> public CompletableFuture&lt;Void&gt; mergeRegions(List&lt;byte[]&gt; nameOfRegionsToMerge, boolean forcible) {</span>
<span class="source-line-no">1410</span><span id="line-1410"> if (nameOfRegionsToMerge.size() &lt; 2) {</span>
<span class="source-line-no">1411</span><span id="line-1411"> return failedFuture(new IllegalArgumentException(</span>
<span class="source-line-no">1412</span><span id="line-1412"> "Can not merge only " + nameOfRegionsToMerge.size() + " region"));</span>
<span class="source-line-no">1413</span><span id="line-1413"> }</span>
<span class="source-line-no">1414</span><span id="line-1414"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1415</span><span id="line-1415"> byte[][] encodedNameOfRegionsToMerge =</span>
<span class="source-line-no">1416</span><span id="line-1416"> nameOfRegionsToMerge.stream().map(this::toEncodeRegionName).toArray(byte[][]::new);</span>
<span class="source-line-no">1417</span><span id="line-1417"></span>
<span class="source-line-no">1418</span><span id="line-1418"> addListener(checkRegionsAndGetTableName(encodedNameOfRegionsToMerge), (tableName, err) -&gt; {</span>
<span class="source-line-no">1419</span><span id="line-1419"> if (err != null) {</span>
<span class="source-line-no">1420</span><span id="line-1420"> future.completeExceptionally(err);</span>
<span class="source-line-no">1421</span><span id="line-1421"> return;</span>
<span class="source-line-no">1422</span><span id="line-1422"> }</span>
<span class="source-line-no">1423</span><span id="line-1423"></span>
<span class="source-line-no">1424</span><span id="line-1424"> final MergeTableRegionsRequest request;</span>
<span class="source-line-no">1425</span><span id="line-1425"> try {</span>
<span class="source-line-no">1426</span><span id="line-1426"> request = RequestConverter.buildMergeTableRegionsRequest(encodedNameOfRegionsToMerge,</span>
<span class="source-line-no">1427</span><span id="line-1427"> forcible, ng.getNonceGroup(), ng.newNonce());</span>
<span class="source-line-no">1428</span><span id="line-1428"> } catch (DeserializationException e) {</span>
<span class="source-line-no">1429</span><span id="line-1429"> future.completeExceptionally(e);</span>
<span class="source-line-no">1430</span><span id="line-1430"> return;</span>
<span class="source-line-no">1431</span><span id="line-1431"> }</span>
<span class="source-line-no">1432</span><span id="line-1432"></span>
<span class="source-line-no">1433</span><span id="line-1433"> addListener(</span>
<span class="source-line-no">1434</span><span id="line-1434"> this.procedureCall(tableName, request, MasterService.Interface::mergeTableRegions,</span>
<span class="source-line-no">1435</span><span id="line-1435"> MergeTableRegionsResponse::getProcId, new MergeTableRegionProcedureBiConsumer(tableName)),</span>
<span class="source-line-no">1436</span><span id="line-1436"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1437</span><span id="line-1437"> if (err2 != null) {</span>
<span class="source-line-no">1438</span><span id="line-1438"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1439</span><span id="line-1439"> } else {</span>
<span class="source-line-no">1440</span><span id="line-1440"> future.complete(ret);</span>
<span class="source-line-no">1441</span><span id="line-1441"> }</span>
<span class="source-line-no">1442</span><span id="line-1442"> });</span>
<span class="source-line-no">1443</span><span id="line-1443"> });</span>
<span class="source-line-no">1444</span><span id="line-1444"> return future;</span>
<span class="source-line-no">1445</span><span id="line-1445"> }</span>
<span class="source-line-no">1446</span><span id="line-1446"></span>
<span class="source-line-no">1447</span><span id="line-1447"> @Override</span>
<span class="source-line-no">1448</span><span id="line-1448"> public CompletableFuture&lt;Void&gt; split(TableName tableName) {</span>
<span class="source-line-no">1449</span><span id="line-1449"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1450</span><span id="line-1450"> addListener(tableExists(tableName), (exist, error) -&gt; {</span>
<span class="source-line-no">1451</span><span id="line-1451"> if (error != null) {</span>
<span class="source-line-no">1452</span><span id="line-1452"> future.completeExceptionally(error);</span>
<span class="source-line-no">1453</span><span id="line-1453"> return;</span>
<span class="source-line-no">1454</span><span id="line-1454"> }</span>
<span class="source-line-no">1455</span><span id="line-1455"> if (!exist) {</span>
<span class="source-line-no">1456</span><span id="line-1456"> future.completeExceptionally(new TableNotFoundException(tableName));</span>
<span class="source-line-no">1457</span><span id="line-1457"> return;</span>
<span class="source-line-no">1458</span><span id="line-1458"> }</span>
<span class="source-line-no">1459</span><span id="line-1459"> addListener(metaTable</span>
<span class="source-line-no">1460</span><span id="line-1460"> .scanAll(new Scan().setReadType(ReadType.PREAD).addFamily(HConstants.CATALOG_FAMILY)</span>
<span class="source-line-no">1461</span><span id="line-1461"> .withStartRow(ClientMetaTableAccessor.getTableStartRowForMeta(tableName,</span>
<span class="source-line-no">1462</span><span id="line-1462"> ClientMetaTableAccessor.QueryType.REGION))</span>
<span class="source-line-no">1463</span><span id="line-1463"> .withStopRow(ClientMetaTableAccessor.getTableStopRowForMeta(tableName,</span>
<span class="source-line-no">1464</span><span id="line-1464"> ClientMetaTableAccessor.QueryType.REGION))),</span>
<span class="source-line-no">1465</span><span id="line-1465"> (results, err2) -&gt; {</span>
<span class="source-line-no">1466</span><span id="line-1466"> if (err2 != null) {</span>
<span class="source-line-no">1467</span><span id="line-1467"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1468</span><span id="line-1468"> return;</span>
<span class="source-line-no">1469</span><span id="line-1469"> }</span>
<span class="source-line-no">1470</span><span id="line-1470"> if (results != null &amp;&amp; !results.isEmpty()) {</span>
<span class="source-line-no">1471</span><span id="line-1471"> List&lt;CompletableFuture&lt;Void&gt;&gt; splitFutures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">1472</span><span id="line-1472"> for (Result r : results) {</span>
<span class="source-line-no">1473</span><span id="line-1473"> if (r.isEmpty() || CatalogFamilyFormat.getRegionInfo(r) == null) {</span>
<span class="source-line-no">1474</span><span id="line-1474"> continue;</span>
<span class="source-line-no">1475</span><span id="line-1475"> }</span>
<span class="source-line-no">1476</span><span id="line-1476"> RegionLocations rl = CatalogFamilyFormat.getRegionLocations(r);</span>
<span class="source-line-no">1477</span><span id="line-1477"> if (rl != null) {</span>
<span class="source-line-no">1478</span><span id="line-1478"> for (HRegionLocation h : rl.getRegionLocations()) {</span>
<span class="source-line-no">1479</span><span id="line-1479"> if (h != null &amp;&amp; h.getServerName() != null) {</span>
<span class="source-line-no">1480</span><span id="line-1480"> RegionInfo hri = h.getRegion();</span>
<span class="source-line-no">1481</span><span id="line-1481"> if (</span>
<span class="source-line-no">1482</span><span id="line-1482"> hri == null || hri.isSplitParent()</span>
<span class="source-line-no">1483</span><span id="line-1483"> || hri.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID</span>
<span class="source-line-no">1484</span><span id="line-1484"> ) {</span>
<span class="source-line-no">1485</span><span id="line-1485"> continue;</span>
<span class="source-line-no">1486</span><span id="line-1486"> }</span>
<span class="source-line-no">1487</span><span id="line-1487"> splitFutures.add(split(hri, null));</span>
<span class="source-line-no">1488</span><span id="line-1488"> }</span>
<span class="source-line-no">1489</span><span id="line-1489"> }</span>
<span class="source-line-no">1490</span><span id="line-1490"> }</span>
<span class="source-line-no">1491</span><span id="line-1491"> }</span>
<span class="source-line-no">1492</span><span id="line-1492"> addListener(</span>
<span class="source-line-no">1493</span><span id="line-1493"> CompletableFuture</span>
<span class="source-line-no">1494</span><span id="line-1494"> .allOf(splitFutures.toArray(new CompletableFuture&lt;?&gt;[splitFutures.size()])),</span>
<span class="source-line-no">1495</span><span id="line-1495"> (ret, exception) -&gt; {</span>
<span class="source-line-no">1496</span><span id="line-1496"> if (exception != null) {</span>
<span class="source-line-no">1497</span><span id="line-1497"> future.completeExceptionally(exception);</span>
<span class="source-line-no">1498</span><span id="line-1498"> return;</span>
<span class="source-line-no">1499</span><span id="line-1499"> }</span>
<span class="source-line-no">1500</span><span id="line-1500"> future.complete(ret);</span>
<span class="source-line-no">1501</span><span id="line-1501"> });</span>
<span class="source-line-no">1502</span><span id="line-1502"> } else {</span>
<span class="source-line-no">1503</span><span id="line-1503"> future.complete(null);</span>
<span class="source-line-no">1504</span><span id="line-1504"> }</span>
<span class="source-line-no">1505</span><span id="line-1505"> });</span>
<span class="source-line-no">1506</span><span id="line-1506"> });</span>
<span class="source-line-no">1507</span><span id="line-1507"> return future;</span>
<span class="source-line-no">1508</span><span id="line-1508"> }</span>
<span class="source-line-no">1509</span><span id="line-1509"></span>
<span class="source-line-no">1510</span><span id="line-1510"> @Override</span>
<span class="source-line-no">1511</span><span id="line-1511"> public CompletableFuture&lt;Void&gt; split(TableName tableName, byte[] splitPoint) {</span>
<span class="source-line-no">1512</span><span id="line-1512"> CompletableFuture&lt;Void&gt; result = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1513</span><span id="line-1513"> if (splitPoint == null) {</span>
<span class="source-line-no">1514</span><span id="line-1514"> return failedFuture(new IllegalArgumentException("splitPoint can not be null."));</span>
<span class="source-line-no">1515</span><span id="line-1515"> }</span>
<span class="source-line-no">1516</span><span id="line-1516"> addListener(connection.getRegionLocator(tableName).getRegionLocation(splitPoint, true),</span>
<span class="source-line-no">1517</span><span id="line-1517"> (loc, err) -&gt; {</span>
<span class="source-line-no">1518</span><span id="line-1518"> if (err != null) {</span>
<span class="source-line-no">1519</span><span id="line-1519"> result.completeExceptionally(err);</span>
<span class="source-line-no">1520</span><span id="line-1520"> } else if (loc == null || loc.getRegion() == null) {</span>
<span class="source-line-no">1521</span><span id="line-1521"> result.completeExceptionally(new IllegalArgumentException(</span>
<span class="source-line-no">1522</span><span id="line-1522"> "Region does not found: rowKey=" + Bytes.toStringBinary(splitPoint)));</span>
<span class="source-line-no">1523</span><span id="line-1523"> } else {</span>
<span class="source-line-no">1524</span><span id="line-1524"> addListener(splitRegion(loc.getRegion().getRegionName(), splitPoint), (ret, err2) -&gt; {</span>
<span class="source-line-no">1525</span><span id="line-1525"> if (err2 != null) {</span>
<span class="source-line-no">1526</span><span id="line-1526"> result.completeExceptionally(err2);</span>
<span class="source-line-no">1527</span><span id="line-1527"> } else {</span>
<span class="source-line-no">1528</span><span id="line-1528"> result.complete(ret);</span>
<span class="source-line-no">1529</span><span id="line-1529"> }</span>
<span class="source-line-no">1530</span><span id="line-1530"></span>
<span class="source-line-no">1531</span><span id="line-1531"> });</span>
<span class="source-line-no">1532</span><span id="line-1532"> }</span>
<span class="source-line-no">1533</span><span id="line-1533"> });</span>
<span class="source-line-no">1534</span><span id="line-1534"> return result;</span>
<span class="source-line-no">1535</span><span id="line-1535"> }</span>
<span class="source-line-no">1536</span><span id="line-1536"></span>
<span class="source-line-no">1537</span><span id="line-1537"> @Override</span>
<span class="source-line-no">1538</span><span id="line-1538"> public CompletableFuture&lt;Void&gt; splitRegion(byte[] regionName) {</span>
<span class="source-line-no">1539</span><span id="line-1539"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1540</span><span id="line-1540"> addListener(getRegionLocation(regionName), (location, err) -&gt; {</span>
<span class="source-line-no">1541</span><span id="line-1541"> if (err != null) {</span>
<span class="source-line-no">1542</span><span id="line-1542"> future.completeExceptionally(err);</span>
<span class="source-line-no">1543</span><span id="line-1543"> return;</span>
<span class="source-line-no">1544</span><span id="line-1544"> }</span>
<span class="source-line-no">1545</span><span id="line-1545"> RegionInfo regionInfo = location.getRegion();</span>
<span class="source-line-no">1546</span><span id="line-1546"> if (regionInfo.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) {</span>
<span class="source-line-no">1547</span><span id="line-1547"> future.completeExceptionally(new IllegalArgumentException("Can't split replicas directly. "</span>
<span class="source-line-no">1548</span><span id="line-1548"> + "Replicas are auto-split when their primary is split."));</span>
<span class="source-line-no">1549</span><span id="line-1549"> return;</span>
<span class="source-line-no">1550</span><span id="line-1550"> }</span>
<span class="source-line-no">1551</span><span id="line-1551"> ServerName serverName = location.getServerName();</span>
<span class="source-line-no">1552</span><span id="line-1552"> if (serverName == null) {</span>
<span class="source-line-no">1553</span><span id="line-1553"> future</span>
<span class="source-line-no">1554</span><span id="line-1554"> .completeExceptionally(new NoServerForRegionException(Bytes.toStringBinary(regionName)));</span>
<span class="source-line-no">1555</span><span id="line-1555"> return;</span>
<span class="source-line-no">1556</span><span id="line-1556"> }</span>
<span class="source-line-no">1557</span><span id="line-1557"> addListener(split(regionInfo, null), (ret, err2) -&gt; {</span>
<span class="source-line-no">1558</span><span id="line-1558"> if (err2 != null) {</span>
<span class="source-line-no">1559</span><span id="line-1559"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1560</span><span id="line-1560"> } else {</span>
<span class="source-line-no">1561</span><span id="line-1561"> future.complete(ret);</span>
<span class="source-line-no">1562</span><span id="line-1562"> }</span>
<span class="source-line-no">1563</span><span id="line-1563"> });</span>
<span class="source-line-no">1564</span><span id="line-1564"> });</span>
<span class="source-line-no">1565</span><span id="line-1565"> return future;</span>
<span class="source-line-no">1566</span><span id="line-1566"> }</span>
<span class="source-line-no">1567</span><span id="line-1567"></span>
<span class="source-line-no">1568</span><span id="line-1568"> @Override</span>
<span class="source-line-no">1569</span><span id="line-1569"> public CompletableFuture&lt;Void&gt; splitRegion(byte[] regionName, byte[] splitPoint) {</span>
<span class="source-line-no">1570</span><span id="line-1570"> Preconditions.checkNotNull(splitPoint,</span>
<span class="source-line-no">1571</span><span id="line-1571"> "splitPoint is null. If you don't specify a splitPoint, use splitRegion(byte[]) instead");</span>
<span class="source-line-no">1572</span><span id="line-1572"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1573</span><span id="line-1573"> addListener(getRegionLocation(regionName), (location, err) -&gt; {</span>
<span class="source-line-no">1574</span><span id="line-1574"> if (err != null) {</span>
<span class="source-line-no">1575</span><span id="line-1575"> future.completeExceptionally(err);</span>
<span class="source-line-no">1576</span><span id="line-1576"> return;</span>
<span class="source-line-no">1577</span><span id="line-1577"> }</span>
<span class="source-line-no">1578</span><span id="line-1578"> RegionInfo regionInfo = location.getRegion();</span>
<span class="source-line-no">1579</span><span id="line-1579"> if (regionInfo.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) {</span>
<span class="source-line-no">1580</span><span id="line-1580"> future.completeExceptionally(new IllegalArgumentException("Can't split replicas directly. "</span>
<span class="source-line-no">1581</span><span id="line-1581"> + "Replicas are auto-split when their primary is split."));</span>
<span class="source-line-no">1582</span><span id="line-1582"> return;</span>
<span class="source-line-no">1583</span><span id="line-1583"> }</span>
<span class="source-line-no">1584</span><span id="line-1584"> ServerName serverName = location.getServerName();</span>
<span class="source-line-no">1585</span><span id="line-1585"> if (serverName == null) {</span>
<span class="source-line-no">1586</span><span id="line-1586"> future</span>
<span class="source-line-no">1587</span><span id="line-1587"> .completeExceptionally(new NoServerForRegionException(Bytes.toStringBinary(regionName)));</span>
<span class="source-line-no">1588</span><span id="line-1588"> return;</span>
<span class="source-line-no">1589</span><span id="line-1589"> }</span>
<span class="source-line-no">1590</span><span id="line-1590"> if (</span>
<span class="source-line-no">1591</span><span id="line-1591"> regionInfo.getStartKey() != null</span>
<span class="source-line-no">1592</span><span id="line-1592"> &amp;&amp; Bytes.compareTo(regionInfo.getStartKey(), splitPoint) == 0</span>
<span class="source-line-no">1593</span><span id="line-1593"> ) {</span>
<span class="source-line-no">1594</span><span id="line-1594"> future.completeExceptionally(</span>
<span class="source-line-no">1595</span><span id="line-1595"> new IllegalArgumentException("should not give a splitkey which equals to startkey!"));</span>
<span class="source-line-no">1596</span><span id="line-1596"> return;</span>
<span class="source-line-no">1597</span><span id="line-1597"> }</span>
<span class="source-line-no">1598</span><span id="line-1598"> addListener(split(regionInfo, splitPoint), (ret, err2) -&gt; {</span>
<span class="source-line-no">1599</span><span id="line-1599"> if (err2 != null) {</span>
<span class="source-line-no">1600</span><span id="line-1600"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1601</span><span id="line-1601"> } else {</span>
<span class="source-line-no">1602</span><span id="line-1602"> future.complete(ret);</span>
<span class="source-line-no">1603</span><span id="line-1603"> }</span>
<span class="source-line-no">1604</span><span id="line-1604"> });</span>
<span class="source-line-no">1605</span><span id="line-1605"> });</span>
<span class="source-line-no">1606</span><span id="line-1606"> return future;</span>
<span class="source-line-no">1607</span><span id="line-1607"> }</span>
<span class="source-line-no">1608</span><span id="line-1608"></span>
<span class="source-line-no">1609</span><span id="line-1609"> private CompletableFuture&lt;Void&gt; split(final RegionInfo hri, byte[] splitPoint) {</span>
<span class="source-line-no">1610</span><span id="line-1610"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1611</span><span id="line-1611"> TableName tableName = hri.getTable();</span>
<span class="source-line-no">1612</span><span id="line-1612"> final SplitTableRegionRequest request;</span>
<span class="source-line-no">1613</span><span id="line-1613"> try {</span>
<span class="source-line-no">1614</span><span id="line-1614"> request = RequestConverter.buildSplitTableRegionRequest(hri, splitPoint, ng.getNonceGroup(),</span>
<span class="source-line-no">1615</span><span id="line-1615"> ng.newNonce());</span>
<span class="source-line-no">1616</span><span id="line-1616"> } catch (DeserializationException e) {</span>
<span class="source-line-no">1617</span><span id="line-1617"> future.completeExceptionally(e);</span>
<span class="source-line-no">1618</span><span id="line-1618"> return future;</span>
<span class="source-line-no">1619</span><span id="line-1619"> }</span>
<span class="source-line-no">1620</span><span id="line-1620"></span>
<span class="source-line-no">1621</span><span id="line-1621"> addListener(</span>
<span class="source-line-no">1622</span><span id="line-1622"> this.procedureCall(tableName, request, MasterService.Interface::splitRegion,</span>
<span class="source-line-no">1623</span><span id="line-1623"> SplitTableRegionResponse::getProcId, new SplitTableRegionProcedureBiConsumer(tableName)),</span>
<span class="source-line-no">1624</span><span id="line-1624"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1625</span><span id="line-1625"> if (err2 != null) {</span>
<span class="source-line-no">1626</span><span id="line-1626"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1627</span><span id="line-1627"> } else {</span>
<span class="source-line-no">1628</span><span id="line-1628"> future.complete(ret);</span>
<span class="source-line-no">1629</span><span id="line-1629"> }</span>
<span class="source-line-no">1630</span><span id="line-1630"> });</span>
<span class="source-line-no">1631</span><span id="line-1631"> return future;</span>
<span class="source-line-no">1632</span><span id="line-1632"> }</span>
<span class="source-line-no">1633</span><span id="line-1633"></span>
<span class="source-line-no">1634</span><span id="line-1634"> @Override</span>
<span class="source-line-no">1635</span><span id="line-1635"> public CompletableFuture&lt;Void&gt; truncateRegion(byte[] regionName) {</span>
<span class="source-line-no">1636</span><span id="line-1636"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1637</span><span id="line-1637"> addListener(getRegionLocation(regionName), (location, err) -&gt; {</span>
<span class="source-line-no">1638</span><span id="line-1638"> if (err != null) {</span>
<span class="source-line-no">1639</span><span id="line-1639"> future.completeExceptionally(err);</span>
<span class="source-line-no">1640</span><span id="line-1640"> return;</span>
<span class="source-line-no">1641</span><span id="line-1641"> }</span>
<span class="source-line-no">1642</span><span id="line-1642"> RegionInfo regionInfo = location.getRegion();</span>
<span class="source-line-no">1643</span><span id="line-1643"> if (regionInfo.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) {</span>
<span class="source-line-no">1644</span><span id="line-1644"> future.completeExceptionally(new IllegalArgumentException(</span>
<span class="source-line-no">1645</span><span id="line-1645"> "Can't truncate replicas directly.Replicas are auto-truncated "</span>
<span class="source-line-no">1646</span><span id="line-1646"> + "when their primary is truncated."));</span>
<span class="source-line-no">1647</span><span id="line-1647"> return;</span>
<span class="source-line-no">1648</span><span id="line-1648"> }</span>
<span class="source-line-no">1649</span><span id="line-1649"> ServerName serverName = location.getServerName();</span>
<span class="source-line-no">1650</span><span id="line-1650"> if (serverName == null) {</span>
<span class="source-line-no">1651</span><span id="line-1651"> future</span>
<span class="source-line-no">1652</span><span id="line-1652"> .completeExceptionally(new NoServerForRegionException(Bytes.toStringBinary(regionName)));</span>
<span class="source-line-no">1653</span><span id="line-1653"> return;</span>
<span class="source-line-no">1654</span><span id="line-1654"> }</span>
<span class="source-line-no">1655</span><span id="line-1655"> addListener(truncateRegion(regionInfo), (ret, err2) -&gt; {</span>
<span class="source-line-no">1656</span><span id="line-1656"> if (err2 != null) {</span>
<span class="source-line-no">1657</span><span id="line-1657"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1658</span><span id="line-1658"> } else {</span>
<span class="source-line-no">1659</span><span id="line-1659"> future.complete(ret);</span>
<span class="source-line-no">1660</span><span id="line-1660"> }</span>
<span class="source-line-no">1661</span><span id="line-1661"> });</span>
<span class="source-line-no">1662</span><span id="line-1662"> });</span>
<span class="source-line-no">1663</span><span id="line-1663"> return future;</span>
<span class="source-line-no">1664</span><span id="line-1664"> }</span>
<span class="source-line-no">1665</span><span id="line-1665"></span>
<span class="source-line-no">1666</span><span id="line-1666"> private CompletableFuture&lt;Void&gt; truncateRegion(final RegionInfo hri) {</span>
<span class="source-line-no">1667</span><span id="line-1667"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1668</span><span id="line-1668"> TableName tableName = hri.getTable();</span>
<span class="source-line-no">1669</span><span id="line-1669"> final MasterProtos.TruncateRegionRequest request;</span>
<span class="source-line-no">1670</span><span id="line-1670"> try {</span>
<span class="source-line-no">1671</span><span id="line-1671"> request = RequestConverter.buildTruncateRegionRequest(hri, ng.getNonceGroup(), ng.newNonce());</span>
<span class="source-line-no">1672</span><span id="line-1672"> } catch (DeserializationException e) {</span>
<span class="source-line-no">1673</span><span id="line-1673"> future.completeExceptionally(e);</span>
<span class="source-line-no">1674</span><span id="line-1674"> return future;</span>
<span class="source-line-no">1675</span><span id="line-1675"> }</span>
<span class="source-line-no">1676</span><span id="line-1676"> addListener(this.procedureCall(tableName, request, MasterService.Interface::truncateRegion,</span>
<span class="source-line-no">1677</span><span id="line-1677"> MasterProtos.TruncateRegionResponse::getProcId,</span>
<span class="source-line-no">1678</span><span id="line-1678"> new TruncateRegionProcedureBiConsumer(tableName)), (ret, err2) -&gt; {</span>
<span class="source-line-no">1679</span><span id="line-1679"> if (err2 != null) {</span>
<span class="source-line-no">1680</span><span id="line-1680"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1681</span><span id="line-1681"> } else {</span>
<span class="source-line-no">1682</span><span id="line-1682"> future.complete(ret);</span>
<span class="source-line-no">1683</span><span id="line-1683"> }</span>
<span class="source-line-no">1684</span><span id="line-1684"> });</span>
<span class="source-line-no">1685</span><span id="line-1685"> return future;</span>
<span class="source-line-no">1686</span><span id="line-1686"> }</span>
<span class="source-line-no">1687</span><span id="line-1687"></span>
<span class="source-line-no">1688</span><span id="line-1688"> @Override</span>
<span class="source-line-no">1689</span><span id="line-1689"> public CompletableFuture&lt;Void&gt; assign(byte[] regionName) {</span>
<span class="source-line-no">1690</span><span id="line-1690"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1691</span><span id="line-1691"> addListener(getRegionInfo(regionName), (regionInfo, err) -&gt; {</span>
<span class="source-line-no">1692</span><span id="line-1692"> if (err != null) {</span>
<span class="source-line-no">1693</span><span id="line-1693"> future.completeExceptionally(err);</span>
<span class="source-line-no">1694</span><span id="line-1694"> return;</span>
<span class="source-line-no">1695</span><span id="line-1695"> }</span>
<span class="source-line-no">1696</span><span id="line-1696"> addListener(</span>
<span class="source-line-no">1697</span><span id="line-1697"> this.&lt;Void&gt; newMasterCaller().priority(regionInfo.getTable())</span>
<span class="source-line-no">1698</span><span id="line-1698"> .action((controller, stub) -&gt; this.&lt;AssignRegionRequest, AssignRegionResponse, Void&gt; call(</span>
<span class="source-line-no">1699</span><span id="line-1699"> controller, stub, RequestConverter.buildAssignRegionRequest(regionInfo.getRegionName()),</span>
<span class="source-line-no">1700</span><span id="line-1700"> (s, c, req, done) -&gt; s.assignRegion(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">1701</span><span id="line-1701"> .call(),</span>
<span class="source-line-no">1702</span><span id="line-1702"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1703</span><span id="line-1703"> if (err2 != null) {</span>
<span class="source-line-no">1704</span><span id="line-1704"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1705</span><span id="line-1705"> } else {</span>
<span class="source-line-no">1706</span><span id="line-1706"> future.complete(ret);</span>
<span class="source-line-no">1707</span><span id="line-1707"> }</span>
<span class="source-line-no">1708</span><span id="line-1708"> });</span>
<span class="source-line-no">1709</span><span id="line-1709"> });</span>
<span class="source-line-no">1710</span><span id="line-1710"> return future;</span>
<span class="source-line-no">1711</span><span id="line-1711"> }</span>
<span class="source-line-no">1712</span><span id="line-1712"></span>
<span class="source-line-no">1713</span><span id="line-1713"> @Override</span>
<span class="source-line-no">1714</span><span id="line-1714"> public CompletableFuture&lt;Void&gt; unassign(byte[] regionName) {</span>
<span class="source-line-no">1715</span><span id="line-1715"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1716</span><span id="line-1716"> addListener(getRegionInfo(regionName), (regionInfo, err) -&gt; {</span>
<span class="source-line-no">1717</span><span id="line-1717"> if (err != null) {</span>
<span class="source-line-no">1718</span><span id="line-1718"> future.completeExceptionally(err);</span>
<span class="source-line-no">1719</span><span id="line-1719"> return;</span>
<span class="source-line-no">1720</span><span id="line-1720"> }</span>
<span class="source-line-no">1721</span><span id="line-1721"> addListener(</span>
<span class="source-line-no">1722</span><span id="line-1722"> this.&lt;Void&gt; newMasterCaller().priority(regionInfo.getTable())</span>
<span class="source-line-no">1723</span><span id="line-1723"> .action((controller, stub) -&gt; this.&lt;UnassignRegionRequest, UnassignRegionResponse,</span>
<span class="source-line-no">1724</span><span id="line-1724"> Void&gt; call(controller, stub,</span>
<span class="source-line-no">1725</span><span id="line-1725"> RequestConverter.buildUnassignRegionRequest(regionInfo.getRegionName()),</span>
<span class="source-line-no">1726</span><span id="line-1726"> (s, c, req, done) -&gt; s.unassignRegion(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">1727</span><span id="line-1727"> .call(),</span>
<span class="source-line-no">1728</span><span id="line-1728"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1729</span><span id="line-1729"> if (err2 != null) {</span>
<span class="source-line-no">1730</span><span id="line-1730"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1731</span><span id="line-1731"> } else {</span>
<span class="source-line-no">1732</span><span id="line-1732"> future.complete(ret);</span>
<span class="source-line-no">1733</span><span id="line-1733"> }</span>
<span class="source-line-no">1734</span><span id="line-1734"> });</span>
<span class="source-line-no">1735</span><span id="line-1735"> });</span>
<span class="source-line-no">1736</span><span id="line-1736"> return future;</span>
<span class="source-line-no">1737</span><span id="line-1737"> }</span>
<span class="source-line-no">1738</span><span id="line-1738"></span>
<span class="source-line-no">1739</span><span id="line-1739"> @Override</span>
<span class="source-line-no">1740</span><span id="line-1740"> public CompletableFuture&lt;Void&gt; offline(byte[] regionName) {</span>
<span class="source-line-no">1741</span><span id="line-1741"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1742</span><span id="line-1742"> addListener(getRegionInfo(regionName), (regionInfo, err) -&gt; {</span>
<span class="source-line-no">1743</span><span id="line-1743"> if (err != null) {</span>
<span class="source-line-no">1744</span><span id="line-1744"> future.completeExceptionally(err);</span>
<span class="source-line-no">1745</span><span id="line-1745"> return;</span>
<span class="source-line-no">1746</span><span id="line-1746"> }</span>
<span class="source-line-no">1747</span><span id="line-1747"> addListener(this.&lt;Void&gt; newMasterCaller().priority(regionInfo.getTable())</span>
<span class="source-line-no">1748</span><span id="line-1748"> .action((controller, stub) -&gt; this.&lt;OfflineRegionRequest, OfflineRegionResponse, Void&gt; call(</span>
<span class="source-line-no">1749</span><span id="line-1749"> controller, stub, RequestConverter.buildOfflineRegionRequest(regionInfo.getRegionName()),</span>
<span class="source-line-no">1750</span><span id="line-1750"> (s, c, req, done) -&gt; s.offlineRegion(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">1751</span><span id="line-1751"> .call(), (ret, err2) -&gt; {</span>
<span class="source-line-no">1752</span><span id="line-1752"> if (err2 != null) {</span>
<span class="source-line-no">1753</span><span id="line-1753"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1754</span><span id="line-1754"> } else {</span>
<span class="source-line-no">1755</span><span id="line-1755"> future.complete(ret);</span>
<span class="source-line-no">1756</span><span id="line-1756"> }</span>
<span class="source-line-no">1757</span><span id="line-1757"> });</span>
<span class="source-line-no">1758</span><span id="line-1758"> });</span>
<span class="source-line-no">1759</span><span id="line-1759"> return future;</span>
<span class="source-line-no">1760</span><span id="line-1760"> }</span>
<span class="source-line-no">1761</span><span id="line-1761"></span>
<span class="source-line-no">1762</span><span id="line-1762"> @Override</span>
<span class="source-line-no">1763</span><span id="line-1763"> public CompletableFuture&lt;Void&gt; move(byte[] regionName) {</span>
<span class="source-line-no">1764</span><span id="line-1764"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1765</span><span id="line-1765"> addListener(getRegionInfo(regionName), (regionInfo, err) -&gt; {</span>
<span class="source-line-no">1766</span><span id="line-1766"> if (err != null) {</span>
<span class="source-line-no">1767</span><span id="line-1767"> future.completeExceptionally(err);</span>
<span class="source-line-no">1768</span><span id="line-1768"> return;</span>
<span class="source-line-no">1769</span><span id="line-1769"> }</span>
<span class="source-line-no">1770</span><span id="line-1770"> addListener(</span>
<span class="source-line-no">1771</span><span id="line-1771"> moveRegion(regionInfo,</span>
<span class="source-line-no">1772</span><span id="line-1772"> RequestConverter.buildMoveRegionRequest(regionInfo.getEncodedNameAsBytes(), null)),</span>
<span class="source-line-no">1773</span><span id="line-1773"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1774</span><span id="line-1774"> if (err2 != null) {</span>
<span class="source-line-no">1775</span><span id="line-1775"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1776</span><span id="line-1776"> } else {</span>
<span class="source-line-no">1777</span><span id="line-1777"> future.complete(ret);</span>
<span class="source-line-no">1778</span><span id="line-1778"> }</span>
<span class="source-line-no">1779</span><span id="line-1779"> });</span>
<span class="source-line-no">1780</span><span id="line-1780"> });</span>
<span class="source-line-no">1781</span><span id="line-1781"> return future;</span>
<span class="source-line-no">1782</span><span id="line-1782"> }</span>
<span class="source-line-no">1783</span><span id="line-1783"></span>
<span class="source-line-no">1784</span><span id="line-1784"> @Override</span>
<span class="source-line-no">1785</span><span id="line-1785"> public CompletableFuture&lt;Void&gt; move(byte[] regionName, ServerName destServerName) {</span>
<span class="source-line-no">1786</span><span id="line-1786"> Preconditions.checkNotNull(destServerName,</span>
<span class="source-line-no">1787</span><span id="line-1787"> "destServerName is null. If you don't specify a destServerName, use move(byte[]) instead");</span>
<span class="source-line-no">1788</span><span id="line-1788"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1789</span><span id="line-1789"> addListener(getRegionInfo(regionName), (regionInfo, err) -&gt; {</span>
<span class="source-line-no">1790</span><span id="line-1790"> if (err != null) {</span>
<span class="source-line-no">1791</span><span id="line-1791"> future.completeExceptionally(err);</span>
<span class="source-line-no">1792</span><span id="line-1792"> return;</span>
<span class="source-line-no">1793</span><span id="line-1793"> }</span>
<span class="source-line-no">1794</span><span id="line-1794"> addListener(</span>
<span class="source-line-no">1795</span><span id="line-1795"> moveRegion(regionInfo, RequestConverter</span>
<span class="source-line-no">1796</span><span id="line-1796"> .buildMoveRegionRequest(regionInfo.getEncodedNameAsBytes(), destServerName)),</span>
<span class="source-line-no">1797</span><span id="line-1797"> (ret, err2) -&gt; {</span>
<span class="source-line-no">1798</span><span id="line-1798"> if (err2 != null) {</span>
<span class="source-line-no">1799</span><span id="line-1799"> future.completeExceptionally(err2);</span>
<span class="source-line-no">1800</span><span id="line-1800"> } else {</span>
<span class="source-line-no">1801</span><span id="line-1801"> future.complete(ret);</span>
<span class="source-line-no">1802</span><span id="line-1802"> }</span>
<span class="source-line-no">1803</span><span id="line-1803"> });</span>
<span class="source-line-no">1804</span><span id="line-1804"> });</span>
<span class="source-line-no">1805</span><span id="line-1805"> return future;</span>
<span class="source-line-no">1806</span><span id="line-1806"> }</span>
<span class="source-line-no">1807</span><span id="line-1807"></span>
<span class="source-line-no">1808</span><span id="line-1808"> private CompletableFuture&lt;Void&gt; moveRegion(RegionInfo regionInfo, MoveRegionRequest request) {</span>
<span class="source-line-no">1809</span><span id="line-1809"> return this.&lt;Void&gt; newMasterCaller().priority(regionInfo.getTable())</span>
<span class="source-line-no">1810</span><span id="line-1810"> .action(</span>
<span class="source-line-no">1811</span><span id="line-1811"> (controller, stub) -&gt; this.&lt;MoveRegionRequest, MoveRegionResponse, Void&gt; call(controller,</span>
<span class="source-line-no">1812</span><span id="line-1812"> stub, request, (s, c, req, done) -&gt; s.moveRegion(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">1813</span><span id="line-1813"> .call();</span>
<span class="source-line-no">1814</span><span id="line-1814"> }</span>
<span class="source-line-no">1815</span><span id="line-1815"></span>
<span class="source-line-no">1816</span><span id="line-1816"> @Override</span>
<span class="source-line-no">1817</span><span id="line-1817"> public CompletableFuture&lt;Void&gt; setQuota(QuotaSettings quota) {</span>
<span class="source-line-no">1818</span><span id="line-1818"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">1819</span><span id="line-1819"> .action((controller, stub) -&gt; this.&lt;SetQuotaRequest, SetQuotaResponse, Void&gt; call(controller,</span>
<span class="source-line-no">1820</span><span id="line-1820"> stub, QuotaSettings.buildSetQuotaRequestProto(quota),</span>
<span class="source-line-no">1821</span><span id="line-1821"> (s, c, req, done) -&gt; s.setQuota(c, req, done), (resp) -&gt; null))</span>
<span class="source-line-no">1822</span><span id="line-1822"> .call();</span>
<span class="source-line-no">1823</span><span id="line-1823"> }</span>
<span class="source-line-no">1824</span><span id="line-1824"></span>
<span class="source-line-no">1825</span><span id="line-1825"> @Override</span>
<span class="source-line-no">1826</span><span id="line-1826"> public CompletableFuture&lt;List&lt;QuotaSettings&gt;&gt; getQuota(QuotaFilter filter) {</span>
<span class="source-line-no">1827</span><span id="line-1827"> CompletableFuture&lt;List&lt;QuotaSettings&gt;&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">1828</span><span id="line-1828"> Scan scan = QuotaTableUtil.makeScan(filter);</span>
<span class="source-line-no">1829</span><span id="line-1829"> this.connection.getTableBuilder(QuotaTableUtil.QUOTA_TABLE_NAME).build().scan(scan,</span>
<span class="source-line-no">1830</span><span id="line-1830"> new AdvancedScanResultConsumer() {</span>
<span class="source-line-no">1831</span><span id="line-1831"> List&lt;QuotaSettings&gt; settings = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">1832</span><span id="line-1832"></span>
<span class="source-line-no">1833</span><span id="line-1833"> @Override</span>
<span class="source-line-no">1834</span><span id="line-1834"> public void onNext(Result[] results, ScanController controller) {</span>
<span class="source-line-no">1835</span><span id="line-1835"> for (Result result : results) {</span>
<span class="source-line-no">1836</span><span id="line-1836"> try {</span>
<span class="source-line-no">1837</span><span id="line-1837"> QuotaTableUtil.parseResultToCollection(result, settings);</span>
<span class="source-line-no">1838</span><span id="line-1838"> } catch (IOException e) {</span>
<span class="source-line-no">1839</span><span id="line-1839"> controller.terminate();</span>
<span class="source-line-no">1840</span><span id="line-1840"> future.completeExceptionally(e);</span>
<span class="source-line-no">1841</span><span id="line-1841"> }</span>
<span class="source-line-no">1842</span><span id="line-1842"> }</span>
<span class="source-line-no">1843</span><span id="line-1843"> }</span>
<span class="source-line-no">1844</span><span id="line-1844"></span>
<span class="source-line-no">1845</span><span id="line-1845"> @Override</span>
<span class="source-line-no">1846</span><span id="line-1846"> public void onError(Throwable error) {</span>
<span class="source-line-no">1847</span><span id="line-1847"> future.completeExceptionally(error);</span>
<span class="source-line-no">1848</span><span id="line-1848"> }</span>
<span class="source-line-no">1849</span><span id="line-1849"></span>
<span class="source-line-no">1850</span><span id="line-1850"> @Override</span>
<span class="source-line-no">1851</span><span id="line-1851"> public void onComplete() {</span>
<span class="source-line-no">1852</span><span id="line-1852"> future.complete(settings);</span>
<span class="source-line-no">1853</span><span id="line-1853"> }</span>
<span class="source-line-no">1854</span><span id="line-1854"> });</span>
<span class="source-line-no">1855</span><span id="line-1855"> return future;</span>
<span class="source-line-no">1856</span><span id="line-1856"> }</span>
<span class="source-line-no">1857</span><span id="line-1857"></span>
<span class="source-line-no">1858</span><span id="line-1858"> @Override</span>
<span class="source-line-no">1859</span><span id="line-1859"> public CompletableFuture&lt;Void&gt; addReplicationPeer(String peerId, ReplicationPeerConfig peerConfig,</span>
<span class="source-line-no">1860</span><span id="line-1860"> boolean enabled) {</span>
<span class="source-line-no">1861</span><span id="line-1861"> return this.&lt;AddReplicationPeerRequest, AddReplicationPeerResponse&gt; procedureCall(</span>
<span class="source-line-no">1862</span><span id="line-1862"> RequestConverter.buildAddReplicationPeerRequest(peerId, peerConfig, enabled),</span>
<span class="source-line-no">1863</span><span id="line-1863"> (s, c, req, done) -&gt; s.addReplicationPeer(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">1864</span><span id="line-1864"> new ReplicationProcedureBiConsumer(peerId, () -&gt; "ADD_REPLICATION_PEER"));</span>
<span class="source-line-no">1865</span><span id="line-1865"> }</span>
<span class="source-line-no">1866</span><span id="line-1866"></span>
<span class="source-line-no">1867</span><span id="line-1867"> @Override</span>
<span class="source-line-no">1868</span><span id="line-1868"> public CompletableFuture&lt;Void&gt; removeReplicationPeer(String peerId) {</span>
<span class="source-line-no">1869</span><span id="line-1869"> return this.&lt;RemoveReplicationPeerRequest, RemoveReplicationPeerResponse&gt; procedureCall(</span>
<span class="source-line-no">1870</span><span id="line-1870"> RequestConverter.buildRemoveReplicationPeerRequest(peerId),</span>
<span class="source-line-no">1871</span><span id="line-1871"> (s, c, req, done) -&gt; s.removeReplicationPeer(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">1872</span><span id="line-1872"> new ReplicationProcedureBiConsumer(peerId, () -&gt; "REMOVE_REPLICATION_PEER"));</span>
<span class="source-line-no">1873</span><span id="line-1873"> }</span>
<span class="source-line-no">1874</span><span id="line-1874"></span>
<span class="source-line-no">1875</span><span id="line-1875"> @Override</span>
<span class="source-line-no">1876</span><span id="line-1876"> public CompletableFuture&lt;Void&gt; enableReplicationPeer(String peerId) {</span>
<span class="source-line-no">1877</span><span id="line-1877"> return this.&lt;EnableReplicationPeerRequest, EnableReplicationPeerResponse&gt; procedureCall(</span>
<span class="source-line-no">1878</span><span id="line-1878"> RequestConverter.buildEnableReplicationPeerRequest(peerId),</span>
<span class="source-line-no">1879</span><span id="line-1879"> (s, c, req, done) -&gt; s.enableReplicationPeer(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">1880</span><span id="line-1880"> new ReplicationProcedureBiConsumer(peerId, () -&gt; "ENABLE_REPLICATION_PEER"));</span>
<span class="source-line-no">1881</span><span id="line-1881"> }</span>
<span class="source-line-no">1882</span><span id="line-1882"></span>
<span class="source-line-no">1883</span><span id="line-1883"> @Override</span>
<span class="source-line-no">1884</span><span id="line-1884"> public CompletableFuture&lt;Void&gt; disableReplicationPeer(String peerId) {</span>
<span class="source-line-no">1885</span><span id="line-1885"> return this.&lt;DisableReplicationPeerRequest, DisableReplicationPeerResponse&gt; procedureCall(</span>
<span class="source-line-no">1886</span><span id="line-1886"> RequestConverter.buildDisableReplicationPeerRequest(peerId),</span>
<span class="source-line-no">1887</span><span id="line-1887"> (s, c, req, done) -&gt; s.disableReplicationPeer(c, req, done), (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">1888</span><span id="line-1888"> new ReplicationProcedureBiConsumer(peerId, () -&gt; "DISABLE_REPLICATION_PEER"));</span>
<span class="source-line-no">1889</span><span id="line-1889"> }</span>
<span class="source-line-no">1890</span><span id="line-1890"></span>
<span class="source-line-no">1891</span><span id="line-1891"> @Override</span>
<span class="source-line-no">1892</span><span id="line-1892"> public CompletableFuture&lt;ReplicationPeerConfig&gt; getReplicationPeerConfig(String peerId) {</span>
<span class="source-line-no">1893</span><span id="line-1893"> return this.&lt;ReplicationPeerConfig&gt; newMasterCaller()</span>
<span class="source-line-no">1894</span><span id="line-1894"> .action((controller, stub) -&gt; this.&lt;GetReplicationPeerConfigRequest,</span>
<span class="source-line-no">1895</span><span id="line-1895"> GetReplicationPeerConfigResponse, ReplicationPeerConfig&gt; call(controller, stub,</span>
<span class="source-line-no">1896</span><span id="line-1896"> RequestConverter.buildGetReplicationPeerConfigRequest(peerId),</span>
<span class="source-line-no">1897</span><span id="line-1897"> (s, c, req, done) -&gt; s.getReplicationPeerConfig(c, req, done),</span>
<span class="source-line-no">1898</span><span id="line-1898"> (resp) -&gt; ReplicationPeerConfigUtil.convert(resp.getPeerConfig())))</span>
<span class="source-line-no">1899</span><span id="line-1899"> .call();</span>
<span class="source-line-no">1900</span><span id="line-1900"> }</span>
<span class="source-line-no">1901</span><span id="line-1901"></span>
<span class="source-line-no">1902</span><span id="line-1902"> @Override</span>
<span class="source-line-no">1903</span><span id="line-1903"> public CompletableFuture&lt;Void&gt; updateReplicationPeerConfig(String peerId,</span>
<span class="source-line-no">1904</span><span id="line-1904"> ReplicationPeerConfig peerConfig) {</span>
<span class="source-line-no">1905</span><span id="line-1905"> return this.&lt;UpdateReplicationPeerConfigRequest,</span>
<span class="source-line-no">1906</span><span id="line-1906"> UpdateReplicationPeerConfigResponse&gt; procedureCall(</span>
<span class="source-line-no">1907</span><span id="line-1907"> RequestConverter.buildUpdateReplicationPeerConfigRequest(peerId, peerConfig),</span>
<span class="source-line-no">1908</span><span id="line-1908"> (s, c, req, done) -&gt; s.updateReplicationPeerConfig(c, req, done),</span>
<span class="source-line-no">1909</span><span id="line-1909"> (resp) -&gt; resp.getProcId(),</span>
<span class="source-line-no">1910</span><span id="line-1910"> new ReplicationProcedureBiConsumer(peerId, () -&gt; "UPDATE_REPLICATION_PEER_CONFIG"));</span>
<span class="source-line-no">1911</span><span id="line-1911"> }</span>
<span class="source-line-no">1912</span><span id="line-1912"></span>
<span class="source-line-no">1913</span><span id="line-1913"> @Override</span>
<span class="source-line-no">1914</span><span id="line-1914"> public CompletableFuture&lt;Void&gt; transitReplicationPeerSyncReplicationState(String peerId,</span>
<span class="source-line-no">1915</span><span id="line-1915"> SyncReplicationState clusterState) {</span>
<span class="source-line-no">1916</span><span id="line-1916"> return this.&lt;TransitReplicationPeerSyncReplicationStateRequest,</span>
<span class="source-line-no">1917</span><span id="line-1917"> TransitReplicationPeerSyncReplicationStateResponse&gt; procedureCall(</span>
<span class="source-line-no">1918</span><span id="line-1918"> RequestConverter.buildTransitReplicationPeerSyncReplicationStateRequest(peerId,</span>
<span class="source-line-no">1919</span><span id="line-1919"> clusterState),</span>
<span class="source-line-no">1920</span><span id="line-1920"> (s, c, req, done) -&gt; s.transitReplicationPeerSyncReplicationState(c, req, done),</span>
<span class="source-line-no">1921</span><span id="line-1921"> (resp) -&gt; resp.getProcId(), new ReplicationProcedureBiConsumer(peerId,</span>
<span class="source-line-no">1922</span><span id="line-1922"> () -&gt; "TRANSIT_REPLICATION_PEER_SYNCHRONOUS_REPLICATION_STATE"));</span>
<span class="source-line-no">1923</span><span id="line-1923"> }</span>
<span class="source-line-no">1924</span><span id="line-1924"></span>
<span class="source-line-no">1925</span><span id="line-1925"> @Override</span>
<span class="source-line-no">1926</span><span id="line-1926"> public CompletableFuture&lt;Void&gt; appendReplicationPeerTableCFs(String id,</span>
<span class="source-line-no">1927</span><span id="line-1927"> Map&lt;TableName, List&lt;String&gt;&gt; tableCfs) {</span>
<span class="source-line-no">1928</span><span id="line-1928"> if (tableCfs == null) {</span>
<span class="source-line-no">1929</span><span id="line-1929"> return failedFuture(new ReplicationException("tableCfs is null"));</span>
<span class="source-line-no">1930</span><span id="line-1930"> }</span>
<span class="source-line-no">1931</span><span id="line-1931"></span>
<span class="source-line-no">1932</span><span id="line-1932"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;Void&gt;();</span>
<span class="source-line-no">1933</span><span id="line-1933"> addListener(getReplicationPeerConfig(id), (peerConfig, error) -&gt; {</span>
<span class="source-line-no">1934</span><span id="line-1934"> if (!completeExceptionally(future, error)) {</span>
<span class="source-line-no">1935</span><span id="line-1935"> ReplicationPeerConfig newPeerConfig =</span>
<span class="source-line-no">1936</span><span id="line-1936"> ReplicationPeerConfigUtil.appendTableCFsToReplicationPeerConfig(tableCfs, peerConfig);</span>
<span class="source-line-no">1937</span><span id="line-1937"> addListener(updateReplicationPeerConfig(id, newPeerConfig), (result, err) -&gt; {</span>
<span class="source-line-no">1938</span><span id="line-1938"> if (!completeExceptionally(future, error)) {</span>
<span class="source-line-no">1939</span><span id="line-1939"> future.complete(result);</span>
<span class="source-line-no">1940</span><span id="line-1940"> }</span>
<span class="source-line-no">1941</span><span id="line-1941"> });</span>
<span class="source-line-no">1942</span><span id="line-1942"> }</span>
<span class="source-line-no">1943</span><span id="line-1943"> });</span>
<span class="source-line-no">1944</span><span id="line-1944"> return future;</span>
<span class="source-line-no">1945</span><span id="line-1945"> }</span>
<span class="source-line-no">1946</span><span id="line-1946"></span>
<span class="source-line-no">1947</span><span id="line-1947"> @Override</span>
<span class="source-line-no">1948</span><span id="line-1948"> public CompletableFuture&lt;Void&gt; removeReplicationPeerTableCFs(String id,</span>
<span class="source-line-no">1949</span><span id="line-1949"> Map&lt;TableName, List&lt;String&gt;&gt; tableCfs) {</span>
<span class="source-line-no">1950</span><span id="line-1950"> if (tableCfs == null) {</span>
<span class="source-line-no">1951</span><span id="line-1951"> return failedFuture(new ReplicationException("tableCfs is null"));</span>
<span class="source-line-no">1952</span><span id="line-1952"> }</span>
<span class="source-line-no">1953</span><span id="line-1953"></span>
<span class="source-line-no">1954</span><span id="line-1954"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;Void&gt;();</span>
<span class="source-line-no">1955</span><span id="line-1955"> addListener(getReplicationPeerConfig(id), (peerConfig, error) -&gt; {</span>
<span class="source-line-no">1956</span><span id="line-1956"> if (!completeExceptionally(future, error)) {</span>
<span class="source-line-no">1957</span><span id="line-1957"> ReplicationPeerConfig newPeerConfig = null;</span>
<span class="source-line-no">1958</span><span id="line-1958"> try {</span>
<span class="source-line-no">1959</span><span id="line-1959"> newPeerConfig = ReplicationPeerConfigUtil</span>
<span class="source-line-no">1960</span><span id="line-1960"> .removeTableCFsFromReplicationPeerConfig(tableCfs, peerConfig, id);</span>
<span class="source-line-no">1961</span><span id="line-1961"> } catch (ReplicationException e) {</span>
<span class="source-line-no">1962</span><span id="line-1962"> future.completeExceptionally(e);</span>
<span class="source-line-no">1963</span><span id="line-1963"> return;</span>
<span class="source-line-no">1964</span><span id="line-1964"> }</span>
<span class="source-line-no">1965</span><span id="line-1965"> addListener(updateReplicationPeerConfig(id, newPeerConfig), (result, err) -&gt; {</span>
<span class="source-line-no">1966</span><span id="line-1966"> if (!completeExceptionally(future, error)) {</span>
<span class="source-line-no">1967</span><span id="line-1967"> future.complete(result);</span>
<span class="source-line-no">1968</span><span id="line-1968"> }</span>
<span class="source-line-no">1969</span><span id="line-1969"> });</span>
<span class="source-line-no">1970</span><span id="line-1970"> }</span>
<span class="source-line-no">1971</span><span id="line-1971"> });</span>
<span class="source-line-no">1972</span><span id="line-1972"> return future;</span>
<span class="source-line-no">1973</span><span id="line-1973"> }</span>
<span class="source-line-no">1974</span><span id="line-1974"></span>
<span class="source-line-no">1975</span><span id="line-1975"> @Override</span>
<span class="source-line-no">1976</span><span id="line-1976"> public CompletableFuture&lt;List&lt;ReplicationPeerDescription&gt;&gt; listReplicationPeers() {</span>
<span class="source-line-no">1977</span><span id="line-1977"> return listReplicationPeers(RequestConverter.buildListReplicationPeersRequest(null));</span>
<span class="source-line-no">1978</span><span id="line-1978"> }</span>
<span class="source-line-no">1979</span><span id="line-1979"></span>
<span class="source-line-no">1980</span><span id="line-1980"> @Override</span>
<span class="source-line-no">1981</span><span id="line-1981"> public CompletableFuture&lt;List&lt;ReplicationPeerDescription&gt;&gt; listReplicationPeers(Pattern pattern) {</span>
<span class="source-line-no">1982</span><span id="line-1982"> Preconditions.checkNotNull(pattern,</span>
<span class="source-line-no">1983</span><span id="line-1983"> "pattern is null. If you don't specify a pattern, use listReplicationPeers() instead");</span>
<span class="source-line-no">1984</span><span id="line-1984"> return listReplicationPeers(RequestConverter.buildListReplicationPeersRequest(pattern));</span>
<span class="source-line-no">1985</span><span id="line-1985"> }</span>
<span class="source-line-no">1986</span><span id="line-1986"></span>
<span class="source-line-no">1987</span><span id="line-1987"> private CompletableFuture&lt;List&lt;ReplicationPeerDescription&gt;&gt;</span>
<span class="source-line-no">1988</span><span id="line-1988"> listReplicationPeers(ListReplicationPeersRequest request) {</span>
<span class="source-line-no">1989</span><span id="line-1989"> return this.&lt;List&lt;ReplicationPeerDescription&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">1990</span><span id="line-1990"> .action((controller, stub) -&gt; this.&lt;ListReplicationPeersRequest, ListReplicationPeersResponse,</span>
<span class="source-line-no">1991</span><span id="line-1991"> List&lt;ReplicationPeerDescription&gt;&gt; call(controller, stub, request,</span>
<span class="source-line-no">1992</span><span id="line-1992"> (s, c, req, done) -&gt; s.listReplicationPeers(c, req, done),</span>
<span class="source-line-no">1993</span><span id="line-1993"> (resp) -&gt; resp.getPeerDescList().stream()</span>
<span class="source-line-no">1994</span><span id="line-1994"> .map(ReplicationPeerConfigUtil::toReplicationPeerDescription)</span>
<span class="source-line-no">1995</span><span id="line-1995"> .collect(Collectors.toList())))</span>
<span class="source-line-no">1996</span><span id="line-1996"> .call();</span>
<span class="source-line-no">1997</span><span id="line-1997"> }</span>
<span class="source-line-no">1998</span><span id="line-1998"></span>
<span class="source-line-no">1999</span><span id="line-1999"> @Override</span>
<span class="source-line-no">2000</span><span id="line-2000"> public CompletableFuture&lt;List&lt;TableCFs&gt;&gt; listReplicatedTableCFs() {</span>
<span class="source-line-no">2001</span><span id="line-2001"> CompletableFuture&lt;List&lt;TableCFs&gt;&gt; future = new CompletableFuture&lt;List&lt;TableCFs&gt;&gt;();</span>
<span class="source-line-no">2002</span><span id="line-2002"> addListener(listTableDescriptors(), (tables, error) -&gt; {</span>
<span class="source-line-no">2003</span><span id="line-2003"> if (!completeExceptionally(future, error)) {</span>
<span class="source-line-no">2004</span><span id="line-2004"> List&lt;TableCFs&gt; replicatedTableCFs = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">2005</span><span id="line-2005"> tables.forEach(table -&gt; {</span>
<span class="source-line-no">2006</span><span id="line-2006"> Map&lt;String, Integer&gt; cfs = new HashMap&lt;&gt;();</span>
<span class="source-line-no">2007</span><span id="line-2007"> Stream.of(table.getColumnFamilies())</span>
<span class="source-line-no">2008</span><span id="line-2008"> .filter(column -&gt; column.getScope() != HConstants.REPLICATION_SCOPE_LOCAL)</span>
<span class="source-line-no">2009</span><span id="line-2009"> .forEach(column -&gt; {</span>
<span class="source-line-no">2010</span><span id="line-2010"> cfs.put(column.getNameAsString(), column.getScope());</span>
<span class="source-line-no">2011</span><span id="line-2011"> });</span>
<span class="source-line-no">2012</span><span id="line-2012"> if (!cfs.isEmpty()) {</span>
<span class="source-line-no">2013</span><span id="line-2013"> replicatedTableCFs.add(new TableCFs(table.getTableName(), cfs));</span>
<span class="source-line-no">2014</span><span id="line-2014"> }</span>
<span class="source-line-no">2015</span><span id="line-2015"> });</span>
<span class="source-line-no">2016</span><span id="line-2016"> future.complete(replicatedTableCFs);</span>
<span class="source-line-no">2017</span><span id="line-2017"> }</span>
<span class="source-line-no">2018</span><span id="line-2018"> });</span>
<span class="source-line-no">2019</span><span id="line-2019"> return future;</span>
<span class="source-line-no">2020</span><span id="line-2020"> }</span>
<span class="source-line-no">2021</span><span id="line-2021"></span>
<span class="source-line-no">2022</span><span id="line-2022"> @Override</span>
<span class="source-line-no">2023</span><span id="line-2023"> public CompletableFuture&lt;Void&gt; snapshot(SnapshotDescription snapshotDesc) {</span>
<span class="source-line-no">2024</span><span id="line-2024"> SnapshotProtos.SnapshotDescription snapshot =</span>
<span class="source-line-no">2025</span><span id="line-2025"> ProtobufUtil.createHBaseProtosSnapshotDesc(snapshotDesc);</span>
<span class="source-line-no">2026</span><span id="line-2026"> try {</span>
<span class="source-line-no">2027</span><span id="line-2027"> ClientSnapshotDescriptionUtils.assertSnapshotRequestIsValid(snapshot);</span>
<span class="source-line-no">2028</span><span id="line-2028"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">2029</span><span id="line-2029"> return failedFuture(e);</span>
<span class="source-line-no">2030</span><span id="line-2030"> }</span>
<span class="source-line-no">2031</span><span id="line-2031"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2032</span><span id="line-2032"> final SnapshotRequest request = SnapshotRequest.newBuilder().setSnapshot(snapshot)</span>
<span class="source-line-no">2033</span><span id="line-2033"> .setNonceGroup(ng.getNonceGroup()).setNonce(ng.newNonce()).build();</span>
<span class="source-line-no">2034</span><span id="line-2034"> addListener(this.&lt;SnapshotResponse&gt; newMasterCaller()</span>
<span class="source-line-no">2035</span><span id="line-2035"> .action((controller, stub) -&gt; this.&lt;SnapshotRequest, SnapshotResponse, SnapshotResponse&gt; call(</span>
<span class="source-line-no">2036</span><span id="line-2036"> controller, stub, request, (s, c, req, done) -&gt; s.snapshot(c, req, done), resp -&gt; resp))</span>
<span class="source-line-no">2037</span><span id="line-2037"> .call(), (resp, err) -&gt; {</span>
<span class="source-line-no">2038</span><span id="line-2038"> if (err != null) {</span>
<span class="source-line-no">2039</span><span id="line-2039"> future.completeExceptionally(err);</span>
<span class="source-line-no">2040</span><span id="line-2040"> return;</span>
<span class="source-line-no">2041</span><span id="line-2041"> }</span>
<span class="source-line-no">2042</span><span id="line-2042"> waitSnapshotFinish(snapshotDesc, future, resp);</span>
<span class="source-line-no">2043</span><span id="line-2043"> });</span>
<span class="source-line-no">2044</span><span id="line-2044"> return future;</span>
<span class="source-line-no">2045</span><span id="line-2045"> }</span>
<span class="source-line-no">2046</span><span id="line-2046"></span>
<span class="source-line-no">2047</span><span id="line-2047"> // This is for keeping compatibility with old implementation.</span>
<span class="source-line-no">2048</span><span id="line-2048"> // If there is a procId field in the response, then the snapshot will be operated with a</span>
<span class="source-line-no">2049</span><span id="line-2049"> // SnapshotProcedure, otherwise the snapshot will be coordinated by zk.</span>
<span class="source-line-no">2050</span><span id="line-2050"> private void waitSnapshotFinish(SnapshotDescription snapshot, CompletableFuture&lt;Void&gt; future,</span>
<span class="source-line-no">2051</span><span id="line-2051"> SnapshotResponse resp) {</span>
<span class="source-line-no">2052</span><span id="line-2052"> if (resp.hasProcId()) {</span>
<span class="source-line-no">2053</span><span id="line-2053"> getProcedureResult(resp.getProcId(), future, 0);</span>
<span class="source-line-no">2054</span><span id="line-2054"> addListener(future, new SnapshotProcedureBiConsumer(snapshot.getTableName()));</span>
<span class="source-line-no">2055</span><span id="line-2055"> } else {</span>
<span class="source-line-no">2056</span><span id="line-2056"> long expectedTimeout = resp.getExpectedTimeout();</span>
<span class="source-line-no">2057</span><span id="line-2057"> TimerTask pollingTask = new TimerTask() {</span>
<span class="source-line-no">2058</span><span id="line-2058"> int tries = 0;</span>
<span class="source-line-no">2059</span><span id="line-2059"> long startTime = EnvironmentEdgeManager.currentTime();</span>
<span class="source-line-no">2060</span><span id="line-2060"> long endTime = startTime + expectedTimeout;</span>
<span class="source-line-no">2061</span><span id="line-2061"> long maxPauseTime = expectedTimeout / maxAttempts;</span>
<span class="source-line-no">2062</span><span id="line-2062"></span>
<span class="source-line-no">2063</span><span id="line-2063"> @Override</span>
<span class="source-line-no">2064</span><span id="line-2064"> public void run(Timeout timeout) throws Exception {</span>
<span class="source-line-no">2065</span><span id="line-2065"> if (EnvironmentEdgeManager.currentTime() &lt; endTime) {</span>
<span class="source-line-no">2066</span><span id="line-2066"> addListener(isSnapshotFinished(snapshot), (done, err2) -&gt; {</span>
<span class="source-line-no">2067</span><span id="line-2067"> if (err2 != null) {</span>
<span class="source-line-no">2068</span><span id="line-2068"> future.completeExceptionally(err2);</span>
<span class="source-line-no">2069</span><span id="line-2069"> } else if (done) {</span>
<span class="source-line-no">2070</span><span id="line-2070"> future.complete(null);</span>
<span class="source-line-no">2071</span><span id="line-2071"> } else {</span>
<span class="source-line-no">2072</span><span id="line-2072"> // retry again after pauseTime.</span>
<span class="source-line-no">2073</span><span id="line-2073"> long pauseTime =</span>
<span class="source-line-no">2074</span><span id="line-2074"> ConnectionUtils.getPauseTime(TimeUnit.NANOSECONDS.toMillis(pauseNs), ++tries);</span>
<span class="source-line-no">2075</span><span id="line-2075"> pauseTime = Math.min(pauseTime, maxPauseTime);</span>
<span class="source-line-no">2076</span><span id="line-2076"> AsyncConnectionImpl.RETRY_TIMER.newTimeout(this, pauseTime, TimeUnit.MILLISECONDS);</span>
<span class="source-line-no">2077</span><span id="line-2077"> }</span>
<span class="source-line-no">2078</span><span id="line-2078"> });</span>
<span class="source-line-no">2079</span><span id="line-2079"> } else {</span>
<span class="source-line-no">2080</span><span id="line-2080"> future</span>
<span class="source-line-no">2081</span><span id="line-2081"> .completeExceptionally(new SnapshotCreationException("Snapshot '" + snapshot.getName()</span>
<span class="source-line-no">2082</span><span id="line-2082"> + "' wasn't completed in expectedTime:" + expectedTimeout + " ms", snapshot));</span>
<span class="source-line-no">2083</span><span id="line-2083"> }</span>
<span class="source-line-no">2084</span><span id="line-2084"> }</span>
<span class="source-line-no">2085</span><span id="line-2085"> };</span>
<span class="source-line-no">2086</span><span id="line-2086"> AsyncConnectionImpl.RETRY_TIMER.newTimeout(pollingTask, 1, TimeUnit.MILLISECONDS);</span>
<span class="source-line-no">2087</span><span id="line-2087"> }</span>
<span class="source-line-no">2088</span><span id="line-2088"> }</span>
<span class="source-line-no">2089</span><span id="line-2089"></span>
<span class="source-line-no">2090</span><span id="line-2090"> @Override</span>
<span class="source-line-no">2091</span><span id="line-2091"> public CompletableFuture&lt;Boolean&gt; isSnapshotFinished(SnapshotDescription snapshot) {</span>
<span class="source-line-no">2092</span><span id="line-2092"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">2093</span><span id="line-2093"> .action((controller, stub) -&gt; this.&lt;IsSnapshotDoneRequest, IsSnapshotDoneResponse,</span>
<span class="source-line-no">2094</span><span id="line-2094"> Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">2095</span><span id="line-2095"> IsSnapshotDoneRequest.newBuilder()</span>
<span class="source-line-no">2096</span><span id="line-2096"> .setSnapshot(ProtobufUtil.createHBaseProtosSnapshotDesc(snapshot)).build(),</span>
<span class="source-line-no">2097</span><span id="line-2097"> (s, c, req, done) -&gt; s.isSnapshotDone(c, req, done), resp -&gt; resp.getDone()))</span>
<span class="source-line-no">2098</span><span id="line-2098"> .call();</span>
<span class="source-line-no">2099</span><span id="line-2099"> }</span>
<span class="source-line-no">2100</span><span id="line-2100"></span>
<span class="source-line-no">2101</span><span id="line-2101"> @Override</span>
<span class="source-line-no">2102</span><span id="line-2102"> public CompletableFuture&lt;Void&gt; restoreSnapshot(String snapshotName) {</span>
<span class="source-line-no">2103</span><span id="line-2103"> boolean takeFailSafeSnapshot = this.connection.getConfiguration().getBoolean(</span>
<span class="source-line-no">2104</span><span id="line-2104"> HConstants.SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT,</span>
<span class="source-line-no">2105</span><span id="line-2105"> HConstants.DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT);</span>
<span class="source-line-no">2106</span><span id="line-2106"> return restoreSnapshot(snapshotName, takeFailSafeSnapshot);</span>
<span class="source-line-no">2107</span><span id="line-2107"> }</span>
<span class="source-line-no">2108</span><span id="line-2108"></span>
<span class="source-line-no">2109</span><span id="line-2109"> @Override</span>
<span class="source-line-no">2110</span><span id="line-2110"> public CompletableFuture&lt;Void&gt; restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot,</span>
<span class="source-line-no">2111</span><span id="line-2111"> boolean restoreAcl) {</span>
<span class="source-line-no">2112</span><span id="line-2112"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2113</span><span id="line-2113"> addListener(listSnapshots(Pattern.compile(snapshotName)), (snapshotDescriptions, err) -&gt; {</span>
<span class="source-line-no">2114</span><span id="line-2114"> if (err != null) {</span>
<span class="source-line-no">2115</span><span id="line-2115"> future.completeExceptionally(err);</span>
<span class="source-line-no">2116</span><span id="line-2116"> return;</span>
<span class="source-line-no">2117</span><span id="line-2117"> }</span>
<span class="source-line-no">2118</span><span id="line-2118"> TableName tableName = null;</span>
<span class="source-line-no">2119</span><span id="line-2119"> if (snapshotDescriptions != null &amp;&amp; !snapshotDescriptions.isEmpty()) {</span>
<span class="source-line-no">2120</span><span id="line-2120"> for (SnapshotDescription snap : snapshotDescriptions) {</span>
<span class="source-line-no">2121</span><span id="line-2121"> if (snap.getName().equals(snapshotName)) {</span>
<span class="source-line-no">2122</span><span id="line-2122"> tableName = snap.getTableName();</span>
<span class="source-line-no">2123</span><span id="line-2123"> break;</span>
<span class="source-line-no">2124</span><span id="line-2124"> }</span>
<span class="source-line-no">2125</span><span id="line-2125"> }</span>
<span class="source-line-no">2126</span><span id="line-2126"> }</span>
<span class="source-line-no">2127</span><span id="line-2127"> if (tableName == null) {</span>
<span class="source-line-no">2128</span><span id="line-2128"> future.completeExceptionally(</span>
<span class="source-line-no">2129</span><span id="line-2129"> new RestoreSnapshotException("The snapshot " + snapshotName + " does not exist."));</span>
<span class="source-line-no">2130</span><span id="line-2130"> return;</span>
<span class="source-line-no">2131</span><span id="line-2131"> }</span>
<span class="source-line-no">2132</span><span id="line-2132"> final TableName finalTableName = tableName;</span>
<span class="source-line-no">2133</span><span id="line-2133"> addListener(tableExists(finalTableName), (exists, err2) -&gt; {</span>
<span class="source-line-no">2134</span><span id="line-2134"> if (err2 != null) {</span>
<span class="source-line-no">2135</span><span id="line-2135"> future.completeExceptionally(err2);</span>
<span class="source-line-no">2136</span><span id="line-2136"> } else if (!exists) {</span>
<span class="source-line-no">2137</span><span id="line-2137"> // if table does not exist, then just clone snapshot into new table.</span>
<span class="source-line-no">2138</span><span id="line-2138"> completeConditionalOnFuture(future,</span>
<span class="source-line-no">2139</span><span id="line-2139"> internalRestoreSnapshot(snapshotName, finalTableName, restoreAcl, null));</span>
<span class="source-line-no">2140</span><span id="line-2140"> } else {</span>
<span class="source-line-no">2141</span><span id="line-2141"> addListener(isTableDisabled(finalTableName), (disabled, err4) -&gt; {</span>
<span class="source-line-no">2142</span><span id="line-2142"> if (err4 != null) {</span>
<span class="source-line-no">2143</span><span id="line-2143"> future.completeExceptionally(err4);</span>
<span class="source-line-no">2144</span><span id="line-2144"> } else if (!disabled) {</span>
<span class="source-line-no">2145</span><span id="line-2145"> future.completeExceptionally(new TableNotDisabledException(finalTableName));</span>
<span class="source-line-no">2146</span><span id="line-2146"> } else {</span>
<span class="source-line-no">2147</span><span id="line-2147"> completeConditionalOnFuture(future,</span>
<span class="source-line-no">2148</span><span id="line-2148"> restoreSnapshot(snapshotName, finalTableName, takeFailSafeSnapshot, restoreAcl));</span>
<span class="source-line-no">2149</span><span id="line-2149"> }</span>
<span class="source-line-no">2150</span><span id="line-2150"> });</span>
<span class="source-line-no">2151</span><span id="line-2151"> }</span>
<span class="source-line-no">2152</span><span id="line-2152"> });</span>
<span class="source-line-no">2153</span><span id="line-2153"> });</span>
<span class="source-line-no">2154</span><span id="line-2154"> return future;</span>
<span class="source-line-no">2155</span><span id="line-2155"> }</span>
<span class="source-line-no">2156</span><span id="line-2156"></span>
<span class="source-line-no">2157</span><span id="line-2157"> private CompletableFuture&lt;Void&gt; restoreSnapshot(String snapshotName, TableName tableName,</span>
<span class="source-line-no">2158</span><span id="line-2158"> boolean takeFailSafeSnapshot, boolean restoreAcl) {</span>
<span class="source-line-no">2159</span><span id="line-2159"> if (takeFailSafeSnapshot) {</span>
<span class="source-line-no">2160</span><span id="line-2160"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2161</span><span id="line-2161"> // Step.1 Take a snapshot of the current state</span>
<span class="source-line-no">2162</span><span id="line-2162"> String failSafeSnapshotSnapshotNameFormat =</span>
<span class="source-line-no">2163</span><span id="line-2163"> this.connection.getConfiguration().get(HConstants.SNAPSHOT_RESTORE_FAILSAFE_NAME,</span>
<span class="source-line-no">2164</span><span id="line-2164"> HConstants.DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME);</span>
<span class="source-line-no">2165</span><span id="line-2165"> final String failSafeSnapshotSnapshotName =</span>
<span class="source-line-no">2166</span><span id="line-2166"> failSafeSnapshotSnapshotNameFormat.replace("{snapshot.name}", snapshotName)</span>
<span class="source-line-no">2167</span><span id="line-2167"> .replace("{table.name}", tableName.toString().replace(TableName.NAMESPACE_DELIM, '.'))</span>
<span class="source-line-no">2168</span><span id="line-2168"> .replace("{restore.timestamp}", String.valueOf(EnvironmentEdgeManager.currentTime()));</span>
<span class="source-line-no">2169</span><span id="line-2169"> LOG.info("Taking restore-failsafe snapshot: " + failSafeSnapshotSnapshotName);</span>
<span class="source-line-no">2170</span><span id="line-2170"> addListener(snapshot(failSafeSnapshotSnapshotName, tableName), (ret, err) -&gt; {</span>
<span class="source-line-no">2171</span><span id="line-2171"> if (err != null) {</span>
<span class="source-line-no">2172</span><span id="line-2172"> future.completeExceptionally(err);</span>
<span class="source-line-no">2173</span><span id="line-2173"> } else {</span>
<span class="source-line-no">2174</span><span id="line-2174"> // Step.2 Restore snapshot</span>
<span class="source-line-no">2175</span><span id="line-2175"> addListener(internalRestoreSnapshot(snapshotName, tableName, restoreAcl, null),</span>
<span class="source-line-no">2176</span><span id="line-2176"> (void2, err2) -&gt; {</span>
<span class="source-line-no">2177</span><span id="line-2177"> if (err2 != null) {</span>
<span class="source-line-no">2178</span><span id="line-2178"> // Step.3.a Something went wrong during the restore and try to rollback.</span>
<span class="source-line-no">2179</span><span id="line-2179"> addListener(internalRestoreSnapshot(failSafeSnapshotSnapshotName, tableName,</span>
<span class="source-line-no">2180</span><span id="line-2180"> restoreAcl, null), (void3, err3) -&gt; {</span>
<span class="source-line-no">2181</span><span id="line-2181"> if (err3 != null) {</span>
<span class="source-line-no">2182</span><span id="line-2182"> future.completeExceptionally(err3);</span>
<span class="source-line-no">2183</span><span id="line-2183"> } else {</span>
<span class="source-line-no">2184</span><span id="line-2184"> // If fail to restore snapshot but rollback successfully, delete the</span>
<span class="source-line-no">2185</span><span id="line-2185"> // restore-failsafe snapshot.</span>
<span class="source-line-no">2186</span><span id="line-2186"> LOG.info(</span>
<span class="source-line-no">2187</span><span id="line-2187"> "Deleting restore-failsafe snapshot: " + failSafeSnapshotSnapshotName);</span>
<span class="source-line-no">2188</span><span id="line-2188"> addListener(deleteSnapshot(failSafeSnapshotSnapshotName), (ret4, err4) -&gt; {</span>
<span class="source-line-no">2189</span><span id="line-2189"> if (err4 != null) {</span>
<span class="source-line-no">2190</span><span id="line-2190"> LOG.error("Unable to remove the failsafe snapshot: {}",</span>
<span class="source-line-no">2191</span><span id="line-2191"> failSafeSnapshotSnapshotName, err4);</span>
<span class="source-line-no">2192</span><span id="line-2192"> }</span>
<span class="source-line-no">2193</span><span id="line-2193"> String msg =</span>
<span class="source-line-no">2194</span><span id="line-2194"> "Restore snapshot=" + snapshotName + " failed, Rollback to snapshot="</span>
<span class="source-line-no">2195</span><span id="line-2195"> + failSafeSnapshotSnapshotName + " succeeded.";</span>
<span class="source-line-no">2196</span><span id="line-2196"> LOG.error(msg);</span>
<span class="source-line-no">2197</span><span id="line-2197"> future.completeExceptionally(new RestoreSnapshotException(msg, err2));</span>
<span class="source-line-no">2198</span><span id="line-2198"> });</span>
<span class="source-line-no">2199</span><span id="line-2199"> }</span>
<span class="source-line-no">2200</span><span id="line-2200"> });</span>
<span class="source-line-no">2201</span><span id="line-2201"> } else {</span>
<span class="source-line-no">2202</span><span id="line-2202"> // Step.3.b If the restore is succeeded, delete the pre-restore snapshot.</span>
<span class="source-line-no">2203</span><span id="line-2203"> LOG.info("Deleting restore-failsafe snapshot: " + failSafeSnapshotSnapshotName);</span>
<span class="source-line-no">2204</span><span id="line-2204"> addListener(deleteSnapshot(failSafeSnapshotSnapshotName), (ret3, err3) -&gt; {</span>
<span class="source-line-no">2205</span><span id="line-2205"> if (err3 != null) {</span>
<span class="source-line-no">2206</span><span id="line-2206"> LOG.error(</span>
<span class="source-line-no">2207</span><span id="line-2207"> "Unable to remove the failsafe snapshot: " + failSafeSnapshotSnapshotName,</span>
<span class="source-line-no">2208</span><span id="line-2208"> err3);</span>
<span class="source-line-no">2209</span><span id="line-2209"> }</span>
<span class="source-line-no">2210</span><span id="line-2210"> future.complete(ret3);</span>
<span class="source-line-no">2211</span><span id="line-2211"> });</span>
<span class="source-line-no">2212</span><span id="line-2212"> }</span>
<span class="source-line-no">2213</span><span id="line-2213"> });</span>
<span class="source-line-no">2214</span><span id="line-2214"> }</span>
<span class="source-line-no">2215</span><span id="line-2215"> });</span>
<span class="source-line-no">2216</span><span id="line-2216"> return future;</span>
<span class="source-line-no">2217</span><span id="line-2217"> } else {</span>
<span class="source-line-no">2218</span><span id="line-2218"> return internalRestoreSnapshot(snapshotName, tableName, restoreAcl, null);</span>
<span class="source-line-no">2219</span><span id="line-2219"> }</span>
<span class="source-line-no">2220</span><span id="line-2220"> }</span>
<span class="source-line-no">2221</span><span id="line-2221"></span>
<span class="source-line-no">2222</span><span id="line-2222"> private &lt;T&gt; void completeConditionalOnFuture(CompletableFuture&lt;T&gt; dependentFuture,</span>
<span class="source-line-no">2223</span><span id="line-2223"> CompletableFuture&lt;T&gt; parentFuture) {</span>
<span class="source-line-no">2224</span><span id="line-2224"> addListener(parentFuture, (res, err) -&gt; {</span>
<span class="source-line-no">2225</span><span id="line-2225"> if (err != null) {</span>
<span class="source-line-no">2226</span><span id="line-2226"> dependentFuture.completeExceptionally(err);</span>
<span class="source-line-no">2227</span><span id="line-2227"> } else {</span>
<span class="source-line-no">2228</span><span id="line-2228"> dependentFuture.complete(res);</span>
<span class="source-line-no">2229</span><span id="line-2229"> }</span>
<span class="source-line-no">2230</span><span id="line-2230"> });</span>
<span class="source-line-no">2231</span><span id="line-2231"> }</span>
<span class="source-line-no">2232</span><span id="line-2232"></span>
<span class="source-line-no">2233</span><span id="line-2233"> @Override</span>
<span class="source-line-no">2234</span><span id="line-2234"> public CompletableFuture&lt;Void&gt; cloneSnapshot(String snapshotName, TableName tableName,</span>
<span class="source-line-no">2235</span><span id="line-2235"> boolean restoreAcl, String customSFT) {</span>
<span class="source-line-no">2236</span><span id="line-2236"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2237</span><span id="line-2237"> addListener(tableExists(tableName), (exists, err) -&gt; {</span>
<span class="source-line-no">2238</span><span id="line-2238"> if (err != null) {</span>
<span class="source-line-no">2239</span><span id="line-2239"> future.completeExceptionally(err);</span>
<span class="source-line-no">2240</span><span id="line-2240"> } else if (exists) {</span>
<span class="source-line-no">2241</span><span id="line-2241"> future.completeExceptionally(new TableExistsException(tableName));</span>
<span class="source-line-no">2242</span><span id="line-2242"> } else {</span>
<span class="source-line-no">2243</span><span id="line-2243"> completeConditionalOnFuture(future,</span>
<span class="source-line-no">2244</span><span id="line-2244"> internalRestoreSnapshot(snapshotName, tableName, restoreAcl, customSFT));</span>
<span class="source-line-no">2245</span><span id="line-2245"> }</span>
<span class="source-line-no">2246</span><span id="line-2246"> });</span>
<span class="source-line-no">2247</span><span id="line-2247"> return future;</span>
<span class="source-line-no">2248</span><span id="line-2248"> }</span>
<span class="source-line-no">2249</span><span id="line-2249"></span>
<span class="source-line-no">2250</span><span id="line-2250"> private CompletableFuture&lt;Void&gt; internalRestoreSnapshot(String snapshotName, TableName tableName,</span>
<span class="source-line-no">2251</span><span id="line-2251"> boolean restoreAcl, String customSFT) {</span>
<span class="source-line-no">2252</span><span id="line-2252"> SnapshotProtos.SnapshotDescription snapshot = SnapshotProtos.SnapshotDescription.newBuilder()</span>
<span class="source-line-no">2253</span><span id="line-2253"> .setName(snapshotName).setTable(tableName.getNameAsString()).build();</span>
<span class="source-line-no">2254</span><span id="line-2254"> try {</span>
<span class="source-line-no">2255</span><span id="line-2255"> ClientSnapshotDescriptionUtils.assertSnapshotRequestIsValid(snapshot);</span>
<span class="source-line-no">2256</span><span id="line-2256"> } catch (IllegalArgumentException e) {</span>
<span class="source-line-no">2257</span><span id="line-2257"> return failedFuture(e);</span>
<span class="source-line-no">2258</span><span id="line-2258"> }</span>
<span class="source-line-no">2259</span><span id="line-2259"> RestoreSnapshotRequest.Builder builder =</span>
<span class="source-line-no">2260</span><span id="line-2260"> RestoreSnapshotRequest.newBuilder().setSnapshot(snapshot).setNonceGroup(ng.getNonceGroup())</span>
<span class="source-line-no">2261</span><span id="line-2261"> .setNonce(ng.newNonce()).setRestoreACL(restoreAcl);</span>
<span class="source-line-no">2262</span><span id="line-2262"> if (customSFT != null) {</span>
<span class="source-line-no">2263</span><span id="line-2263"> builder.setCustomSFT(customSFT);</span>
<span class="source-line-no">2264</span><span id="line-2264"> }</span>
<span class="source-line-no">2265</span><span id="line-2265"> return waitProcedureResult(this.&lt;Long&gt; newMasterCaller()</span>
<span class="source-line-no">2266</span><span id="line-2266"> .action((controller, stub) -&gt; this.&lt;RestoreSnapshotRequest, RestoreSnapshotResponse,</span>
<span class="source-line-no">2267</span><span id="line-2267"> Long&gt; call(controller, stub, builder.build(),</span>
<span class="source-line-no">2268</span><span id="line-2268"> (s, c, req, done) -&gt; s.restoreSnapshot(c, req, done), (resp) -&gt; resp.getProcId()))</span>
<span class="source-line-no">2269</span><span id="line-2269"> .call());</span>
<span class="source-line-no">2270</span><span id="line-2270"> }</span>
<span class="source-line-no">2271</span><span id="line-2271"></span>
<span class="source-line-no">2272</span><span id="line-2272"> @Override</span>
<span class="source-line-no">2273</span><span id="line-2273"> public CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; listSnapshots() {</span>
<span class="source-line-no">2274</span><span id="line-2274"> return getCompletedSnapshots(null);</span>
<span class="source-line-no">2275</span><span id="line-2275"> }</span>
<span class="source-line-no">2276</span><span id="line-2276"></span>
<span class="source-line-no">2277</span><span id="line-2277"> @Override</span>
<span class="source-line-no">2278</span><span id="line-2278"> public CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; listSnapshots(Pattern pattern) {</span>
<span class="source-line-no">2279</span><span id="line-2279"> Preconditions.checkNotNull(pattern,</span>
<span class="source-line-no">2280</span><span id="line-2280"> "pattern is null. If you don't specify a pattern, use listSnapshots() instead");</span>
<span class="source-line-no">2281</span><span id="line-2281"> return getCompletedSnapshots(pattern);</span>
<span class="source-line-no">2282</span><span id="line-2282"> }</span>
<span class="source-line-no">2283</span><span id="line-2283"></span>
<span class="source-line-no">2284</span><span id="line-2284"> private CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; getCompletedSnapshots(Pattern pattern) {</span>
<span class="source-line-no">2285</span><span id="line-2285"> return this.&lt;List&lt;SnapshotDescription&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">2286</span><span id="line-2286"> .action((controller, stub) -&gt; this.&lt;GetCompletedSnapshotsRequest,</span>
<span class="source-line-no">2287</span><span id="line-2287"> GetCompletedSnapshotsResponse, List&lt;SnapshotDescription&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">2288</span><span id="line-2288"> GetCompletedSnapshotsRequest.newBuilder().build(),</span>
<span class="source-line-no">2289</span><span id="line-2289"> (s, c, req, done) -&gt; s.getCompletedSnapshots(c, req, done),</span>
<span class="source-line-no">2290</span><span id="line-2290"> resp -&gt; ProtobufUtil.toSnapshotDescriptionList(resp, pattern)))</span>
<span class="source-line-no">2291</span><span id="line-2291"> .call();</span>
<span class="source-line-no">2292</span><span id="line-2292"> }</span>
<span class="source-line-no">2293</span><span id="line-2293"></span>
<span class="source-line-no">2294</span><span id="line-2294"> @Override</span>
<span class="source-line-no">2295</span><span id="line-2295"> public CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; listTableSnapshots(Pattern tableNamePattern) {</span>
<span class="source-line-no">2296</span><span id="line-2296"> Preconditions.checkNotNull(tableNamePattern, "tableNamePattern is null."</span>
<span class="source-line-no">2297</span><span id="line-2297"> + " If you don't specify a tableNamePattern, use listSnapshots() instead");</span>
<span class="source-line-no">2298</span><span id="line-2298"> return getCompletedSnapshots(tableNamePattern, null);</span>
<span class="source-line-no">2299</span><span id="line-2299"> }</span>
<span class="source-line-no">2300</span><span id="line-2300"></span>
<span class="source-line-no">2301</span><span id="line-2301"> @Override</span>
<span class="source-line-no">2302</span><span id="line-2302"> public CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; listTableSnapshots(Pattern tableNamePattern,</span>
<span class="source-line-no">2303</span><span id="line-2303"> Pattern snapshotNamePattern) {</span>
<span class="source-line-no">2304</span><span id="line-2304"> Preconditions.checkNotNull(tableNamePattern, "tableNamePattern is null."</span>
<span class="source-line-no">2305</span><span id="line-2305"> + " If you don't specify a tableNamePattern, use listSnapshots(Pattern) instead");</span>
<span class="source-line-no">2306</span><span id="line-2306"> Preconditions.checkNotNull(snapshotNamePattern, "snapshotNamePattern is null."</span>
<span class="source-line-no">2307</span><span id="line-2307"> + " If you don't specify a snapshotNamePattern, use listTableSnapshots(Pattern) instead");</span>
<span class="source-line-no">2308</span><span id="line-2308"> return getCompletedSnapshots(tableNamePattern, snapshotNamePattern);</span>
<span class="source-line-no">2309</span><span id="line-2309"> }</span>
<span class="source-line-no">2310</span><span id="line-2310"></span>
<span class="source-line-no">2311</span><span id="line-2311"> private CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt;</span>
<span class="source-line-no">2312</span><span id="line-2312"> getCompletedSnapshots(Pattern tableNamePattern, Pattern snapshotNamePattern) {</span>
<span class="source-line-no">2313</span><span id="line-2313"> CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2314</span><span id="line-2314"> addListener(listTableNames(tableNamePattern, false), (tableNames, err) -&gt; {</span>
<span class="source-line-no">2315</span><span id="line-2315"> if (err != null) {</span>
<span class="source-line-no">2316</span><span id="line-2316"> future.completeExceptionally(err);</span>
<span class="source-line-no">2317</span><span id="line-2317"> return;</span>
<span class="source-line-no">2318</span><span id="line-2318"> }</span>
<span class="source-line-no">2319</span><span id="line-2319"> if (tableNames == null || tableNames.size() &lt;= 0) {</span>
<span class="source-line-no">2320</span><span id="line-2320"> future.complete(Collections.emptyList());</span>
<span class="source-line-no">2321</span><span id="line-2321"> return;</span>
<span class="source-line-no">2322</span><span id="line-2322"> }</span>
<span class="source-line-no">2323</span><span id="line-2323"> addListener(getCompletedSnapshots(snapshotNamePattern), (snapshotDescList, err2) -&gt; {</span>
<span class="source-line-no">2324</span><span id="line-2324"> if (err2 != null) {</span>
<span class="source-line-no">2325</span><span id="line-2325"> future.completeExceptionally(err2);</span>
<span class="source-line-no">2326</span><span id="line-2326"> return;</span>
<span class="source-line-no">2327</span><span id="line-2327"> }</span>
<span class="source-line-no">2328</span><span id="line-2328"> if (snapshotDescList == null || snapshotDescList.isEmpty()) {</span>
<span class="source-line-no">2329</span><span id="line-2329"> future.complete(Collections.emptyList());</span>
<span class="source-line-no">2330</span><span id="line-2330"> return;</span>
<span class="source-line-no">2331</span><span id="line-2331"> }</span>
<span class="source-line-no">2332</span><span id="line-2332"> future.complete(snapshotDescList.stream()</span>
<span class="source-line-no">2333</span><span id="line-2333"> .filter(snap -&gt; (snap != null &amp;&amp; tableNames.contains(snap.getTableName())))</span>
<span class="source-line-no">2334</span><span id="line-2334"> .collect(Collectors.toList()));</span>
<span class="source-line-no">2335</span><span id="line-2335"> });</span>
<span class="source-line-no">2336</span><span id="line-2336"> });</span>
<span class="source-line-no">2337</span><span id="line-2337"> return future;</span>
<span class="source-line-no">2338</span><span id="line-2338"> }</span>
<span class="source-line-no">2339</span><span id="line-2339"></span>
<span class="source-line-no">2340</span><span id="line-2340"> @Override</span>
<span class="source-line-no">2341</span><span id="line-2341"> public CompletableFuture&lt;Void&gt; deleteSnapshot(String snapshotName) {</span>
<span class="source-line-no">2342</span><span id="line-2342"> return internalDeleteSnapshot(new SnapshotDescription(snapshotName));</span>
<span class="source-line-no">2343</span><span id="line-2343"> }</span>
<span class="source-line-no">2344</span><span id="line-2344"></span>
<span class="source-line-no">2345</span><span id="line-2345"> @Override</span>
<span class="source-line-no">2346</span><span id="line-2346"> public CompletableFuture&lt;Void&gt; deleteSnapshots() {</span>
<span class="source-line-no">2347</span><span id="line-2347"> return internalDeleteSnapshots(null, null);</span>
<span class="source-line-no">2348</span><span id="line-2348"> }</span>
<span class="source-line-no">2349</span><span id="line-2349"></span>
<span class="source-line-no">2350</span><span id="line-2350"> @Override</span>
<span class="source-line-no">2351</span><span id="line-2351"> public CompletableFuture&lt;Void&gt; deleteSnapshots(Pattern snapshotNamePattern) {</span>
<span class="source-line-no">2352</span><span id="line-2352"> Preconditions.checkNotNull(snapshotNamePattern, "snapshotNamePattern is null."</span>
<span class="source-line-no">2353</span><span id="line-2353"> + " If you don't specify a snapshotNamePattern, use deleteSnapshots() instead");</span>
<span class="source-line-no">2354</span><span id="line-2354"> return internalDeleteSnapshots(null, snapshotNamePattern);</span>
<span class="source-line-no">2355</span><span id="line-2355"> }</span>
<span class="source-line-no">2356</span><span id="line-2356"></span>
<span class="source-line-no">2357</span><span id="line-2357"> @Override</span>
<span class="source-line-no">2358</span><span id="line-2358"> public CompletableFuture&lt;Void&gt; deleteTableSnapshots(Pattern tableNamePattern) {</span>
<span class="source-line-no">2359</span><span id="line-2359"> Preconditions.checkNotNull(tableNamePattern, "tableNamePattern is null."</span>
<span class="source-line-no">2360</span><span id="line-2360"> + " If you don't specify a tableNamePattern, use deleteSnapshots() instead");</span>
<span class="source-line-no">2361</span><span id="line-2361"> return internalDeleteSnapshots(tableNamePattern, null);</span>
<span class="source-line-no">2362</span><span id="line-2362"> }</span>
<span class="source-line-no">2363</span><span id="line-2363"></span>
<span class="source-line-no">2364</span><span id="line-2364"> @Override</span>
<span class="source-line-no">2365</span><span id="line-2365"> public CompletableFuture&lt;Void&gt; deleteTableSnapshots(Pattern tableNamePattern,</span>
<span class="source-line-no">2366</span><span id="line-2366"> Pattern snapshotNamePattern) {</span>
<span class="source-line-no">2367</span><span id="line-2367"> Preconditions.checkNotNull(tableNamePattern, "tableNamePattern is null."</span>
<span class="source-line-no">2368</span><span id="line-2368"> + " If you don't specify a tableNamePattern, use deleteSnapshots(Pattern) instead");</span>
<span class="source-line-no">2369</span><span id="line-2369"> Preconditions.checkNotNull(snapshotNamePattern, "snapshotNamePattern is null."</span>
<span class="source-line-no">2370</span><span id="line-2370"> + " If you don't specify a snapshotNamePattern, use deleteSnapshots(Pattern) instead");</span>
<span class="source-line-no">2371</span><span id="line-2371"> return internalDeleteSnapshots(tableNamePattern, snapshotNamePattern);</span>
<span class="source-line-no">2372</span><span id="line-2372"> }</span>
<span class="source-line-no">2373</span><span id="line-2373"></span>
<span class="source-line-no">2374</span><span id="line-2374"> private CompletableFuture&lt;Void&gt; internalDeleteSnapshots(Pattern tableNamePattern,</span>
<span class="source-line-no">2375</span><span id="line-2375"> Pattern snapshotNamePattern) {</span>
<span class="source-line-no">2376</span><span id="line-2376"> CompletableFuture&lt;List&lt;SnapshotDescription&gt;&gt; listSnapshotsFuture;</span>
<span class="source-line-no">2377</span><span id="line-2377"> if (tableNamePattern == null) {</span>
<span class="source-line-no">2378</span><span id="line-2378"> listSnapshotsFuture = getCompletedSnapshots(snapshotNamePattern);</span>
<span class="source-line-no">2379</span><span id="line-2379"> } else {</span>
<span class="source-line-no">2380</span><span id="line-2380"> listSnapshotsFuture = getCompletedSnapshots(tableNamePattern, snapshotNamePattern);</span>
<span class="source-line-no">2381</span><span id="line-2381"> }</span>
<span class="source-line-no">2382</span><span id="line-2382"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2383</span><span id="line-2383"> addListener(listSnapshotsFuture, (snapshotDescriptions, err) -&gt; {</span>
<span class="source-line-no">2384</span><span id="line-2384"> if (err != null) {</span>
<span class="source-line-no">2385</span><span id="line-2385"> future.completeExceptionally(err);</span>
<span class="source-line-no">2386</span><span id="line-2386"> return;</span>
<span class="source-line-no">2387</span><span id="line-2387"> }</span>
<span class="source-line-no">2388</span><span id="line-2388"> if (snapshotDescriptions == null || snapshotDescriptions.isEmpty()) {</span>
<span class="source-line-no">2389</span><span id="line-2389"> future.complete(null);</span>
<span class="source-line-no">2390</span><span id="line-2390"> return;</span>
<span class="source-line-no">2391</span><span id="line-2391"> }</span>
<span class="source-line-no">2392</span><span id="line-2392"> addListener(CompletableFuture.allOf(snapshotDescriptions.stream()</span>
<span class="source-line-no">2393</span><span id="line-2393"> .map(this::internalDeleteSnapshot).toArray(CompletableFuture[]::new)), (v, e) -&gt; {</span>
<span class="source-line-no">2394</span><span id="line-2394"> if (e != null) {</span>
<span class="source-line-no">2395</span><span id="line-2395"> future.completeExceptionally(e);</span>
<span class="source-line-no">2396</span><span id="line-2396"> } else {</span>
<span class="source-line-no">2397</span><span id="line-2397"> future.complete(v);</span>
<span class="source-line-no">2398</span><span id="line-2398"> }</span>
<span class="source-line-no">2399</span><span id="line-2399"> });</span>
<span class="source-line-no">2400</span><span id="line-2400"> });</span>
<span class="source-line-no">2401</span><span id="line-2401"> return future;</span>
<span class="source-line-no">2402</span><span id="line-2402"> }</span>
<span class="source-line-no">2403</span><span id="line-2403"></span>
<span class="source-line-no">2404</span><span id="line-2404"> private CompletableFuture&lt;Void&gt; internalDeleteSnapshot(SnapshotDescription snapshot) {</span>
<span class="source-line-no">2405</span><span id="line-2405"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">2406</span><span id="line-2406"> .action((controller, stub) -&gt; this.&lt;DeleteSnapshotRequest, DeleteSnapshotResponse, Void&gt; call(</span>
<span class="source-line-no">2407</span><span id="line-2407"> controller, stub,</span>
<span class="source-line-no">2408</span><span id="line-2408"> DeleteSnapshotRequest.newBuilder()</span>
<span class="source-line-no">2409</span><span id="line-2409"> .setSnapshot(ProtobufUtil.createHBaseProtosSnapshotDesc(snapshot)).build(),</span>
<span class="source-line-no">2410</span><span id="line-2410"> (s, c, req, done) -&gt; s.deleteSnapshot(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">2411</span><span id="line-2411"> .call();</span>
<span class="source-line-no">2412</span><span id="line-2412"> }</span>
<span class="source-line-no">2413</span><span id="line-2413"></span>
<span class="source-line-no">2414</span><span id="line-2414"> @Override</span>
<span class="source-line-no">2415</span><span id="line-2415"> public CompletableFuture&lt;Void&gt; execProcedure(String signature, String instance,</span>
<span class="source-line-no">2416</span><span id="line-2416"> Map&lt;String, String&gt; props) {</span>
<span class="source-line-no">2417</span><span id="line-2417"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2418</span><span id="line-2418"> ProcedureDescription procDesc =</span>
<span class="source-line-no">2419</span><span id="line-2419"> ProtobufUtil.buildProcedureDescription(signature, instance, props);</span>
<span class="source-line-no">2420</span><span id="line-2420"> addListener(this.&lt;Long&gt; newMasterCaller()</span>
<span class="source-line-no">2421</span><span id="line-2421"> .action((controller, stub) -&gt; this.&lt;ExecProcedureRequest, ExecProcedureResponse, Long&gt; call(</span>
<span class="source-line-no">2422</span><span id="line-2422"> controller, stub, ExecProcedureRequest.newBuilder().setProcedure(procDesc).build(),</span>
<span class="source-line-no">2423</span><span id="line-2423"> (s, c, req, done) -&gt; s.execProcedure(c, req, done), resp -&gt; resp.getExpectedTimeout()))</span>
<span class="source-line-no">2424</span><span id="line-2424"> .call(), (expectedTimeout, err) -&gt; {</span>
<span class="source-line-no">2425</span><span id="line-2425"> if (err != null) {</span>
<span class="source-line-no">2426</span><span id="line-2426"> future.completeExceptionally(err);</span>
<span class="source-line-no">2427</span><span id="line-2427"> return;</span>
<span class="source-line-no">2428</span><span id="line-2428"> }</span>
<span class="source-line-no">2429</span><span id="line-2429"> TimerTask pollingTask = new TimerTask() {</span>
<span class="source-line-no">2430</span><span id="line-2430"> int tries = 0;</span>
<span class="source-line-no">2431</span><span id="line-2431"> long startTime = EnvironmentEdgeManager.currentTime();</span>
<span class="source-line-no">2432</span><span id="line-2432"> long endTime = startTime + expectedTimeout;</span>
<span class="source-line-no">2433</span><span id="line-2433"> long maxPauseTime = expectedTimeout / maxAttempts;</span>
<span class="source-line-no">2434</span><span id="line-2434"></span>
<span class="source-line-no">2435</span><span id="line-2435"> @Override</span>
<span class="source-line-no">2436</span><span id="line-2436"> public void run(Timeout timeout) throws Exception {</span>
<span class="source-line-no">2437</span><span id="line-2437"> if (EnvironmentEdgeManager.currentTime() &lt; endTime) {</span>
<span class="source-line-no">2438</span><span id="line-2438"> addListener(isProcedureFinished(signature, instance, props), (done, err2) -&gt; {</span>
<span class="source-line-no">2439</span><span id="line-2439"> if (err2 != null) {</span>
<span class="source-line-no">2440</span><span id="line-2440"> future.completeExceptionally(err2);</span>
<span class="source-line-no">2441</span><span id="line-2441"> return;</span>
<span class="source-line-no">2442</span><span id="line-2442"> }</span>
<span class="source-line-no">2443</span><span id="line-2443"> if (done) {</span>
<span class="source-line-no">2444</span><span id="line-2444"> future.complete(null);</span>
<span class="source-line-no">2445</span><span id="line-2445"> } else {</span>
<span class="source-line-no">2446</span><span id="line-2446"> // retry again after pauseTime.</span>
<span class="source-line-no">2447</span><span id="line-2447"> long pauseTime =</span>
<span class="source-line-no">2448</span><span id="line-2448"> ConnectionUtils.getPauseTime(TimeUnit.NANOSECONDS.toMillis(pauseNs), ++tries);</span>
<span class="source-line-no">2449</span><span id="line-2449"> pauseTime = Math.min(pauseTime, maxPauseTime);</span>
<span class="source-line-no">2450</span><span id="line-2450"> AsyncConnectionImpl.RETRY_TIMER.newTimeout(this, pauseTime,</span>
<span class="source-line-no">2451</span><span id="line-2451"> TimeUnit.MICROSECONDS);</span>
<span class="source-line-no">2452</span><span id="line-2452"> }</span>
<span class="source-line-no">2453</span><span id="line-2453"> });</span>
<span class="source-line-no">2454</span><span id="line-2454"> } else {</span>
<span class="source-line-no">2455</span><span id="line-2455"> future.completeExceptionally(new IOException("Procedure '" + signature + " : "</span>
<span class="source-line-no">2456</span><span id="line-2456"> + instance + "' wasn't completed in expectedTime:" + expectedTimeout + " ms"));</span>
<span class="source-line-no">2457</span><span id="line-2457"> }</span>
<span class="source-line-no">2458</span><span id="line-2458"> }</span>
<span class="source-line-no">2459</span><span id="line-2459"> };</span>
<span class="source-line-no">2460</span><span id="line-2460"> // Queue the polling task into RETRY_TIMER to poll procedure state asynchronously.</span>
<span class="source-line-no">2461</span><span id="line-2461"> AsyncConnectionImpl.RETRY_TIMER.newTimeout(pollingTask, 1, TimeUnit.MILLISECONDS);</span>
<span class="source-line-no">2462</span><span id="line-2462"> });</span>
<span class="source-line-no">2463</span><span id="line-2463"> return future;</span>
<span class="source-line-no">2464</span><span id="line-2464"> }</span>
<span class="source-line-no">2465</span><span id="line-2465"></span>
<span class="source-line-no">2466</span><span id="line-2466"> @Override</span>
<span class="source-line-no">2467</span><span id="line-2467"> public CompletableFuture&lt;byte[]&gt; execProcedureWithReturn(String signature, String instance,</span>
<span class="source-line-no">2468</span><span id="line-2468"> Map&lt;String, String&gt; props) {</span>
<span class="source-line-no">2469</span><span id="line-2469"> ProcedureDescription proDesc =</span>
<span class="source-line-no">2470</span><span id="line-2470"> ProtobufUtil.buildProcedureDescription(signature, instance, props);</span>
<span class="source-line-no">2471</span><span id="line-2471"> return this.&lt;byte[]&gt; newMasterCaller()</span>
<span class="source-line-no">2472</span><span id="line-2472"> .action((controller, stub) -&gt; this.&lt;ExecProcedureRequest, ExecProcedureResponse, byte[]&gt; call(</span>
<span class="source-line-no">2473</span><span id="line-2473"> controller, stub, ExecProcedureRequest.newBuilder().setProcedure(proDesc).build(),</span>
<span class="source-line-no">2474</span><span id="line-2474"> (s, c, req, done) -&gt; s.execProcedureWithRet(c, req, done),</span>
<span class="source-line-no">2475</span><span id="line-2475"> resp -&gt; resp.hasReturnData() ? resp.getReturnData().toByteArray() : null))</span>
<span class="source-line-no">2476</span><span id="line-2476"> .call();</span>
<span class="source-line-no">2477</span><span id="line-2477"> }</span>
<span class="source-line-no">2478</span><span id="line-2478"></span>
<span class="source-line-no">2479</span><span id="line-2479"> @Override</span>
<span class="source-line-no">2480</span><span id="line-2480"> public CompletableFuture&lt;Boolean&gt; isProcedureFinished(String signature, String instance,</span>
<span class="source-line-no">2481</span><span id="line-2481"> Map&lt;String, String&gt; props) {</span>
<span class="source-line-no">2482</span><span id="line-2482"> ProcedureDescription proDesc =</span>
<span class="source-line-no">2483</span><span id="line-2483"> ProtobufUtil.buildProcedureDescription(signature, instance, props);</span>
<span class="source-line-no">2484</span><span id="line-2484"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">2485</span><span id="line-2485"> .action(</span>
<span class="source-line-no">2486</span><span id="line-2486"> (controller, stub) -&gt; this.&lt;IsProcedureDoneRequest, IsProcedureDoneResponse, Boolean&gt; call(</span>
<span class="source-line-no">2487</span><span id="line-2487"> controller, stub, IsProcedureDoneRequest.newBuilder().setProcedure(proDesc).build(),</span>
<span class="source-line-no">2488</span><span id="line-2488"> (s, c, req, done) -&gt; s.isProcedureDone(c, req, done), resp -&gt; resp.getDone()))</span>
<span class="source-line-no">2489</span><span id="line-2489"> .call();</span>
<span class="source-line-no">2490</span><span id="line-2490"> }</span>
<span class="source-line-no">2491</span><span id="line-2491"></span>
<span class="source-line-no">2492</span><span id="line-2492"> @Override</span>
<span class="source-line-no">2493</span><span id="line-2493"> public CompletableFuture&lt;Boolean&gt; abortProcedure(long procId, boolean mayInterruptIfRunning) {</span>
<span class="source-line-no">2494</span><span id="line-2494"> return this.&lt;Boolean&gt; newMasterCaller().action(</span>
<span class="source-line-no">2495</span><span id="line-2495"> (controller, stub) -&gt; this.&lt;AbortProcedureRequest, AbortProcedureResponse, Boolean&gt; call(</span>
<span class="source-line-no">2496</span><span id="line-2496"> controller, stub, AbortProcedureRequest.newBuilder().setProcId(procId).build(),</span>
<span class="source-line-no">2497</span><span id="line-2497"> (s, c, req, done) -&gt; s.abortProcedure(c, req, done), resp -&gt; resp.getIsProcedureAborted()))</span>
<span class="source-line-no">2498</span><span id="line-2498"> .call();</span>
<span class="source-line-no">2499</span><span id="line-2499"> }</span>
<span class="source-line-no">2500</span><span id="line-2500"></span>
<span class="source-line-no">2501</span><span id="line-2501"> @Override</span>
<span class="source-line-no">2502</span><span id="line-2502"> public CompletableFuture&lt;String&gt; getProcedures() {</span>
<span class="source-line-no">2503</span><span id="line-2503"> return this.&lt;String&gt; newMasterCaller()</span>
<span class="source-line-no">2504</span><span id="line-2504"> .action((controller, stub) -&gt; this.&lt;GetProceduresRequest, GetProceduresResponse, String&gt; call(</span>
<span class="source-line-no">2505</span><span id="line-2505"> controller, stub, GetProceduresRequest.newBuilder().build(),</span>
<span class="source-line-no">2506</span><span id="line-2506"> (s, c, req, done) -&gt; s.getProcedures(c, req, done),</span>
<span class="source-line-no">2507</span><span id="line-2507"> resp -&gt; ProtobufUtil.toProcedureJson(resp.getProcedureList())))</span>
<span class="source-line-no">2508</span><span id="line-2508"> .call();</span>
<span class="source-line-no">2509</span><span id="line-2509"> }</span>
<span class="source-line-no">2510</span><span id="line-2510"></span>
<span class="source-line-no">2511</span><span id="line-2511"> @Override</span>
<span class="source-line-no">2512</span><span id="line-2512"> public CompletableFuture&lt;String&gt; getLocks() {</span>
<span class="source-line-no">2513</span><span id="line-2513"> return this.&lt;String&gt; newMasterCaller()</span>
<span class="source-line-no">2514</span><span id="line-2514"> .action(</span>
<span class="source-line-no">2515</span><span id="line-2515"> (controller, stub) -&gt; this.&lt;GetLocksRequest, GetLocksResponse, String&gt; call(controller,</span>
<span class="source-line-no">2516</span><span id="line-2516"> stub, GetLocksRequest.newBuilder().build(), (s, c, req, done) -&gt; s.getLocks(c, req, done),</span>
<span class="source-line-no">2517</span><span id="line-2517"> resp -&gt; ProtobufUtil.toLockJson(resp.getLockList())))</span>
<span class="source-line-no">2518</span><span id="line-2518"> .call();</span>
<span class="source-line-no">2519</span><span id="line-2519"> }</span>
<span class="source-line-no">2520</span><span id="line-2520"></span>
<span class="source-line-no">2521</span><span id="line-2521"> @Override</span>
<span class="source-line-no">2522</span><span id="line-2522"> public CompletableFuture&lt;Void&gt; decommissionRegionServers(List&lt;ServerName&gt; servers,</span>
<span class="source-line-no">2523</span><span id="line-2523"> boolean offload) {</span>
<span class="source-line-no">2524</span><span id="line-2524"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">2525</span><span id="line-2525"> .action((controller, stub) -&gt; this.&lt;DecommissionRegionServersRequest,</span>
<span class="source-line-no">2526</span><span id="line-2526"> DecommissionRegionServersResponse, Void&gt; call(controller, stub,</span>
<span class="source-line-no">2527</span><span id="line-2527"> RequestConverter.buildDecommissionRegionServersRequest(servers, offload),</span>
<span class="source-line-no">2528</span><span id="line-2528"> (s, c, req, done) -&gt; s.decommissionRegionServers(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">2529</span><span id="line-2529"> .call();</span>
<span class="source-line-no">2530</span><span id="line-2530"> }</span>
<span class="source-line-no">2531</span><span id="line-2531"></span>
<span class="source-line-no">2532</span><span id="line-2532"> @Override</span>
<span class="source-line-no">2533</span><span id="line-2533"> public CompletableFuture&lt;List&lt;ServerName&gt;&gt; listDecommissionedRegionServers() {</span>
<span class="source-line-no">2534</span><span id="line-2534"> return this.&lt;List&lt;ServerName&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">2535</span><span id="line-2535"> .action((controller, stub) -&gt; this.&lt;ListDecommissionedRegionServersRequest,</span>
<span class="source-line-no">2536</span><span id="line-2536"> ListDecommissionedRegionServersResponse, List&lt;ServerName&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">2537</span><span id="line-2537"> ListDecommissionedRegionServersRequest.newBuilder().build(),</span>
<span class="source-line-no">2538</span><span id="line-2538"> (s, c, req, done) -&gt; s.listDecommissionedRegionServers(c, req, done),</span>
<span class="source-line-no">2539</span><span id="line-2539"> resp -&gt; resp.getServerNameList().stream().map(ProtobufUtil::toServerName)</span>
<span class="source-line-no">2540</span><span id="line-2540"> .collect(Collectors.toList())))</span>
<span class="source-line-no">2541</span><span id="line-2541"> .call();</span>
<span class="source-line-no">2542</span><span id="line-2542"> }</span>
<span class="source-line-no">2543</span><span id="line-2543"></span>
<span class="source-line-no">2544</span><span id="line-2544"> @Override</span>
<span class="source-line-no">2545</span><span id="line-2545"> public CompletableFuture&lt;Void&gt; recommissionRegionServer(ServerName server,</span>
<span class="source-line-no">2546</span><span id="line-2546"> List&lt;byte[]&gt; encodedRegionNames) {</span>
<span class="source-line-no">2547</span><span id="line-2547"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">2548</span><span id="line-2548"> .action((controller, stub) -&gt; this.&lt;RecommissionRegionServerRequest,</span>
<span class="source-line-no">2549</span><span id="line-2549"> RecommissionRegionServerResponse, Void&gt; call(controller, stub,</span>
<span class="source-line-no">2550</span><span id="line-2550"> RequestConverter.buildRecommissionRegionServerRequest(server, encodedRegionNames),</span>
<span class="source-line-no">2551</span><span id="line-2551"> (s, c, req, done) -&gt; s.recommissionRegionServer(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">2552</span><span id="line-2552"> .call();</span>
<span class="source-line-no">2553</span><span id="line-2553"> }</span>
<span class="source-line-no">2554</span><span id="line-2554"></span>
<span class="source-line-no">2555</span><span id="line-2555"> /**</span>
<span class="source-line-no">2556</span><span id="line-2556"> * Get the region location for the passed region name. The region name may be a full region name</span>
<span class="source-line-no">2557</span><span id="line-2557"> * or encoded region name. If the region does not found, then it'll throw an</span>
<span class="source-line-no">2558</span><span id="line-2558"> * UnknownRegionException wrapped by a {@link CompletableFuture}</span>
<span class="source-line-no">2559</span><span id="line-2559"> * @param regionNameOrEncodedRegionName region name or encoded region name</span>
<span class="source-line-no">2560</span><span id="line-2560"> * @return region location, wrapped by a {@link CompletableFuture}</span>
<span class="source-line-no">2561</span><span id="line-2561"> */</span>
<span class="source-line-no">2562</span><span id="line-2562"> CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(byte[] regionNameOrEncodedRegionName) {</span>
<span class="source-line-no">2563</span><span id="line-2563"> if (regionNameOrEncodedRegionName == null) {</span>
<span class="source-line-no">2564</span><span id="line-2564"> return failedFuture(new IllegalArgumentException("Passed region name can't be null"));</span>
<span class="source-line-no">2565</span><span id="line-2565"> }</span>
<span class="source-line-no">2566</span><span id="line-2566"></span>
<span class="source-line-no">2567</span><span id="line-2567"> CompletableFuture&lt;Optional&lt;HRegionLocation&gt;&gt; future;</span>
<span class="source-line-no">2568</span><span id="line-2568"> if (RegionInfo.isEncodedRegionName(regionNameOrEncodedRegionName)) {</span>
<span class="source-line-no">2569</span><span id="line-2569"> String encodedName = Bytes.toString(regionNameOrEncodedRegionName);</span>
<span class="source-line-no">2570</span><span id="line-2570"> if (encodedName.length() &lt; RegionInfo.MD5_HEX_LENGTH) {</span>
<span class="source-line-no">2571</span><span id="line-2571"> // old format encodedName, should be meta region</span>
<span class="source-line-no">2572</span><span id="line-2572"> future = connection.registry.getMetaRegionLocations()</span>
<span class="source-line-no">2573</span><span id="line-2573"> .thenApply(locs -&gt; Stream.of(locs.getRegionLocations())</span>
<span class="source-line-no">2574</span><span id="line-2574"> .filter(loc -&gt; loc.getRegion().getEncodedName().equals(encodedName)).findFirst());</span>
<span class="source-line-no">2575</span><span id="line-2575"> } else {</span>
<span class="source-line-no">2576</span><span id="line-2576"> future = ClientMetaTableAccessor.getRegionLocationWithEncodedName(metaTable,</span>
<span class="source-line-no">2577</span><span id="line-2577"> regionNameOrEncodedRegionName);</span>
<span class="source-line-no">2578</span><span id="line-2578"> }</span>
<span class="source-line-no">2579</span><span id="line-2579"> } else {</span>
<span class="source-line-no">2580</span><span id="line-2580"> // Not all regionNameOrEncodedRegionName here is going to be a valid region name,</span>
<span class="source-line-no">2581</span><span id="line-2581"> // it needs to throw out IllegalArgumentException in case tableName is passed in.</span>
<span class="source-line-no">2582</span><span id="line-2582"> RegionInfo regionInfo;</span>
<span class="source-line-no">2583</span><span id="line-2583"> try {</span>
<span class="source-line-no">2584</span><span id="line-2584"> regionInfo =</span>
<span class="source-line-no">2585</span><span id="line-2585"> CatalogFamilyFormat.parseRegionInfoFromRegionName(regionNameOrEncodedRegionName);</span>
<span class="source-line-no">2586</span><span id="line-2586"> } catch (IOException ioe) {</span>
<span class="source-line-no">2587</span><span id="line-2587"> return failedFuture(new IllegalArgumentException(ioe.getMessage()));</span>
<span class="source-line-no">2588</span><span id="line-2588"> }</span>
<span class="source-line-no">2589</span><span id="line-2589"></span>
<span class="source-line-no">2590</span><span id="line-2590"> if (regionInfo.isMetaRegion()) {</span>
<span class="source-line-no">2591</span><span id="line-2591"> future = connection.registry.getMetaRegionLocations()</span>
<span class="source-line-no">2592</span><span id="line-2592"> .thenApply(locs -&gt; Stream.of(locs.getRegionLocations())</span>
<span class="source-line-no">2593</span><span id="line-2593"> .filter(loc -&gt; loc.getRegion().getReplicaId() == regionInfo.getReplicaId())</span>
<span class="source-line-no">2594</span><span id="line-2594"> .findFirst());</span>
<span class="source-line-no">2595</span><span id="line-2595"> } else {</span>
<span class="source-line-no">2596</span><span id="line-2596"> future =</span>
<span class="source-line-no">2597</span><span id="line-2597"> ClientMetaTableAccessor.getRegionLocation(metaTable, regionNameOrEncodedRegionName);</span>
<span class="source-line-no">2598</span><span id="line-2598"> }</span>
<span class="source-line-no">2599</span><span id="line-2599"> }</span>
<span class="source-line-no">2600</span><span id="line-2600"></span>
<span class="source-line-no">2601</span><span id="line-2601"> CompletableFuture&lt;HRegionLocation&gt; returnedFuture = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2602</span><span id="line-2602"> addListener(future, (location, err) -&gt; {</span>
<span class="source-line-no">2603</span><span id="line-2603"> if (err != null) {</span>
<span class="source-line-no">2604</span><span id="line-2604"> returnedFuture.completeExceptionally(err);</span>
<span class="source-line-no">2605</span><span id="line-2605"> return;</span>
<span class="source-line-no">2606</span><span id="line-2606"> }</span>
<span class="source-line-no">2607</span><span id="line-2607"> if (!location.isPresent() || location.get().getRegion() == null) {</span>
<span class="source-line-no">2608</span><span id="line-2608"> returnedFuture.completeExceptionally(</span>
<span class="source-line-no">2609</span><span id="line-2609"> new UnknownRegionException("Invalid region name or encoded region name: "</span>
<span class="source-line-no">2610</span><span id="line-2610"> + Bytes.toStringBinary(regionNameOrEncodedRegionName)));</span>
<span class="source-line-no">2611</span><span id="line-2611"> } else {</span>
<span class="source-line-no">2612</span><span id="line-2612"> returnedFuture.complete(location.get());</span>
<span class="source-line-no">2613</span><span id="line-2613"> }</span>
<span class="source-line-no">2614</span><span id="line-2614"> });</span>
<span class="source-line-no">2615</span><span id="line-2615"> return returnedFuture;</span>
<span class="source-line-no">2616</span><span id="line-2616"> }</span>
<span class="source-line-no">2617</span><span id="line-2617"></span>
<span class="source-line-no">2618</span><span id="line-2618"> /**</span>
<span class="source-line-no">2619</span><span id="line-2619"> * Get the region info for the passed region name. The region name may be a full region name or</span>
<span class="source-line-no">2620</span><span id="line-2620"> * encoded region name. If the region does not found, then it'll throw an UnknownRegionException</span>
<span class="source-line-no">2621</span><span id="line-2621"> * wrapped by a {@link CompletableFuture}</span>
<span class="source-line-no">2622</span><span id="line-2622"> * @return region info, wrapped by a {@link CompletableFuture}</span>
<span class="source-line-no">2623</span><span id="line-2623"> */</span>
<span class="source-line-no">2624</span><span id="line-2624"> private CompletableFuture&lt;RegionInfo&gt; getRegionInfo(byte[] regionNameOrEncodedRegionName) {</span>
<span class="source-line-no">2625</span><span id="line-2625"> if (regionNameOrEncodedRegionName == null) {</span>
<span class="source-line-no">2626</span><span id="line-2626"> return failedFuture(new IllegalArgumentException("Passed region name can't be null"));</span>
<span class="source-line-no">2627</span><span id="line-2627"> }</span>
<span class="source-line-no">2628</span><span id="line-2628"></span>
<span class="source-line-no">2629</span><span id="line-2629"> if (</span>
<span class="source-line-no">2630</span><span id="line-2630"> Bytes.equals(regionNameOrEncodedRegionName,</span>
<span class="source-line-no">2631</span><span id="line-2631"> RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName())</span>
<span class="source-line-no">2632</span><span id="line-2632"> || Bytes.equals(regionNameOrEncodedRegionName,</span>
<span class="source-line-no">2633</span><span id="line-2633"> RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedNameAsBytes())</span>
<span class="source-line-no">2634</span><span id="line-2634"> ) {</span>
<span class="source-line-no">2635</span><span id="line-2635"> return CompletableFuture.completedFuture(RegionInfoBuilder.FIRST_META_REGIONINFO);</span>
<span class="source-line-no">2636</span><span id="line-2636"> }</span>
<span class="source-line-no">2637</span><span id="line-2637"></span>
<span class="source-line-no">2638</span><span id="line-2638"> CompletableFuture&lt;RegionInfo&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">2639</span><span id="line-2639"> addListener(getRegionLocation(regionNameOrEncodedRegionName), (location, err) -&gt; {</span>
<span class="source-line-no">2640</span><span id="line-2640"> if (err != null) {</span>
<span class="source-line-no">2641</span><span id="line-2641"> future.completeExceptionally(err);</span>
<span class="source-line-no">2642</span><span id="line-2642"> } else {</span>
<span class="source-line-no">2643</span><span id="line-2643"> future.complete(location.getRegion());</span>
<span class="source-line-no">2644</span><span id="line-2644"> }</span>
<span class="source-line-no">2645</span><span id="line-2645"> });</span>
<span class="source-line-no">2646</span><span id="line-2646"> return future;</span>
<span class="source-line-no">2647</span><span id="line-2647"> }</span>
<span class="source-line-no">2648</span><span id="line-2648"></span>
<span class="source-line-no">2649</span><span id="line-2649"> private byte[][] getSplitKeys(byte[] startKey, byte[] endKey, int numRegions) {</span>
<span class="source-line-no">2650</span><span id="line-2650"> if (numRegions &lt; 3) {</span>
<span class="source-line-no">2651</span><span id="line-2651"> throw new IllegalArgumentException("Must create at least three regions");</span>
<span class="source-line-no">2652</span><span id="line-2652"> } else if (Bytes.compareTo(startKey, endKey) &gt;= 0) {</span>
<span class="source-line-no">2653</span><span id="line-2653"> throw new IllegalArgumentException("Start key must be smaller than end key");</span>
<span class="source-line-no">2654</span><span id="line-2654"> }</span>
<span class="source-line-no">2655</span><span id="line-2655"> if (numRegions == 3) {</span>
<span class="source-line-no">2656</span><span id="line-2656"> return new byte[][] { startKey, endKey };</span>
<span class="source-line-no">2657</span><span id="line-2657"> }</span>
<span class="source-line-no">2658</span><span id="line-2658"> byte[][] splitKeys = Bytes.split(startKey, endKey, numRegions - 3);</span>
<span class="source-line-no">2659</span><span id="line-2659"> if (splitKeys == null || splitKeys.length != numRegions - 1) {</span>
<span class="source-line-no">2660</span><span id="line-2660"> throw new IllegalArgumentException("Unable to split key range into enough regions");</span>
<span class="source-line-no">2661</span><span id="line-2661"> }</span>
<span class="source-line-no">2662</span><span id="line-2662"> return splitKeys;</span>
<span class="source-line-no">2663</span><span id="line-2663"> }</span>
<span class="source-line-no">2664</span><span id="line-2664"></span>
<span class="source-line-no">2665</span><span id="line-2665"> private void verifySplitKeys(byte[][] splitKeys) {</span>
<span class="source-line-no">2666</span><span id="line-2666"> Arrays.sort(splitKeys, Bytes.BYTES_COMPARATOR);</span>
<span class="source-line-no">2667</span><span id="line-2667"> // Verify there are no duplicate split keys</span>
<span class="source-line-no">2668</span><span id="line-2668"> byte[] lastKey = null;</span>
<span class="source-line-no">2669</span><span id="line-2669"> for (byte[] splitKey : splitKeys) {</span>
<span class="source-line-no">2670</span><span id="line-2670"> if (Bytes.compareTo(splitKey, HConstants.EMPTY_BYTE_ARRAY) == 0) {</span>
<span class="source-line-no">2671</span><span id="line-2671"> throw new IllegalArgumentException("Empty split key must not be passed in the split keys.");</span>
<span class="source-line-no">2672</span><span id="line-2672"> }</span>
<span class="source-line-no">2673</span><span id="line-2673"> if (lastKey != null &amp;&amp; Bytes.equals(splitKey, lastKey)) {</span>
<span class="source-line-no">2674</span><span id="line-2674"> throw new IllegalArgumentException("All split keys must be unique, " + "found duplicate: "</span>
<span class="source-line-no">2675</span><span id="line-2675"> + Bytes.toStringBinary(splitKey) + ", " + Bytes.toStringBinary(lastKey));</span>
<span class="source-line-no">2676</span><span id="line-2676"> }</span>
<span class="source-line-no">2677</span><span id="line-2677"> lastKey = splitKey;</span>
<span class="source-line-no">2678</span><span id="line-2678"> }</span>
<span class="source-line-no">2679</span><span id="line-2679"> }</span>
<span class="source-line-no">2680</span><span id="line-2680"></span>
<span class="source-line-no">2681</span><span id="line-2681"> private static abstract class ProcedureBiConsumer implements BiConsumer&lt;Void, Throwable&gt; {</span>
<span class="source-line-no">2682</span><span id="line-2682"></span>
<span class="source-line-no">2683</span><span id="line-2683"> abstract void onFinished();</span>
<span class="source-line-no">2684</span><span id="line-2684"></span>
<span class="source-line-no">2685</span><span id="line-2685"> abstract void onError(Throwable error);</span>
<span class="source-line-no">2686</span><span id="line-2686"></span>
<span class="source-line-no">2687</span><span id="line-2687"> @Override</span>
<span class="source-line-no">2688</span><span id="line-2688"> public void accept(Void v, Throwable error) {</span>
<span class="source-line-no">2689</span><span id="line-2689"> if (error != null) {</span>
<span class="source-line-no">2690</span><span id="line-2690"> onError(error);</span>
<span class="source-line-no">2691</span><span id="line-2691"> return;</span>
<span class="source-line-no">2692</span><span id="line-2692"> }</span>
<span class="source-line-no">2693</span><span id="line-2693"> onFinished();</span>
<span class="source-line-no">2694</span><span id="line-2694"> }</span>
<span class="source-line-no">2695</span><span id="line-2695"> }</span>
<span class="source-line-no">2696</span><span id="line-2696"></span>
<span class="source-line-no">2697</span><span id="line-2697"> private static abstract class TableProcedureBiConsumer extends ProcedureBiConsumer {</span>
<span class="source-line-no">2698</span><span id="line-2698"> protected final TableName tableName;</span>
<span class="source-line-no">2699</span><span id="line-2699"></span>
<span class="source-line-no">2700</span><span id="line-2700"> TableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2701</span><span id="line-2701"> this.tableName = tableName;</span>
<span class="source-line-no">2702</span><span id="line-2702"> }</span>
<span class="source-line-no">2703</span><span id="line-2703"></span>
<span class="source-line-no">2704</span><span id="line-2704"> abstract String getOperationType();</span>
<span class="source-line-no">2705</span><span id="line-2705"></span>
<span class="source-line-no">2706</span><span id="line-2706"> String getDescription() {</span>
<span class="source-line-no">2707</span><span id="line-2707"> return "Operation: " + getOperationType() + ", " + "Table Name: "</span>
<span class="source-line-no">2708</span><span id="line-2708"> + tableName.getNameWithNamespaceInclAsString();</span>
<span class="source-line-no">2709</span><span id="line-2709"> }</span>
<span class="source-line-no">2710</span><span id="line-2710"></span>
<span class="source-line-no">2711</span><span id="line-2711"> @Override</span>
<span class="source-line-no">2712</span><span id="line-2712"> void onFinished() {</span>
<span class="source-line-no">2713</span><span id="line-2713"> LOG.info(getDescription() + " completed");</span>
<span class="source-line-no">2714</span><span id="line-2714"> }</span>
<span class="source-line-no">2715</span><span id="line-2715"></span>
<span class="source-line-no">2716</span><span id="line-2716"> @Override</span>
<span class="source-line-no">2717</span><span id="line-2717"> void onError(Throwable error) {</span>
<span class="source-line-no">2718</span><span id="line-2718"> LOG.info(getDescription() + " failed with " + error.getMessage());</span>
<span class="source-line-no">2719</span><span id="line-2719"> }</span>
<span class="source-line-no">2720</span><span id="line-2720"> }</span>
<span class="source-line-no">2721</span><span id="line-2721"></span>
<span class="source-line-no">2722</span><span id="line-2722"> private static abstract class NamespaceProcedureBiConsumer extends ProcedureBiConsumer {</span>
<span class="source-line-no">2723</span><span id="line-2723"> protected final String namespaceName;</span>
<span class="source-line-no">2724</span><span id="line-2724"></span>
<span class="source-line-no">2725</span><span id="line-2725"> NamespaceProcedureBiConsumer(String namespaceName) {</span>
<span class="source-line-no">2726</span><span id="line-2726"> this.namespaceName = namespaceName;</span>
<span class="source-line-no">2727</span><span id="line-2727"> }</span>
<span class="source-line-no">2728</span><span id="line-2728"></span>
<span class="source-line-no">2729</span><span id="line-2729"> abstract String getOperationType();</span>
<span class="source-line-no">2730</span><span id="line-2730"></span>
<span class="source-line-no">2731</span><span id="line-2731"> String getDescription() {</span>
<span class="source-line-no">2732</span><span id="line-2732"> return "Operation: " + getOperationType() + ", Namespace: " + namespaceName;</span>
<span class="source-line-no">2733</span><span id="line-2733"> }</span>
<span class="source-line-no">2734</span><span id="line-2734"></span>
<span class="source-line-no">2735</span><span id="line-2735"> @Override</span>
<span class="source-line-no">2736</span><span id="line-2736"> void onFinished() {</span>
<span class="source-line-no">2737</span><span id="line-2737"> LOG.info(getDescription() + " completed");</span>
<span class="source-line-no">2738</span><span id="line-2738"> }</span>
<span class="source-line-no">2739</span><span id="line-2739"></span>
<span class="source-line-no">2740</span><span id="line-2740"> @Override</span>
<span class="source-line-no">2741</span><span id="line-2741"> void onError(Throwable error) {</span>
<span class="source-line-no">2742</span><span id="line-2742"> LOG.info(getDescription() + " failed with " + error.getMessage());</span>
<span class="source-line-no">2743</span><span id="line-2743"> }</span>
<span class="source-line-no">2744</span><span id="line-2744"> }</span>
<span class="source-line-no">2745</span><span id="line-2745"></span>
<span class="source-line-no">2746</span><span id="line-2746"> private static class CreateTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2747</span><span id="line-2747"></span>
<span class="source-line-no">2748</span><span id="line-2748"> CreateTableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2749</span><span id="line-2749"> super(tableName);</span>
<span class="source-line-no">2750</span><span id="line-2750"> }</span>
<span class="source-line-no">2751</span><span id="line-2751"></span>
<span class="source-line-no">2752</span><span id="line-2752"> @Override</span>
<span class="source-line-no">2753</span><span id="line-2753"> String getOperationType() {</span>
<span class="source-line-no">2754</span><span id="line-2754"> return "CREATE";</span>
<span class="source-line-no">2755</span><span id="line-2755"> }</span>
<span class="source-line-no">2756</span><span id="line-2756"> }</span>
<span class="source-line-no">2757</span><span id="line-2757"></span>
<span class="source-line-no">2758</span><span id="line-2758"> private static class ModifyTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2759</span><span id="line-2759"></span>
<span class="source-line-no">2760</span><span id="line-2760"> ModifyTableProcedureBiConsumer(AsyncAdmin admin, TableName tableName) {</span>
<span class="source-line-no">2761</span><span id="line-2761"> super(tableName);</span>
<span class="source-line-no">2762</span><span id="line-2762"> }</span>
<span class="source-line-no">2763</span><span id="line-2763"></span>
<span class="source-line-no">2764</span><span id="line-2764"> @Override</span>
<span class="source-line-no">2765</span><span id="line-2765"> String getOperationType() {</span>
<span class="source-line-no">2766</span><span id="line-2766"> return "MODIFY";</span>
<span class="source-line-no">2767</span><span id="line-2767"> }</span>
<span class="source-line-no">2768</span><span id="line-2768"> }</span>
<span class="source-line-no">2769</span><span id="line-2769"></span>
<span class="source-line-no">2770</span><span id="line-2770"> private static class ModifyTableStoreFileTrackerProcedureBiConsumer</span>
<span class="source-line-no">2771</span><span id="line-2771"> extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2772</span><span id="line-2772"></span>
<span class="source-line-no">2773</span><span id="line-2773"> ModifyTableStoreFileTrackerProcedureBiConsumer(AsyncAdmin admin, TableName tableName) {</span>
<span class="source-line-no">2774</span><span id="line-2774"> super(tableName);</span>
<span class="source-line-no">2775</span><span id="line-2775"> }</span>
<span class="source-line-no">2776</span><span id="line-2776"></span>
<span class="source-line-no">2777</span><span id="line-2777"> @Override</span>
<span class="source-line-no">2778</span><span id="line-2778"> String getOperationType() {</span>
<span class="source-line-no">2779</span><span id="line-2779"> return "MODIFY_TABLE_STORE_FILE_TRACKER";</span>
<span class="source-line-no">2780</span><span id="line-2780"> }</span>
<span class="source-line-no">2781</span><span id="line-2781"> }</span>
<span class="source-line-no">2782</span><span id="line-2782"></span>
<span class="source-line-no">2783</span><span id="line-2783"> private class DeleteTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2784</span><span id="line-2784"></span>
<span class="source-line-no">2785</span><span id="line-2785"> DeleteTableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2786</span><span id="line-2786"> super(tableName);</span>
<span class="source-line-no">2787</span><span id="line-2787"> }</span>
<span class="source-line-no">2788</span><span id="line-2788"></span>
<span class="source-line-no">2789</span><span id="line-2789"> @Override</span>
<span class="source-line-no">2790</span><span id="line-2790"> String getOperationType() {</span>
<span class="source-line-no">2791</span><span id="line-2791"> return "DELETE";</span>
<span class="source-line-no">2792</span><span id="line-2792"> }</span>
<span class="source-line-no">2793</span><span id="line-2793"></span>
<span class="source-line-no">2794</span><span id="line-2794"> @Override</span>
<span class="source-line-no">2795</span><span id="line-2795"> void onFinished() {</span>
<span class="source-line-no">2796</span><span id="line-2796"> connection.getLocator().clearCache(this.tableName);</span>
<span class="source-line-no">2797</span><span id="line-2797"> super.onFinished();</span>
<span class="source-line-no">2798</span><span id="line-2798"> }</span>
<span class="source-line-no">2799</span><span id="line-2799"> }</span>
<span class="source-line-no">2800</span><span id="line-2800"></span>
<span class="source-line-no">2801</span><span id="line-2801"> private static class TruncateTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2802</span><span id="line-2802"></span>
<span class="source-line-no">2803</span><span id="line-2803"> TruncateTableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2804</span><span id="line-2804"> super(tableName);</span>
<span class="source-line-no">2805</span><span id="line-2805"> }</span>
<span class="source-line-no">2806</span><span id="line-2806"></span>
<span class="source-line-no">2807</span><span id="line-2807"> @Override</span>
<span class="source-line-no">2808</span><span id="line-2808"> String getOperationType() {</span>
<span class="source-line-no">2809</span><span id="line-2809"> return "TRUNCATE";</span>
<span class="source-line-no">2810</span><span id="line-2810"> }</span>
<span class="source-line-no">2811</span><span id="line-2811"> }</span>
<span class="source-line-no">2812</span><span id="line-2812"></span>
<span class="source-line-no">2813</span><span id="line-2813"> private static class EnableTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2814</span><span id="line-2814"></span>
<span class="source-line-no">2815</span><span id="line-2815"> EnableTableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2816</span><span id="line-2816"> super(tableName);</span>
<span class="source-line-no">2817</span><span id="line-2817"> }</span>
<span class="source-line-no">2818</span><span id="line-2818"></span>
<span class="source-line-no">2819</span><span id="line-2819"> @Override</span>
<span class="source-line-no">2820</span><span id="line-2820"> String getOperationType() {</span>
<span class="source-line-no">2821</span><span id="line-2821"> return "ENABLE";</span>
<span class="source-line-no">2822</span><span id="line-2822"> }</span>
<span class="source-line-no">2823</span><span id="line-2823"> }</span>
<span class="source-line-no">2824</span><span id="line-2824"></span>
<span class="source-line-no">2825</span><span id="line-2825"> private static class DisableTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2826</span><span id="line-2826"></span>
<span class="source-line-no">2827</span><span id="line-2827"> DisableTableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2828</span><span id="line-2828"> super(tableName);</span>
<span class="source-line-no">2829</span><span id="line-2829"> }</span>
<span class="source-line-no">2830</span><span id="line-2830"></span>
<span class="source-line-no">2831</span><span id="line-2831"> @Override</span>
<span class="source-line-no">2832</span><span id="line-2832"> String getOperationType() {</span>
<span class="source-line-no">2833</span><span id="line-2833"> return "DISABLE";</span>
<span class="source-line-no">2834</span><span id="line-2834"> }</span>
<span class="source-line-no">2835</span><span id="line-2835"> }</span>
<span class="source-line-no">2836</span><span id="line-2836"></span>
<span class="source-line-no">2837</span><span id="line-2837"> private static class AddColumnFamilyProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2838</span><span id="line-2838"></span>
<span class="source-line-no">2839</span><span id="line-2839"> AddColumnFamilyProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2840</span><span id="line-2840"> super(tableName);</span>
<span class="source-line-no">2841</span><span id="line-2841"> }</span>
<span class="source-line-no">2842</span><span id="line-2842"></span>
<span class="source-line-no">2843</span><span id="line-2843"> @Override</span>
<span class="source-line-no">2844</span><span id="line-2844"> String getOperationType() {</span>
<span class="source-line-no">2845</span><span id="line-2845"> return "ADD_COLUMN_FAMILY";</span>
<span class="source-line-no">2846</span><span id="line-2846"> }</span>
<span class="source-line-no">2847</span><span id="line-2847"> }</span>
<span class="source-line-no">2848</span><span id="line-2848"></span>
<span class="source-line-no">2849</span><span id="line-2849"> private static class DeleteColumnFamilyProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2850</span><span id="line-2850"></span>
<span class="source-line-no">2851</span><span id="line-2851"> DeleteColumnFamilyProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2852</span><span id="line-2852"> super(tableName);</span>
<span class="source-line-no">2853</span><span id="line-2853"> }</span>
<span class="source-line-no">2854</span><span id="line-2854"></span>
<span class="source-line-no">2855</span><span id="line-2855"> @Override</span>
<span class="source-line-no">2856</span><span id="line-2856"> String getOperationType() {</span>
<span class="source-line-no">2857</span><span id="line-2857"> return "DELETE_COLUMN_FAMILY";</span>
<span class="source-line-no">2858</span><span id="line-2858"> }</span>
<span class="source-line-no">2859</span><span id="line-2859"> }</span>
<span class="source-line-no">2860</span><span id="line-2860"></span>
<span class="source-line-no">2861</span><span id="line-2861"> private static class ModifyColumnFamilyProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2862</span><span id="line-2862"></span>
<span class="source-line-no">2863</span><span id="line-2863"> ModifyColumnFamilyProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2864</span><span id="line-2864"> super(tableName);</span>
<span class="source-line-no">2865</span><span id="line-2865"> }</span>
<span class="source-line-no">2866</span><span id="line-2866"></span>
<span class="source-line-no">2867</span><span id="line-2867"> @Override</span>
<span class="source-line-no">2868</span><span id="line-2868"> String getOperationType() {</span>
<span class="source-line-no">2869</span><span id="line-2869"> return "MODIFY_COLUMN_FAMILY";</span>
<span class="source-line-no">2870</span><span id="line-2870"> }</span>
<span class="source-line-no">2871</span><span id="line-2871"> }</span>
<span class="source-line-no">2872</span><span id="line-2872"></span>
<span class="source-line-no">2873</span><span id="line-2873"> private static class ModifyColumnFamilyStoreFileTrackerProcedureBiConsumer</span>
<span class="source-line-no">2874</span><span id="line-2874"> extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2875</span><span id="line-2875"></span>
<span class="source-line-no">2876</span><span id="line-2876"> ModifyColumnFamilyStoreFileTrackerProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2877</span><span id="line-2877"> super(tableName);</span>
<span class="source-line-no">2878</span><span id="line-2878"> }</span>
<span class="source-line-no">2879</span><span id="line-2879"></span>
<span class="source-line-no">2880</span><span id="line-2880"> @Override</span>
<span class="source-line-no">2881</span><span id="line-2881"> String getOperationType() {</span>
<span class="source-line-no">2882</span><span id="line-2882"> return "MODIFY_COLUMN_FAMILY_STORE_FILE_TRACKER";</span>
<span class="source-line-no">2883</span><span id="line-2883"> }</span>
<span class="source-line-no">2884</span><span id="line-2884"> }</span>
<span class="source-line-no">2885</span><span id="line-2885"></span>
<span class="source-line-no">2886</span><span id="line-2886"> private static class FlushTableProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2887</span><span id="line-2887"></span>
<span class="source-line-no">2888</span><span id="line-2888"> FlushTableProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2889</span><span id="line-2889"> super(tableName);</span>
<span class="source-line-no">2890</span><span id="line-2890"> }</span>
<span class="source-line-no">2891</span><span id="line-2891"></span>
<span class="source-line-no">2892</span><span id="line-2892"> @Override</span>
<span class="source-line-no">2893</span><span id="line-2893"> String getOperationType() {</span>
<span class="source-line-no">2894</span><span id="line-2894"> return "FLUSH";</span>
<span class="source-line-no">2895</span><span id="line-2895"> }</span>
<span class="source-line-no">2896</span><span id="line-2896"> }</span>
<span class="source-line-no">2897</span><span id="line-2897"></span>
<span class="source-line-no">2898</span><span id="line-2898"> private static class CreateNamespaceProcedureBiConsumer extends NamespaceProcedureBiConsumer {</span>
<span class="source-line-no">2899</span><span id="line-2899"></span>
<span class="source-line-no">2900</span><span id="line-2900"> CreateNamespaceProcedureBiConsumer(String namespaceName) {</span>
<span class="source-line-no">2901</span><span id="line-2901"> super(namespaceName);</span>
<span class="source-line-no">2902</span><span id="line-2902"> }</span>
<span class="source-line-no">2903</span><span id="line-2903"></span>
<span class="source-line-no">2904</span><span id="line-2904"> @Override</span>
<span class="source-line-no">2905</span><span id="line-2905"> String getOperationType() {</span>
<span class="source-line-no">2906</span><span id="line-2906"> return "CREATE_NAMESPACE";</span>
<span class="source-line-no">2907</span><span id="line-2907"> }</span>
<span class="source-line-no">2908</span><span id="line-2908"> }</span>
<span class="source-line-no">2909</span><span id="line-2909"></span>
<span class="source-line-no">2910</span><span id="line-2910"> private static class DeleteNamespaceProcedureBiConsumer extends NamespaceProcedureBiConsumer {</span>
<span class="source-line-no">2911</span><span id="line-2911"></span>
<span class="source-line-no">2912</span><span id="line-2912"> DeleteNamespaceProcedureBiConsumer(String namespaceName) {</span>
<span class="source-line-no">2913</span><span id="line-2913"> super(namespaceName);</span>
<span class="source-line-no">2914</span><span id="line-2914"> }</span>
<span class="source-line-no">2915</span><span id="line-2915"></span>
<span class="source-line-no">2916</span><span id="line-2916"> @Override</span>
<span class="source-line-no">2917</span><span id="line-2917"> String getOperationType() {</span>
<span class="source-line-no">2918</span><span id="line-2918"> return "DELETE_NAMESPACE";</span>
<span class="source-line-no">2919</span><span id="line-2919"> }</span>
<span class="source-line-no">2920</span><span id="line-2920"> }</span>
<span class="source-line-no">2921</span><span id="line-2921"></span>
<span class="source-line-no">2922</span><span id="line-2922"> private static class ModifyNamespaceProcedureBiConsumer extends NamespaceProcedureBiConsumer {</span>
<span class="source-line-no">2923</span><span id="line-2923"></span>
<span class="source-line-no">2924</span><span id="line-2924"> ModifyNamespaceProcedureBiConsumer(String namespaceName) {</span>
<span class="source-line-no">2925</span><span id="line-2925"> super(namespaceName);</span>
<span class="source-line-no">2926</span><span id="line-2926"> }</span>
<span class="source-line-no">2927</span><span id="line-2927"></span>
<span class="source-line-no">2928</span><span id="line-2928"> @Override</span>
<span class="source-line-no">2929</span><span id="line-2929"> String getOperationType() {</span>
<span class="source-line-no">2930</span><span id="line-2930"> return "MODIFY_NAMESPACE";</span>
<span class="source-line-no">2931</span><span id="line-2931"> }</span>
<span class="source-line-no">2932</span><span id="line-2932"> }</span>
<span class="source-line-no">2933</span><span id="line-2933"></span>
<span class="source-line-no">2934</span><span id="line-2934"> private static class MergeTableRegionProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2935</span><span id="line-2935"></span>
<span class="source-line-no">2936</span><span id="line-2936"> MergeTableRegionProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2937</span><span id="line-2937"> super(tableName);</span>
<span class="source-line-no">2938</span><span id="line-2938"> }</span>
<span class="source-line-no">2939</span><span id="line-2939"></span>
<span class="source-line-no">2940</span><span id="line-2940"> @Override</span>
<span class="source-line-no">2941</span><span id="line-2941"> String getOperationType() {</span>
<span class="source-line-no">2942</span><span id="line-2942"> return "MERGE_REGIONS";</span>
<span class="source-line-no">2943</span><span id="line-2943"> }</span>
<span class="source-line-no">2944</span><span id="line-2944"> }</span>
<span class="source-line-no">2945</span><span id="line-2945"></span>
<span class="source-line-no">2946</span><span id="line-2946"> private static class SplitTableRegionProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2947</span><span id="line-2947"></span>
<span class="source-line-no">2948</span><span id="line-2948"> SplitTableRegionProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2949</span><span id="line-2949"> super(tableName);</span>
<span class="source-line-no">2950</span><span id="line-2950"> }</span>
<span class="source-line-no">2951</span><span id="line-2951"></span>
<span class="source-line-no">2952</span><span id="line-2952"> @Override</span>
<span class="source-line-no">2953</span><span id="line-2953"> String getOperationType() {</span>
<span class="source-line-no">2954</span><span id="line-2954"> return "SPLIT_REGION";</span>
<span class="source-line-no">2955</span><span id="line-2955"> }</span>
<span class="source-line-no">2956</span><span id="line-2956"> }</span>
<span class="source-line-no">2957</span><span id="line-2957"></span>
<span class="source-line-no">2958</span><span id="line-2958"> private static class TruncateRegionProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2959</span><span id="line-2959"></span>
<span class="source-line-no">2960</span><span id="line-2960"> TruncateRegionProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2961</span><span id="line-2961"> super(tableName);</span>
<span class="source-line-no">2962</span><span id="line-2962"> }</span>
<span class="source-line-no">2963</span><span id="line-2963"></span>
<span class="source-line-no">2964</span><span id="line-2964"> @Override</span>
<span class="source-line-no">2965</span><span id="line-2965"> String getOperationType() {</span>
<span class="source-line-no">2966</span><span id="line-2966"> return "TRUNCATE_REGION";</span>
<span class="source-line-no">2967</span><span id="line-2967"> }</span>
<span class="source-line-no">2968</span><span id="line-2968"> }</span>
<span class="source-line-no">2969</span><span id="line-2969"></span>
<span class="source-line-no">2970</span><span id="line-2970"> private static class SnapshotProcedureBiConsumer extends TableProcedureBiConsumer {</span>
<span class="source-line-no">2971</span><span id="line-2971"> SnapshotProcedureBiConsumer(TableName tableName) {</span>
<span class="source-line-no">2972</span><span id="line-2972"> super(tableName);</span>
<span class="source-line-no">2973</span><span id="line-2973"> }</span>
<span class="source-line-no">2974</span><span id="line-2974"></span>
<span class="source-line-no">2975</span><span id="line-2975"> @Override</span>
<span class="source-line-no">2976</span><span id="line-2976"> String getOperationType() {</span>
<span class="source-line-no">2977</span><span id="line-2977"> return "SNAPSHOT";</span>
<span class="source-line-no">2978</span><span id="line-2978"> }</span>
<span class="source-line-no">2979</span><span id="line-2979"> }</span>
<span class="source-line-no">2980</span><span id="line-2980"></span>
<span class="source-line-no">2981</span><span id="line-2981"> private static class ReplicationProcedureBiConsumer extends ProcedureBiConsumer {</span>
<span class="source-line-no">2982</span><span id="line-2982"> private final String peerId;</span>
<span class="source-line-no">2983</span><span id="line-2983"> private final Supplier&lt;String&gt; getOperation;</span>
<span class="source-line-no">2984</span><span id="line-2984"></span>
<span class="source-line-no">2985</span><span id="line-2985"> ReplicationProcedureBiConsumer(String peerId, Supplier&lt;String&gt; getOperation) {</span>
<span class="source-line-no">2986</span><span id="line-2986"> this.peerId = peerId;</span>
<span class="source-line-no">2987</span><span id="line-2987"> this.getOperation = getOperation;</span>
<span class="source-line-no">2988</span><span id="line-2988"> }</span>
<span class="source-line-no">2989</span><span id="line-2989"></span>
<span class="source-line-no">2990</span><span id="line-2990"> String getDescription() {</span>
<span class="source-line-no">2991</span><span id="line-2991"> return "Operation: " + getOperation.get() + ", peerId: " + peerId;</span>
<span class="source-line-no">2992</span><span id="line-2992"> }</span>
<span class="source-line-no">2993</span><span id="line-2993"></span>
<span class="source-line-no">2994</span><span id="line-2994"> @Override</span>
<span class="source-line-no">2995</span><span id="line-2995"> void onFinished() {</span>
<span class="source-line-no">2996</span><span id="line-2996"> LOG.info(getDescription() + " completed");</span>
<span class="source-line-no">2997</span><span id="line-2997"> }</span>
<span class="source-line-no">2998</span><span id="line-2998"></span>
<span class="source-line-no">2999</span><span id="line-2999"> @Override</span>
<span class="source-line-no">3000</span><span id="line-3000"> void onError(Throwable error) {</span>
<span class="source-line-no">3001</span><span id="line-3001"> LOG.info(getDescription() + " failed with " + error.getMessage());</span>
<span class="source-line-no">3002</span><span id="line-3002"> }</span>
<span class="source-line-no">3003</span><span id="line-3003"> }</span>
<span class="source-line-no">3004</span><span id="line-3004"></span>
<span class="source-line-no">3005</span><span id="line-3005"> private CompletableFuture&lt;Void&gt; waitProcedureResult(CompletableFuture&lt;Long&gt; procFuture) {</span>
<span class="source-line-no">3006</span><span id="line-3006"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3007</span><span id="line-3007"> addListener(procFuture, (procId, error) -&gt; {</span>
<span class="source-line-no">3008</span><span id="line-3008"> if (error != null) {</span>
<span class="source-line-no">3009</span><span id="line-3009"> future.completeExceptionally(error);</span>
<span class="source-line-no">3010</span><span id="line-3010"> return;</span>
<span class="source-line-no">3011</span><span id="line-3011"> }</span>
<span class="source-line-no">3012</span><span id="line-3012"> getProcedureResult(procId, future, 0);</span>
<span class="source-line-no">3013</span><span id="line-3013"> });</span>
<span class="source-line-no">3014</span><span id="line-3014"> return future;</span>
<span class="source-line-no">3015</span><span id="line-3015"> }</span>
<span class="source-line-no">3016</span><span id="line-3016"></span>
<span class="source-line-no">3017</span><span id="line-3017"> private void getProcedureResult(long procId, CompletableFuture&lt;Void&gt; future, int retries) {</span>
<span class="source-line-no">3018</span><span id="line-3018"> addListener(</span>
<span class="source-line-no">3019</span><span id="line-3019"> this.&lt;GetProcedureResultResponse&gt; newMasterCaller()</span>
<span class="source-line-no">3020</span><span id="line-3020"> .action((controller, stub) -&gt; this.&lt;GetProcedureResultRequest, GetProcedureResultResponse,</span>
<span class="source-line-no">3021</span><span id="line-3021"> GetProcedureResultResponse&gt; call(controller, stub,</span>
<span class="source-line-no">3022</span><span id="line-3022"> GetProcedureResultRequest.newBuilder().setProcId(procId).build(),</span>
<span class="source-line-no">3023</span><span id="line-3023"> (s, c, req, done) -&gt; s.getProcedureResult(c, req, done), (resp) -&gt; resp))</span>
<span class="source-line-no">3024</span><span id="line-3024"> .call(),</span>
<span class="source-line-no">3025</span><span id="line-3025"> (response, error) -&gt; {</span>
<span class="source-line-no">3026</span><span id="line-3026"> if (error != null) {</span>
<span class="source-line-no">3027</span><span id="line-3027"> LOG.warn("failed to get the procedure result procId={}", procId,</span>
<span class="source-line-no">3028</span><span id="line-3028"> ConnectionUtils.translateException(error));</span>
<span class="source-line-no">3029</span><span id="line-3029"> retryTimer.newTimeout(t -&gt; getProcedureResult(procId, future, retries + 1),</span>
<span class="source-line-no">3030</span><span id="line-3030"> ConnectionUtils.getPauseTime(pauseNs, retries), TimeUnit.NANOSECONDS);</span>
<span class="source-line-no">3031</span><span id="line-3031"> return;</span>
<span class="source-line-no">3032</span><span id="line-3032"> }</span>
<span class="source-line-no">3033</span><span id="line-3033"> if (response.getState() == GetProcedureResultResponse.State.RUNNING) {</span>
<span class="source-line-no">3034</span><span id="line-3034"> retryTimer.newTimeout(t -&gt; getProcedureResult(procId, future, retries + 1),</span>
<span class="source-line-no">3035</span><span id="line-3035"> ConnectionUtils.getPauseTime(pauseNs, retries), TimeUnit.NANOSECONDS);</span>
<span class="source-line-no">3036</span><span id="line-3036"> return;</span>
<span class="source-line-no">3037</span><span id="line-3037"> }</span>
<span class="source-line-no">3038</span><span id="line-3038"> if (response.hasException()) {</span>
<span class="source-line-no">3039</span><span id="line-3039"> IOException ioe = ForeignExceptionUtil.toIOException(response.getException());</span>
<span class="source-line-no">3040</span><span id="line-3040"> future.completeExceptionally(ioe);</span>
<span class="source-line-no">3041</span><span id="line-3041"> } else {</span>
<span class="source-line-no">3042</span><span id="line-3042"> future.complete(null);</span>
<span class="source-line-no">3043</span><span id="line-3043"> }</span>
<span class="source-line-no">3044</span><span id="line-3044"> });</span>
<span class="source-line-no">3045</span><span id="line-3045"> }</span>
<span class="source-line-no">3046</span><span id="line-3046"></span>
<span class="source-line-no">3047</span><span id="line-3047"> private &lt;T&gt; CompletableFuture&lt;T&gt; failedFuture(Throwable error) {</span>
<span class="source-line-no">3048</span><span id="line-3048"> CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3049</span><span id="line-3049"> future.completeExceptionally(error);</span>
<span class="source-line-no">3050</span><span id="line-3050"> return future;</span>
<span class="source-line-no">3051</span><span id="line-3051"> }</span>
<span class="source-line-no">3052</span><span id="line-3052"></span>
<span class="source-line-no">3053</span><span id="line-3053"> private &lt;T&gt; boolean completeExceptionally(CompletableFuture&lt;T&gt; future, Throwable error) {</span>
<span class="source-line-no">3054</span><span id="line-3054"> if (error != null) {</span>
<span class="source-line-no">3055</span><span id="line-3055"> future.completeExceptionally(error);</span>
<span class="source-line-no">3056</span><span id="line-3056"> return true;</span>
<span class="source-line-no">3057</span><span id="line-3057"> }</span>
<span class="source-line-no">3058</span><span id="line-3058"> return false;</span>
<span class="source-line-no">3059</span><span id="line-3059"> }</span>
<span class="source-line-no">3060</span><span id="line-3060"></span>
<span class="source-line-no">3061</span><span id="line-3061"> @Override</span>
<span class="source-line-no">3062</span><span id="line-3062"> public CompletableFuture&lt;ClusterMetrics&gt; getClusterMetrics() {</span>
<span class="source-line-no">3063</span><span id="line-3063"> return getClusterMetrics(EnumSet.allOf(Option.class));</span>
<span class="source-line-no">3064</span><span id="line-3064"> }</span>
<span class="source-line-no">3065</span><span id="line-3065"></span>
<span class="source-line-no">3066</span><span id="line-3066"> @Override</span>
<span class="source-line-no">3067</span><span id="line-3067"> public CompletableFuture&lt;ClusterMetrics&gt; getClusterMetrics(EnumSet&lt;Option&gt; options) {</span>
<span class="source-line-no">3068</span><span id="line-3068"> return this.&lt;ClusterMetrics&gt; newMasterCaller()</span>
<span class="source-line-no">3069</span><span id="line-3069"> .action((controller, stub) -&gt; this.&lt;GetClusterStatusRequest, GetClusterStatusResponse,</span>
<span class="source-line-no">3070</span><span id="line-3070"> ClusterMetrics&gt; call(controller, stub,</span>
<span class="source-line-no">3071</span><span id="line-3071"> RequestConverter.buildGetClusterStatusRequest(options),</span>
<span class="source-line-no">3072</span><span id="line-3072"> (s, c, req, done) -&gt; s.getClusterStatus(c, req, done),</span>
<span class="source-line-no">3073</span><span id="line-3073"> resp -&gt; ClusterMetricsBuilder.toClusterMetrics(resp.getClusterStatus())))</span>
<span class="source-line-no">3074</span><span id="line-3074"> .call();</span>
<span class="source-line-no">3075</span><span id="line-3075"> }</span>
<span class="source-line-no">3076</span><span id="line-3076"></span>
<span class="source-line-no">3077</span><span id="line-3077"> @Override</span>
<span class="source-line-no">3078</span><span id="line-3078"> public CompletableFuture&lt;Void&gt; shutdown() {</span>
<span class="source-line-no">3079</span><span id="line-3079"> return this.&lt;Void&gt; newMasterCaller().priority(HIGH_QOS)</span>
<span class="source-line-no">3080</span><span id="line-3080"> .action((controller, stub) -&gt; this.&lt;ShutdownRequest, ShutdownResponse, Void&gt; call(controller,</span>
<span class="source-line-no">3081</span><span id="line-3081"> stub, ShutdownRequest.newBuilder().build(), (s, c, req, done) -&gt; s.shutdown(c, req, done),</span>
<span class="source-line-no">3082</span><span id="line-3082"> resp -&gt; null))</span>
<span class="source-line-no">3083</span><span id="line-3083"> .call();</span>
<span class="source-line-no">3084</span><span id="line-3084"> }</span>
<span class="source-line-no">3085</span><span id="line-3085"></span>
<span class="source-line-no">3086</span><span id="line-3086"> @Override</span>
<span class="source-line-no">3087</span><span id="line-3087"> public CompletableFuture&lt;Void&gt; stopMaster() {</span>
<span class="source-line-no">3088</span><span id="line-3088"> return this.&lt;Void&gt; newMasterCaller().priority(HIGH_QOS)</span>
<span class="source-line-no">3089</span><span id="line-3089"> .action((controller, stub) -&gt; this.&lt;StopMasterRequest, StopMasterResponse, Void&gt; call(</span>
<span class="source-line-no">3090</span><span id="line-3090"> controller, stub, StopMasterRequest.newBuilder().build(),</span>
<span class="source-line-no">3091</span><span id="line-3091"> (s, c, req, done) -&gt; s.stopMaster(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">3092</span><span id="line-3092"> .call();</span>
<span class="source-line-no">3093</span><span id="line-3093"> }</span>
<span class="source-line-no">3094</span><span id="line-3094"></span>
<span class="source-line-no">3095</span><span id="line-3095"> @Override</span>
<span class="source-line-no">3096</span><span id="line-3096"> public CompletableFuture&lt;Void&gt; stopRegionServer(ServerName serverName) {</span>
<span class="source-line-no">3097</span><span id="line-3097"> StopServerRequest request = RequestConverter</span>
<span class="source-line-no">3098</span><span id="line-3098"> .buildStopServerRequest("Called by admin client " + this.connection.toString());</span>
<span class="source-line-no">3099</span><span id="line-3099"> return this.&lt;Void&gt; newAdminCaller().priority(HIGH_QOS)</span>
<span class="source-line-no">3100</span><span id="line-3100"> .action((controller, stub) -&gt; this.&lt;StopServerRequest, StopServerResponse, Void&gt; adminCall(</span>
<span class="source-line-no">3101</span><span id="line-3101"> controller, stub, request, (s, c, req, done) -&gt; s.stopServer(controller, req, done),</span>
<span class="source-line-no">3102</span><span id="line-3102"> resp -&gt; null))</span>
<span class="source-line-no">3103</span><span id="line-3103"> .serverName(serverName).call();</span>
<span class="source-line-no">3104</span><span id="line-3104"> }</span>
<span class="source-line-no">3105</span><span id="line-3105"></span>
<span class="source-line-no">3106</span><span id="line-3106"> @Override</span>
<span class="source-line-no">3107</span><span id="line-3107"> public CompletableFuture&lt;Void&gt; updateConfiguration(ServerName serverName) {</span>
<span class="source-line-no">3108</span><span id="line-3108"> return this.&lt;Void&gt; newAdminCaller()</span>
<span class="source-line-no">3109</span><span id="line-3109"> .action((controller, stub) -&gt; this.&lt;UpdateConfigurationRequest, UpdateConfigurationResponse,</span>
<span class="source-line-no">3110</span><span id="line-3110"> Void&gt; adminCall(controller, stub, UpdateConfigurationRequest.getDefaultInstance(),</span>
<span class="source-line-no">3111</span><span id="line-3111"> (s, c, req, done) -&gt; s.updateConfiguration(controller, req, done), resp -&gt; null))</span>
<span class="source-line-no">3112</span><span id="line-3112"> .serverName(serverName).call();</span>
<span class="source-line-no">3113</span><span id="line-3113"> }</span>
<span class="source-line-no">3114</span><span id="line-3114"></span>
<span class="source-line-no">3115</span><span id="line-3115"> @Override</span>
<span class="source-line-no">3116</span><span id="line-3116"> public CompletableFuture&lt;Void&gt; updateConfiguration() {</span>
<span class="source-line-no">3117</span><span id="line-3117"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;Void&gt;();</span>
<span class="source-line-no">3118</span><span id="line-3118"> addListener(</span>
<span class="source-line-no">3119</span><span id="line-3119"> getClusterMetrics(EnumSet.of(Option.SERVERS_NAME, Option.MASTER, Option.BACKUP_MASTERS)),</span>
<span class="source-line-no">3120</span><span id="line-3120"> (status, err) -&gt; {</span>
<span class="source-line-no">3121</span><span id="line-3121"> if (err != null) {</span>
<span class="source-line-no">3122</span><span id="line-3122"> future.completeExceptionally(err);</span>
<span class="source-line-no">3123</span><span id="line-3123"> } else {</span>
<span class="source-line-no">3124</span><span id="line-3124"> List&lt;CompletableFuture&lt;Void&gt;&gt; futures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">3125</span><span id="line-3125"> status.getServersName().forEach(server -&gt; futures.add(updateConfiguration(server)));</span>
<span class="source-line-no">3126</span><span id="line-3126"> futures.add(updateConfiguration(status.getMasterName()));</span>
<span class="source-line-no">3127</span><span id="line-3127"> status.getBackupMasterNames().forEach(master -&gt; futures.add(updateConfiguration(master)));</span>
<span class="source-line-no">3128</span><span id="line-3128"> addListener(</span>
<span class="source-line-no">3129</span><span id="line-3129"> CompletableFuture.allOf(futures.toArray(new CompletableFuture&lt;?&gt;[futures.size()])),</span>
<span class="source-line-no">3130</span><span id="line-3130"> (result, err2) -&gt; {</span>
<span class="source-line-no">3131</span><span id="line-3131"> if (err2 != null) {</span>
<span class="source-line-no">3132</span><span id="line-3132"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3133</span><span id="line-3133"> } else {</span>
<span class="source-line-no">3134</span><span id="line-3134"> future.complete(result);</span>
<span class="source-line-no">3135</span><span id="line-3135"> }</span>
<span class="source-line-no">3136</span><span id="line-3136"> });</span>
<span class="source-line-no">3137</span><span id="line-3137"> }</span>
<span class="source-line-no">3138</span><span id="line-3138"> });</span>
<span class="source-line-no">3139</span><span id="line-3139"> return future;</span>
<span class="source-line-no">3140</span><span id="line-3140"> }</span>
<span class="source-line-no">3141</span><span id="line-3141"></span>
<span class="source-line-no">3142</span><span id="line-3142"> @Override</span>
<span class="source-line-no">3143</span><span id="line-3143"> public CompletableFuture&lt;Void&gt; updateConfiguration(String groupName) {</span>
<span class="source-line-no">3144</span><span id="line-3144"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;Void&gt;();</span>
<span class="source-line-no">3145</span><span id="line-3145"> addListener(getRSGroup(groupName), (rsGroupInfo, err) -&gt; {</span>
<span class="source-line-no">3146</span><span id="line-3146"> if (err != null) {</span>
<span class="source-line-no">3147</span><span id="line-3147"> future.completeExceptionally(err);</span>
<span class="source-line-no">3148</span><span id="line-3148"> } else if (rsGroupInfo == null) {</span>
<span class="source-line-no">3149</span><span id="line-3149"> future.completeExceptionally(</span>
<span class="source-line-no">3150</span><span id="line-3150"> new IllegalArgumentException("Group does not exist: " + groupName));</span>
<span class="source-line-no">3151</span><span id="line-3151"> } else {</span>
<span class="source-line-no">3152</span><span id="line-3152"> addListener(getClusterMetrics(EnumSet.of(Option.SERVERS_NAME)), (status, err2) -&gt; {</span>
<span class="source-line-no">3153</span><span id="line-3153"> if (err2 != null) {</span>
<span class="source-line-no">3154</span><span id="line-3154"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3155</span><span id="line-3155"> } else {</span>
<span class="source-line-no">3156</span><span id="line-3156"> List&lt;CompletableFuture&lt;Void&gt;&gt; futures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">3157</span><span id="line-3157"> List&lt;ServerName&gt; groupServers = status.getServersName().stream()</span>
<span class="source-line-no">3158</span><span id="line-3158"> .filter(s -&gt; rsGroupInfo.containsServer(s.getAddress())).collect(Collectors.toList());</span>
<span class="source-line-no">3159</span><span id="line-3159"> groupServers.forEach(server -&gt; futures.add(updateConfiguration(server)));</span>
<span class="source-line-no">3160</span><span id="line-3160"> addListener(</span>
<span class="source-line-no">3161</span><span id="line-3161"> CompletableFuture.allOf(futures.toArray(new CompletableFuture&lt;?&gt;[futures.size()])),</span>
<span class="source-line-no">3162</span><span id="line-3162"> (result, err3) -&gt; {</span>
<span class="source-line-no">3163</span><span id="line-3163"> if (err3 != null) {</span>
<span class="source-line-no">3164</span><span id="line-3164"> future.completeExceptionally(err3);</span>
<span class="source-line-no">3165</span><span id="line-3165"> } else {</span>
<span class="source-line-no">3166</span><span id="line-3166"> future.complete(result);</span>
<span class="source-line-no">3167</span><span id="line-3167"> }</span>
<span class="source-line-no">3168</span><span id="line-3168"> });</span>
<span class="source-line-no">3169</span><span id="line-3169"> }</span>
<span class="source-line-no">3170</span><span id="line-3170"> });</span>
<span class="source-line-no">3171</span><span id="line-3171"> }</span>
<span class="source-line-no">3172</span><span id="line-3172"> });</span>
<span class="source-line-no">3173</span><span id="line-3173"> return future;</span>
<span class="source-line-no">3174</span><span id="line-3174"> }</span>
<span class="source-line-no">3175</span><span id="line-3175"></span>
<span class="source-line-no">3176</span><span id="line-3176"> @Override</span>
<span class="source-line-no">3177</span><span id="line-3177"> public CompletableFuture&lt;Void&gt; rollWALWriter(ServerName serverName) {</span>
<span class="source-line-no">3178</span><span id="line-3178"> return this.&lt;Void&gt; newAdminCaller()</span>
<span class="source-line-no">3179</span><span id="line-3179"> .action((controller, stub) -&gt; this.&lt;RollWALWriterRequest, RollWALWriterResponse,</span>
<span class="source-line-no">3180</span><span id="line-3180"> Void&gt; adminCall(controller, stub, RequestConverter.buildRollWALWriterRequest(),</span>
<span class="source-line-no">3181</span><span id="line-3181"> (s, c, req, done) -&gt; s.rollWALWriter(controller, req, done), resp -&gt; null))</span>
<span class="source-line-no">3182</span><span id="line-3182"> .serverName(serverName).call();</span>
<span class="source-line-no">3183</span><span id="line-3183"> }</span>
<span class="source-line-no">3184</span><span id="line-3184"></span>
<span class="source-line-no">3185</span><span id="line-3185"> @Override</span>
<span class="source-line-no">3186</span><span id="line-3186"> public CompletableFuture&lt;Void&gt; clearCompactionQueues(ServerName serverName, Set&lt;String&gt; queues) {</span>
<span class="source-line-no">3187</span><span id="line-3187"> return this.&lt;Void&gt; newAdminCaller()</span>
<span class="source-line-no">3188</span><span id="line-3188"> .action((controller, stub) -&gt; this.&lt;ClearCompactionQueuesRequest,</span>
<span class="source-line-no">3189</span><span id="line-3189"> ClearCompactionQueuesResponse, Void&gt; adminCall(controller, stub,</span>
<span class="source-line-no">3190</span><span id="line-3190"> RequestConverter.buildClearCompactionQueuesRequest(queues),</span>
<span class="source-line-no">3191</span><span id="line-3191"> (s, c, req, done) -&gt; s.clearCompactionQueues(controller, req, done), resp -&gt; null))</span>
<span class="source-line-no">3192</span><span id="line-3192"> .serverName(serverName).call();</span>
<span class="source-line-no">3193</span><span id="line-3193"> }</span>
<span class="source-line-no">3194</span><span id="line-3194"></span>
<span class="source-line-no">3195</span><span id="line-3195"> @Override</span>
<span class="source-line-no">3196</span><span id="line-3196"> public CompletableFuture&lt;List&lt;SecurityCapability&gt;&gt; getSecurityCapabilities() {</span>
<span class="source-line-no">3197</span><span id="line-3197"> return this.&lt;List&lt;SecurityCapability&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">3198</span><span id="line-3198"> .action((controller, stub) -&gt; this.&lt;SecurityCapabilitiesRequest, SecurityCapabilitiesResponse,</span>
<span class="source-line-no">3199</span><span id="line-3199"> List&lt;SecurityCapability&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">3200</span><span id="line-3200"> SecurityCapabilitiesRequest.newBuilder().build(),</span>
<span class="source-line-no">3201</span><span id="line-3201"> (s, c, req, done) -&gt; s.getSecurityCapabilities(c, req, done),</span>
<span class="source-line-no">3202</span><span id="line-3202"> (resp) -&gt; ProtobufUtil.toSecurityCapabilityList(resp.getCapabilitiesList())))</span>
<span class="source-line-no">3203</span><span id="line-3203"> .call();</span>
<span class="source-line-no">3204</span><span id="line-3204"> }</span>
<span class="source-line-no">3205</span><span id="line-3205"></span>
<span class="source-line-no">3206</span><span id="line-3206"> @Override</span>
<span class="source-line-no">3207</span><span id="line-3207"> public CompletableFuture&lt;List&lt;RegionMetrics&gt;&gt; getRegionMetrics(ServerName serverName) {</span>
<span class="source-line-no">3208</span><span id="line-3208"> return getRegionMetrics(GetRegionLoadRequest.newBuilder().build(), serverName);</span>
<span class="source-line-no">3209</span><span id="line-3209"> }</span>
<span class="source-line-no">3210</span><span id="line-3210"></span>
<span class="source-line-no">3211</span><span id="line-3211"> @Override</span>
<span class="source-line-no">3212</span><span id="line-3212"> public CompletableFuture&lt;List&lt;RegionMetrics&gt;&gt; getRegionMetrics(ServerName serverName,</span>
<span class="source-line-no">3213</span><span id="line-3213"> TableName tableName) {</span>
<span class="source-line-no">3214</span><span id="line-3214"> Preconditions.checkNotNull(tableName,</span>
<span class="source-line-no">3215</span><span id="line-3215"> "tableName is null. If you don't specify a tableName, use getRegionLoads() instead");</span>
<span class="source-line-no">3216</span><span id="line-3216"> return getRegionMetrics(RequestConverter.buildGetRegionLoadRequest(tableName), serverName);</span>
<span class="source-line-no">3217</span><span id="line-3217"> }</span>
<span class="source-line-no">3218</span><span id="line-3218"></span>
<span class="source-line-no">3219</span><span id="line-3219"> private CompletableFuture&lt;List&lt;RegionMetrics&gt;&gt; getRegionMetrics(GetRegionLoadRequest request,</span>
<span class="source-line-no">3220</span><span id="line-3220"> ServerName serverName) {</span>
<span class="source-line-no">3221</span><span id="line-3221"> return this.&lt;List&lt;RegionMetrics&gt;&gt; newAdminCaller()</span>
<span class="source-line-no">3222</span><span id="line-3222"> .action((controller, stub) -&gt; this.&lt;GetRegionLoadRequest, GetRegionLoadResponse,</span>
<span class="source-line-no">3223</span><span id="line-3223"> List&lt;RegionMetrics&gt;&gt; adminCall(controller, stub, request,</span>
<span class="source-line-no">3224</span><span id="line-3224"> (s, c, req, done) -&gt; s.getRegionLoad(controller, req, done),</span>
<span class="source-line-no">3225</span><span id="line-3225"> RegionMetricsBuilder::toRegionMetrics))</span>
<span class="source-line-no">3226</span><span id="line-3226"> .serverName(serverName).call();</span>
<span class="source-line-no">3227</span><span id="line-3227"> }</span>
<span class="source-line-no">3228</span><span id="line-3228"></span>
<span class="source-line-no">3229</span><span id="line-3229"> @Override</span>
<span class="source-line-no">3230</span><span id="line-3230"> public CompletableFuture&lt;Boolean&gt; isMasterInMaintenanceMode() {</span>
<span class="source-line-no">3231</span><span id="line-3231"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3232</span><span id="line-3232"> .action((controller, stub) -&gt; this.&lt;IsInMaintenanceModeRequest, IsInMaintenanceModeResponse,</span>
<span class="source-line-no">3233</span><span id="line-3233"> Boolean&gt; call(controller, stub, IsInMaintenanceModeRequest.newBuilder().build(),</span>
<span class="source-line-no">3234</span><span id="line-3234"> (s, c, req, done) -&gt; s.isMasterInMaintenanceMode(c, req, done),</span>
<span class="source-line-no">3235</span><span id="line-3235"> resp -&gt; resp.getInMaintenanceMode()))</span>
<span class="source-line-no">3236</span><span id="line-3236"> .call();</span>
<span class="source-line-no">3237</span><span id="line-3237"> }</span>
<span class="source-line-no">3238</span><span id="line-3238"></span>
<span class="source-line-no">3239</span><span id="line-3239"> @Override</span>
<span class="source-line-no">3240</span><span id="line-3240"> public CompletableFuture&lt;CompactionState&gt; getCompactionState(TableName tableName,</span>
<span class="source-line-no">3241</span><span id="line-3241"> CompactType compactType) {</span>
<span class="source-line-no">3242</span><span id="line-3242"> CompletableFuture&lt;CompactionState&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3243</span><span id="line-3243"></span>
<span class="source-line-no">3244</span><span id="line-3244"> switch (compactType) {</span>
<span class="source-line-no">3245</span><span id="line-3245"> case MOB:</span>
<span class="source-line-no">3246</span><span id="line-3246"> addListener(connection.registry.getActiveMaster(), (serverName, err) -&gt; {</span>
<span class="source-line-no">3247</span><span id="line-3247"> if (err != null) {</span>
<span class="source-line-no">3248</span><span id="line-3248"> future.completeExceptionally(err);</span>
<span class="source-line-no">3249</span><span id="line-3249"> return;</span>
<span class="source-line-no">3250</span><span id="line-3250"> }</span>
<span class="source-line-no">3251</span><span id="line-3251"> RegionInfo regionInfo = RegionInfo.createMobRegionInfo(tableName);</span>
<span class="source-line-no">3252</span><span id="line-3252"></span>
<span class="source-line-no">3253</span><span id="line-3253"> addListener(this.&lt;GetRegionInfoResponse&gt; newAdminCaller().serverName(serverName)</span>
<span class="source-line-no">3254</span><span id="line-3254"> .action((controller, stub) -&gt; this.&lt;GetRegionInfoRequest, GetRegionInfoResponse,</span>
<span class="source-line-no">3255</span><span id="line-3255"> GetRegionInfoResponse&gt; adminCall(controller, stub,</span>
<span class="source-line-no">3256</span><span id="line-3256"> RequestConverter.buildGetRegionInfoRequest(regionInfo.getRegionName(), true),</span>
<span class="source-line-no">3257</span><span id="line-3257"> (s, c, req, done) -&gt; s.getRegionInfo(controller, req, done), resp -&gt; resp))</span>
<span class="source-line-no">3258</span><span id="line-3258"> .call(), (resp2, err2) -&gt; {</span>
<span class="source-line-no">3259</span><span id="line-3259"> if (err2 != null) {</span>
<span class="source-line-no">3260</span><span id="line-3260"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3261</span><span id="line-3261"> } else {</span>
<span class="source-line-no">3262</span><span id="line-3262"> if (resp2.hasCompactionState()) {</span>
<span class="source-line-no">3263</span><span id="line-3263"> future.complete(ProtobufUtil.createCompactionState(resp2.getCompactionState()));</span>
<span class="source-line-no">3264</span><span id="line-3264"> } else {</span>
<span class="source-line-no">3265</span><span id="line-3265"> future.complete(CompactionState.NONE);</span>
<span class="source-line-no">3266</span><span id="line-3266"> }</span>
<span class="source-line-no">3267</span><span id="line-3267"> }</span>
<span class="source-line-no">3268</span><span id="line-3268"> });</span>
<span class="source-line-no">3269</span><span id="line-3269"> });</span>
<span class="source-line-no">3270</span><span id="line-3270"> break;</span>
<span class="source-line-no">3271</span><span id="line-3271"> case NORMAL:</span>
<span class="source-line-no">3272</span><span id="line-3272"> addListener(getTableHRegionLocations(tableName), (locations, err) -&gt; {</span>
<span class="source-line-no">3273</span><span id="line-3273"> if (err != null) {</span>
<span class="source-line-no">3274</span><span id="line-3274"> future.completeExceptionally(err);</span>
<span class="source-line-no">3275</span><span id="line-3275"> return;</span>
<span class="source-line-no">3276</span><span id="line-3276"> }</span>
<span class="source-line-no">3277</span><span id="line-3277"> ConcurrentLinkedQueue&lt;CompactionState&gt; regionStates = new ConcurrentLinkedQueue&lt;&gt;();</span>
<span class="source-line-no">3278</span><span id="line-3278"> List&lt;CompletableFuture&lt;CompactionState&gt;&gt; futures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">3279</span><span id="line-3279"> locations.stream().filter(loc -&gt; loc.getServerName() != null)</span>
<span class="source-line-no">3280</span><span id="line-3280"> .filter(loc -&gt; loc.getRegion() != null).filter(loc -&gt; !loc.getRegion().isOffline())</span>
<span class="source-line-no">3281</span><span id="line-3281"> .map(loc -&gt; loc.getRegion().getRegionName()).forEach(region -&gt; {</span>
<span class="source-line-no">3282</span><span id="line-3282"> futures.add(getCompactionStateForRegion(region).whenComplete((regionState, err2) -&gt; {</span>
<span class="source-line-no">3283</span><span id="line-3283"> // If any region compaction state is MAJOR_AND_MINOR</span>
<span class="source-line-no">3284</span><span id="line-3284"> // the table compaction state is MAJOR_AND_MINOR, too.</span>
<span class="source-line-no">3285</span><span id="line-3285"> if (err2 != null) {</span>
<span class="source-line-no">3286</span><span id="line-3286"> future.completeExceptionally(unwrapCompletionException(err2));</span>
<span class="source-line-no">3287</span><span id="line-3287"> } else if (regionState == CompactionState.MAJOR_AND_MINOR) {</span>
<span class="source-line-no">3288</span><span id="line-3288"> future.complete(regionState);</span>
<span class="source-line-no">3289</span><span id="line-3289"> } else {</span>
<span class="source-line-no">3290</span><span id="line-3290"> regionStates.add(regionState);</span>
<span class="source-line-no">3291</span><span id="line-3291"> }</span>
<span class="source-line-no">3292</span><span id="line-3292"> }));</span>
<span class="source-line-no">3293</span><span id="line-3293"> });</span>
<span class="source-line-no">3294</span><span id="line-3294"> addListener(</span>
<span class="source-line-no">3295</span><span id="line-3295"> CompletableFuture.allOf(futures.toArray(new CompletableFuture&lt;?&gt;[futures.size()])),</span>
<span class="source-line-no">3296</span><span id="line-3296"> (ret, err3) -&gt; {</span>
<span class="source-line-no">3297</span><span id="line-3297"> // If future not completed, check all regions's compaction state</span>
<span class="source-line-no">3298</span><span id="line-3298"> if (!future.isCompletedExceptionally() &amp;&amp; !future.isDone()) {</span>
<span class="source-line-no">3299</span><span id="line-3299"> CompactionState state = CompactionState.NONE;</span>
<span class="source-line-no">3300</span><span id="line-3300"> for (CompactionState regionState : regionStates) {</span>
<span class="source-line-no">3301</span><span id="line-3301"> switch (regionState) {</span>
<span class="source-line-no">3302</span><span id="line-3302"> case MAJOR:</span>
<span class="source-line-no">3303</span><span id="line-3303"> if (state == CompactionState.MINOR) {</span>
<span class="source-line-no">3304</span><span id="line-3304"> future.complete(CompactionState.MAJOR_AND_MINOR);</span>
<span class="source-line-no">3305</span><span id="line-3305"> } else {</span>
<span class="source-line-no">3306</span><span id="line-3306"> state = CompactionState.MAJOR;</span>
<span class="source-line-no">3307</span><span id="line-3307"> }</span>
<span class="source-line-no">3308</span><span id="line-3308"> break;</span>
<span class="source-line-no">3309</span><span id="line-3309"> case MINOR:</span>
<span class="source-line-no">3310</span><span id="line-3310"> if (state == CompactionState.MAJOR) {</span>
<span class="source-line-no">3311</span><span id="line-3311"> future.complete(CompactionState.MAJOR_AND_MINOR);</span>
<span class="source-line-no">3312</span><span id="line-3312"> } else {</span>
<span class="source-line-no">3313</span><span id="line-3313"> state = CompactionState.MINOR;</span>
<span class="source-line-no">3314</span><span id="line-3314"> }</span>
<span class="source-line-no">3315</span><span id="line-3315"> break;</span>
<span class="source-line-no">3316</span><span id="line-3316"> case NONE:</span>
<span class="source-line-no">3317</span><span id="line-3317"> default:</span>
<span class="source-line-no">3318</span><span id="line-3318"> }</span>
<span class="source-line-no">3319</span><span id="line-3319"> }</span>
<span class="source-line-no">3320</span><span id="line-3320"> if (!future.isDone()) {</span>
<span class="source-line-no">3321</span><span id="line-3321"> future.complete(state);</span>
<span class="source-line-no">3322</span><span id="line-3322"> }</span>
<span class="source-line-no">3323</span><span id="line-3323"> }</span>
<span class="source-line-no">3324</span><span id="line-3324"> });</span>
<span class="source-line-no">3325</span><span id="line-3325"> });</span>
<span class="source-line-no">3326</span><span id="line-3326"> break;</span>
<span class="source-line-no">3327</span><span id="line-3327"> default:</span>
<span class="source-line-no">3328</span><span id="line-3328"> throw new IllegalArgumentException("Unknown compactType: " + compactType);</span>
<span class="source-line-no">3329</span><span id="line-3329"> }</span>
<span class="source-line-no">3330</span><span id="line-3330"></span>
<span class="source-line-no">3331</span><span id="line-3331"> return future;</span>
<span class="source-line-no">3332</span><span id="line-3332"> }</span>
<span class="source-line-no">3333</span><span id="line-3333"></span>
<span class="source-line-no">3334</span><span id="line-3334"> @Override</span>
<span class="source-line-no">3335</span><span id="line-3335"> public CompletableFuture&lt;CompactionState&gt; getCompactionStateForRegion(byte[] regionName) {</span>
<span class="source-line-no">3336</span><span id="line-3336"> CompletableFuture&lt;CompactionState&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3337</span><span id="line-3337"> addListener(getRegionLocation(regionName), (location, err) -&gt; {</span>
<span class="source-line-no">3338</span><span id="line-3338"> if (err != null) {</span>
<span class="source-line-no">3339</span><span id="line-3339"> future.completeExceptionally(err);</span>
<span class="source-line-no">3340</span><span id="line-3340"> return;</span>
<span class="source-line-no">3341</span><span id="line-3341"> }</span>
<span class="source-line-no">3342</span><span id="line-3342"> ServerName serverName = location.getServerName();</span>
<span class="source-line-no">3343</span><span id="line-3343"> if (serverName == null) {</span>
<span class="source-line-no">3344</span><span id="line-3344"> future</span>
<span class="source-line-no">3345</span><span id="line-3345"> .completeExceptionally(new NoServerForRegionException(Bytes.toStringBinary(regionName)));</span>
<span class="source-line-no">3346</span><span id="line-3346"> return;</span>
<span class="source-line-no">3347</span><span id="line-3347"> }</span>
<span class="source-line-no">3348</span><span id="line-3348"> addListener(</span>
<span class="source-line-no">3349</span><span id="line-3349"> this.&lt;GetRegionInfoResponse&gt; newAdminCaller()</span>
<span class="source-line-no">3350</span><span id="line-3350"> .action((controller, stub) -&gt; this.&lt;GetRegionInfoRequest, GetRegionInfoResponse,</span>
<span class="source-line-no">3351</span><span id="line-3351"> GetRegionInfoResponse&gt; adminCall(controller, stub,</span>
<span class="source-line-no">3352</span><span id="line-3352"> RequestConverter.buildGetRegionInfoRequest(location.getRegion().getRegionName(),</span>
<span class="source-line-no">3353</span><span id="line-3353"> true),</span>
<span class="source-line-no">3354</span><span id="line-3354"> (s, c, req, done) -&gt; s.getRegionInfo(controller, req, done), resp -&gt; resp))</span>
<span class="source-line-no">3355</span><span id="line-3355"> .serverName(serverName).call(),</span>
<span class="source-line-no">3356</span><span id="line-3356"> (resp2, err2) -&gt; {</span>
<span class="source-line-no">3357</span><span id="line-3357"> if (err2 != null) {</span>
<span class="source-line-no">3358</span><span id="line-3358"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3359</span><span id="line-3359"> } else {</span>
<span class="source-line-no">3360</span><span id="line-3360"> if (resp2.hasCompactionState()) {</span>
<span class="source-line-no">3361</span><span id="line-3361"> future.complete(ProtobufUtil.createCompactionState(resp2.getCompactionState()));</span>
<span class="source-line-no">3362</span><span id="line-3362"> } else {</span>
<span class="source-line-no">3363</span><span id="line-3363"> future.complete(CompactionState.NONE);</span>
<span class="source-line-no">3364</span><span id="line-3364"> }</span>
<span class="source-line-no">3365</span><span id="line-3365"> }</span>
<span class="source-line-no">3366</span><span id="line-3366"> });</span>
<span class="source-line-no">3367</span><span id="line-3367"> });</span>
<span class="source-line-no">3368</span><span id="line-3368"> return future;</span>
<span class="source-line-no">3369</span><span id="line-3369"> }</span>
<span class="source-line-no">3370</span><span id="line-3370"></span>
<span class="source-line-no">3371</span><span id="line-3371"> @Override</span>
<span class="source-line-no">3372</span><span id="line-3372"> public CompletableFuture&lt;Optional&lt;Long&gt;&gt; getLastMajorCompactionTimestamp(TableName tableName) {</span>
<span class="source-line-no">3373</span><span id="line-3373"> MajorCompactionTimestampRequest request = MajorCompactionTimestampRequest.newBuilder()</span>
<span class="source-line-no">3374</span><span id="line-3374"> .setTableName(ProtobufUtil.toProtoTableName(tableName)).build();</span>
<span class="source-line-no">3375</span><span id="line-3375"> return this.&lt;Optional&lt;Long&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">3376</span><span id="line-3376"> .action((controller, stub) -&gt; this.&lt;MajorCompactionTimestampRequest,</span>
<span class="source-line-no">3377</span><span id="line-3377"> MajorCompactionTimestampResponse, Optional&lt;Long&gt;&gt; call(controller, stub, request,</span>
<span class="source-line-no">3378</span><span id="line-3378"> (s, c, req, done) -&gt; s.getLastMajorCompactionTimestamp(c, req, done),</span>
<span class="source-line-no">3379</span><span id="line-3379"> ProtobufUtil::toOptionalTimestamp))</span>
<span class="source-line-no">3380</span><span id="line-3380"> .call();</span>
<span class="source-line-no">3381</span><span id="line-3381"> }</span>
<span class="source-line-no">3382</span><span id="line-3382"></span>
<span class="source-line-no">3383</span><span id="line-3383"> @Override</span>
<span class="source-line-no">3384</span><span id="line-3384"> public CompletableFuture&lt;Optional&lt;Long&gt;&gt;</span>
<span class="source-line-no">3385</span><span id="line-3385"> getLastMajorCompactionTimestampForRegion(byte[] regionName) {</span>
<span class="source-line-no">3386</span><span id="line-3386"> CompletableFuture&lt;Optional&lt;Long&gt;&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3387</span><span id="line-3387"> // regionName may be a full region name or encoded region name, so getRegionInfo(byte[]) first</span>
<span class="source-line-no">3388</span><span id="line-3388"> addListener(getRegionInfo(regionName), (region, err) -&gt; {</span>
<span class="source-line-no">3389</span><span id="line-3389"> if (err != null) {</span>
<span class="source-line-no">3390</span><span id="line-3390"> future.completeExceptionally(err);</span>
<span class="source-line-no">3391</span><span id="line-3391"> return;</span>
<span class="source-line-no">3392</span><span id="line-3392"> }</span>
<span class="source-line-no">3393</span><span id="line-3393"> MajorCompactionTimestampForRegionRequest.Builder builder =</span>
<span class="source-line-no">3394</span><span id="line-3394"> MajorCompactionTimestampForRegionRequest.newBuilder();</span>
<span class="source-line-no">3395</span><span id="line-3395"> builder.setRegion(</span>
<span class="source-line-no">3396</span><span id="line-3396"> RequestConverter.buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName));</span>
<span class="source-line-no">3397</span><span id="line-3397"> addListener(this.&lt;Optional&lt;Long&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">3398</span><span id="line-3398"> .action((controller, stub) -&gt; this.&lt;MajorCompactionTimestampForRegionRequest,</span>
<span class="source-line-no">3399</span><span id="line-3399"> MajorCompactionTimestampResponse, Optional&lt;Long&gt;&gt; call(controller, stub, builder.build(),</span>
<span class="source-line-no">3400</span><span id="line-3400"> (s, c, req, done) -&gt; s.getLastMajorCompactionTimestampForRegion(c, req, done),</span>
<span class="source-line-no">3401</span><span id="line-3401"> ProtobufUtil::toOptionalTimestamp))</span>
<span class="source-line-no">3402</span><span id="line-3402"> .call(), (timestamp, err2) -&gt; {</span>
<span class="source-line-no">3403</span><span id="line-3403"> if (err2 != null) {</span>
<span class="source-line-no">3404</span><span id="line-3404"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3405</span><span id="line-3405"> } else {</span>
<span class="source-line-no">3406</span><span id="line-3406"> future.complete(timestamp);</span>
<span class="source-line-no">3407</span><span id="line-3407"> }</span>
<span class="source-line-no">3408</span><span id="line-3408"> });</span>
<span class="source-line-no">3409</span><span id="line-3409"> });</span>
<span class="source-line-no">3410</span><span id="line-3410"> return future;</span>
<span class="source-line-no">3411</span><span id="line-3411"> }</span>
<span class="source-line-no">3412</span><span id="line-3412"></span>
<span class="source-line-no">3413</span><span id="line-3413"> @Override</span>
<span class="source-line-no">3414</span><span id="line-3414"> public CompletableFuture&lt;Map&lt;ServerName, Boolean&gt;&gt; compactionSwitch(boolean switchState,</span>
<span class="source-line-no">3415</span><span id="line-3415"> List&lt;String&gt; serverNamesList) {</span>
<span class="source-line-no">3416</span><span id="line-3416"> CompletableFuture&lt;Map&lt;ServerName, Boolean&gt;&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3417</span><span id="line-3417"> addListener(getRegionServerList(serverNamesList), (serverNames, err) -&gt; {</span>
<span class="source-line-no">3418</span><span id="line-3418"> if (err != null) {</span>
<span class="source-line-no">3419</span><span id="line-3419"> future.completeExceptionally(err);</span>
<span class="source-line-no">3420</span><span id="line-3420"> return;</span>
<span class="source-line-no">3421</span><span id="line-3421"> }</span>
<span class="source-line-no">3422</span><span id="line-3422"> // Accessed by multiple threads.</span>
<span class="source-line-no">3423</span><span id="line-3423"> Map&lt;ServerName, Boolean&gt; serverStates = new ConcurrentHashMap&lt;&gt;(serverNames.size());</span>
<span class="source-line-no">3424</span><span id="line-3424"> List&lt;CompletableFuture&lt;Boolean&gt;&gt; futures = new ArrayList&lt;&gt;(serverNames.size());</span>
<span class="source-line-no">3425</span><span id="line-3425"> serverNames.stream().forEach(serverName -&gt; {</span>
<span class="source-line-no">3426</span><span id="line-3426"> futures.add(switchCompact(serverName, switchState).whenComplete((serverState, err2) -&gt; {</span>
<span class="source-line-no">3427</span><span id="line-3427"> if (err2 != null) {</span>
<span class="source-line-no">3428</span><span id="line-3428"> future.completeExceptionally(unwrapCompletionException(err2));</span>
<span class="source-line-no">3429</span><span id="line-3429"> } else {</span>
<span class="source-line-no">3430</span><span id="line-3430"> serverStates.put(serverName, serverState);</span>
<span class="source-line-no">3431</span><span id="line-3431"> }</span>
<span class="source-line-no">3432</span><span id="line-3432"> }));</span>
<span class="source-line-no">3433</span><span id="line-3433"> });</span>
<span class="source-line-no">3434</span><span id="line-3434"> addListener(</span>
<span class="source-line-no">3435</span><span id="line-3435"> CompletableFuture.allOf(futures.toArray(new CompletableFuture&lt;?&gt;[futures.size()])),</span>
<span class="source-line-no">3436</span><span id="line-3436"> (ret, err3) -&gt; {</span>
<span class="source-line-no">3437</span><span id="line-3437"> if (!future.isCompletedExceptionally()) {</span>
<span class="source-line-no">3438</span><span id="line-3438"> if (err3 != null) {</span>
<span class="source-line-no">3439</span><span id="line-3439"> future.completeExceptionally(err3);</span>
<span class="source-line-no">3440</span><span id="line-3440"> } else {</span>
<span class="source-line-no">3441</span><span id="line-3441"> future.complete(serverStates);</span>
<span class="source-line-no">3442</span><span id="line-3442"> }</span>
<span class="source-line-no">3443</span><span id="line-3443"> }</span>
<span class="source-line-no">3444</span><span id="line-3444"> });</span>
<span class="source-line-no">3445</span><span id="line-3445"> });</span>
<span class="source-line-no">3446</span><span id="line-3446"> return future;</span>
<span class="source-line-no">3447</span><span id="line-3447"> }</span>
<span class="source-line-no">3448</span><span id="line-3448"></span>
<span class="source-line-no">3449</span><span id="line-3449"> private CompletableFuture&lt;List&lt;ServerName&gt;&gt; getRegionServerList(List&lt;String&gt; serverNamesList) {</span>
<span class="source-line-no">3450</span><span id="line-3450"> CompletableFuture&lt;List&lt;ServerName&gt;&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3451</span><span id="line-3451"> if (serverNamesList.isEmpty()) {</span>
<span class="source-line-no">3452</span><span id="line-3452"> CompletableFuture&lt;ClusterMetrics&gt; clusterMetricsCompletableFuture =</span>
<span class="source-line-no">3453</span><span id="line-3453"> getClusterMetrics(EnumSet.of(Option.SERVERS_NAME));</span>
<span class="source-line-no">3454</span><span id="line-3454"> addListener(clusterMetricsCompletableFuture, (clusterMetrics, err) -&gt; {</span>
<span class="source-line-no">3455</span><span id="line-3455"> if (err != null) {</span>
<span class="source-line-no">3456</span><span id="line-3456"> future.completeExceptionally(err);</span>
<span class="source-line-no">3457</span><span id="line-3457"> } else {</span>
<span class="source-line-no">3458</span><span id="line-3458"> future.complete(clusterMetrics.getServersName());</span>
<span class="source-line-no">3459</span><span id="line-3459"> }</span>
<span class="source-line-no">3460</span><span id="line-3460"> });</span>
<span class="source-line-no">3461</span><span id="line-3461"> return future;</span>
<span class="source-line-no">3462</span><span id="line-3462"> } else {</span>
<span class="source-line-no">3463</span><span id="line-3463"> List&lt;ServerName&gt; serverList = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">3464</span><span id="line-3464"> for (String regionServerName : serverNamesList) {</span>
<span class="source-line-no">3465</span><span id="line-3465"> ServerName serverName = null;</span>
<span class="source-line-no">3466</span><span id="line-3466"> try {</span>
<span class="source-line-no">3467</span><span id="line-3467"> serverName = ServerName.valueOf(regionServerName);</span>
<span class="source-line-no">3468</span><span id="line-3468"> } catch (Exception e) {</span>
<span class="source-line-no">3469</span><span id="line-3469"> future.completeExceptionally(</span>
<span class="source-line-no">3470</span><span id="line-3470"> new IllegalArgumentException(String.format("ServerName format: %s", regionServerName)));</span>
<span class="source-line-no">3471</span><span id="line-3471"> }</span>
<span class="source-line-no">3472</span><span id="line-3472"> if (serverName == null) {</span>
<span class="source-line-no">3473</span><span id="line-3473"> future.completeExceptionally(</span>
<span class="source-line-no">3474</span><span id="line-3474"> new IllegalArgumentException(String.format("Null ServerName: %s", regionServerName)));</span>
<span class="source-line-no">3475</span><span id="line-3475"> } else {</span>
<span class="source-line-no">3476</span><span id="line-3476"> serverList.add(serverName);</span>
<span class="source-line-no">3477</span><span id="line-3477"> }</span>
<span class="source-line-no">3478</span><span id="line-3478"> }</span>
<span class="source-line-no">3479</span><span id="line-3479"> future.complete(serverList);</span>
<span class="source-line-no">3480</span><span id="line-3480"> }</span>
<span class="source-line-no">3481</span><span id="line-3481"> return future;</span>
<span class="source-line-no">3482</span><span id="line-3482"> }</span>
<span class="source-line-no">3483</span><span id="line-3483"></span>
<span class="source-line-no">3484</span><span id="line-3484"> private CompletableFuture&lt;Boolean&gt; switchCompact(ServerName serverName, boolean onOrOff) {</span>
<span class="source-line-no">3485</span><span id="line-3485"> return this.&lt;Boolean&gt; newAdminCaller().serverName(serverName)</span>
<span class="source-line-no">3486</span><span id="line-3486"> .action((controller, stub) -&gt; this.&lt;CompactionSwitchRequest, CompactionSwitchResponse,</span>
<span class="source-line-no">3487</span><span id="line-3487"> Boolean&gt; adminCall(controller, stub,</span>
<span class="source-line-no">3488</span><span id="line-3488"> CompactionSwitchRequest.newBuilder().setEnabled(onOrOff).build(),</span>
<span class="source-line-no">3489</span><span id="line-3489"> (s, c, req, done) -&gt; s.compactionSwitch(c, req, done), resp -&gt; resp.getPrevState()))</span>
<span class="source-line-no">3490</span><span id="line-3490"> .call();</span>
<span class="source-line-no">3491</span><span id="line-3491"> }</span>
<span class="source-line-no">3492</span><span id="line-3492"></span>
<span class="source-line-no">3493</span><span id="line-3493"> @Override</span>
<span class="source-line-no">3494</span><span id="line-3494"> public CompletableFuture&lt;Boolean&gt; balancerSwitch(boolean on, boolean drainRITs) {</span>
<span class="source-line-no">3495</span><span id="line-3495"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3496</span><span id="line-3496"> .action((controller, stub) -&gt; this.&lt;SetBalancerRunningRequest, SetBalancerRunningResponse,</span>
<span class="source-line-no">3497</span><span id="line-3497"> Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">3498</span><span id="line-3498"> RequestConverter.buildSetBalancerRunningRequest(on, drainRITs),</span>
<span class="source-line-no">3499</span><span id="line-3499"> (s, c, req, done) -&gt; s.setBalancerRunning(c, req, done),</span>
<span class="source-line-no">3500</span><span id="line-3500"> (resp) -&gt; resp.getPrevBalanceValue()))</span>
<span class="source-line-no">3501</span><span id="line-3501"> .call();</span>
<span class="source-line-no">3502</span><span id="line-3502"> }</span>
<span class="source-line-no">3503</span><span id="line-3503"></span>
<span class="source-line-no">3504</span><span id="line-3504"> @Override</span>
<span class="source-line-no">3505</span><span id="line-3505"> public CompletableFuture&lt;BalanceResponse&gt; balance(BalanceRequest request) {</span>
<span class="source-line-no">3506</span><span id="line-3506"> return this.&lt;BalanceResponse&gt; newMasterCaller()</span>
<span class="source-line-no">3507</span><span id="line-3507"> .action((controller, stub) -&gt; this.&lt;MasterProtos.BalanceRequest, MasterProtos.BalanceResponse,</span>
<span class="source-line-no">3508</span><span id="line-3508"> BalanceResponse&gt; call(controller, stub, ProtobufUtil.toBalanceRequest(request),</span>
<span class="source-line-no">3509</span><span id="line-3509"> (s, c, req, done) -&gt; s.balance(c, req, done),</span>
<span class="source-line-no">3510</span><span id="line-3510"> (resp) -&gt; ProtobufUtil.toBalanceResponse(resp)))</span>
<span class="source-line-no">3511</span><span id="line-3511"> .call();</span>
<span class="source-line-no">3512</span><span id="line-3512"> }</span>
<span class="source-line-no">3513</span><span id="line-3513"></span>
<span class="source-line-no">3514</span><span id="line-3514"> @Override</span>
<span class="source-line-no">3515</span><span id="line-3515"> public CompletableFuture&lt;Boolean&gt; isBalancerEnabled() {</span>
<span class="source-line-no">3516</span><span id="line-3516"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3517</span><span id="line-3517"> .action((controller, stub) -&gt; this.&lt;IsBalancerEnabledRequest, IsBalancerEnabledResponse,</span>
<span class="source-line-no">3518</span><span id="line-3518"> Boolean&gt; call(controller, stub, RequestConverter.buildIsBalancerEnabledRequest(),</span>
<span class="source-line-no">3519</span><span id="line-3519"> (s, c, req, done) -&gt; s.isBalancerEnabled(c, req, done), (resp) -&gt; resp.getEnabled()))</span>
<span class="source-line-no">3520</span><span id="line-3520"> .call();</span>
<span class="source-line-no">3521</span><span id="line-3521"> }</span>
<span class="source-line-no">3522</span><span id="line-3522"></span>
<span class="source-line-no">3523</span><span id="line-3523"> @Override</span>
<span class="source-line-no">3524</span><span id="line-3524"> public CompletableFuture&lt;Boolean&gt; normalizerSwitch(boolean on) {</span>
<span class="source-line-no">3525</span><span id="line-3525"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3526</span><span id="line-3526"> .action((controller, stub) -&gt; this.&lt;SetNormalizerRunningRequest, SetNormalizerRunningResponse,</span>
<span class="source-line-no">3527</span><span id="line-3527"> Boolean&gt; call(controller, stub, RequestConverter.buildSetNormalizerRunningRequest(on),</span>
<span class="source-line-no">3528</span><span id="line-3528"> (s, c, req, done) -&gt; s.setNormalizerRunning(c, req, done),</span>
<span class="source-line-no">3529</span><span id="line-3529"> (resp) -&gt; resp.getPrevNormalizerValue()))</span>
<span class="source-line-no">3530</span><span id="line-3530"> .call();</span>
<span class="source-line-no">3531</span><span id="line-3531"> }</span>
<span class="source-line-no">3532</span><span id="line-3532"></span>
<span class="source-line-no">3533</span><span id="line-3533"> @Override</span>
<span class="source-line-no">3534</span><span id="line-3534"> public CompletableFuture&lt;Boolean&gt; isNormalizerEnabled() {</span>
<span class="source-line-no">3535</span><span id="line-3535"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3536</span><span id="line-3536"> .action((controller, stub) -&gt; this.&lt;IsNormalizerEnabledRequest, IsNormalizerEnabledResponse,</span>
<span class="source-line-no">3537</span><span id="line-3537"> Boolean&gt; call(controller, stub, RequestConverter.buildIsNormalizerEnabledRequest(),</span>
<span class="source-line-no">3538</span><span id="line-3538"> (s, c, req, done) -&gt; s.isNormalizerEnabled(c, req, done), (resp) -&gt; resp.getEnabled()))</span>
<span class="source-line-no">3539</span><span id="line-3539"> .call();</span>
<span class="source-line-no">3540</span><span id="line-3540"> }</span>
<span class="source-line-no">3541</span><span id="line-3541"></span>
<span class="source-line-no">3542</span><span id="line-3542"> @Override</span>
<span class="source-line-no">3543</span><span id="line-3543"> public CompletableFuture&lt;Boolean&gt; normalize(NormalizeTableFilterParams ntfp) {</span>
<span class="source-line-no">3544</span><span id="line-3544"> return normalize(RequestConverter.buildNormalizeRequest(ntfp));</span>
<span class="source-line-no">3545</span><span id="line-3545"> }</span>
<span class="source-line-no">3546</span><span id="line-3546"></span>
<span class="source-line-no">3547</span><span id="line-3547"> private CompletableFuture&lt;Boolean&gt; normalize(NormalizeRequest request) {</span>
<span class="source-line-no">3548</span><span id="line-3548"> return this.&lt;Boolean&gt; newMasterCaller().action((controller, stub) -&gt; this.call(controller, stub,</span>
<span class="source-line-no">3549</span><span id="line-3549"> request, MasterService.Interface::normalize, NormalizeResponse::getNormalizerRan)).call();</span>
<span class="source-line-no">3550</span><span id="line-3550"> }</span>
<span class="source-line-no">3551</span><span id="line-3551"></span>
<span class="source-line-no">3552</span><span id="line-3552"> @Override</span>
<span class="source-line-no">3553</span><span id="line-3553"> public CompletableFuture&lt;Boolean&gt; cleanerChoreSwitch(boolean enabled) {</span>
<span class="source-line-no">3554</span><span id="line-3554"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3555</span><span id="line-3555"> .action((controller, stub) -&gt; this.&lt;SetCleanerChoreRunningRequest,</span>
<span class="source-line-no">3556</span><span id="line-3556"> SetCleanerChoreRunningResponse, Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">3557</span><span id="line-3557"> RequestConverter.buildSetCleanerChoreRunningRequest(enabled),</span>
<span class="source-line-no">3558</span><span id="line-3558"> (s, c, req, done) -&gt; s.setCleanerChoreRunning(c, req, done),</span>
<span class="source-line-no">3559</span><span id="line-3559"> (resp) -&gt; resp.getPrevValue()))</span>
<span class="source-line-no">3560</span><span id="line-3560"> .call();</span>
<span class="source-line-no">3561</span><span id="line-3561"> }</span>
<span class="source-line-no">3562</span><span id="line-3562"></span>
<span class="source-line-no">3563</span><span id="line-3563"> @Override</span>
<span class="source-line-no">3564</span><span id="line-3564"> public CompletableFuture&lt;Boolean&gt; isCleanerChoreEnabled() {</span>
<span class="source-line-no">3565</span><span id="line-3565"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3566</span><span id="line-3566"> .action(</span>
<span class="source-line-no">3567</span><span id="line-3567"> (controller, stub) -&gt; this.&lt;IsCleanerChoreEnabledRequest, IsCleanerChoreEnabledResponse,</span>
<span class="source-line-no">3568</span><span id="line-3568"> Boolean&gt; call(controller, stub, RequestConverter.buildIsCleanerChoreEnabledRequest(),</span>
<span class="source-line-no">3569</span><span id="line-3569"> (s, c, req, done) -&gt; s.isCleanerChoreEnabled(c, req, done), (resp) -&gt; resp.getValue()))</span>
<span class="source-line-no">3570</span><span id="line-3570"> .call();</span>
<span class="source-line-no">3571</span><span id="line-3571"> }</span>
<span class="source-line-no">3572</span><span id="line-3572"></span>
<span class="source-line-no">3573</span><span id="line-3573"> @Override</span>
<span class="source-line-no">3574</span><span id="line-3574"> public CompletableFuture&lt;Boolean&gt; runCleanerChore() {</span>
<span class="source-line-no">3575</span><span id="line-3575"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3576</span><span id="line-3576"> .action((controller, stub) -&gt; this.&lt;RunCleanerChoreRequest, RunCleanerChoreResponse,</span>
<span class="source-line-no">3577</span><span id="line-3577"> Boolean&gt; call(controller, stub, RequestConverter.buildRunCleanerChoreRequest(),</span>
<span class="source-line-no">3578</span><span id="line-3578"> (s, c, req, done) -&gt; s.runCleanerChore(c, req, done),</span>
<span class="source-line-no">3579</span><span id="line-3579"> (resp) -&gt; resp.getCleanerChoreRan()))</span>
<span class="source-line-no">3580</span><span id="line-3580"> .call();</span>
<span class="source-line-no">3581</span><span id="line-3581"> }</span>
<span class="source-line-no">3582</span><span id="line-3582"></span>
<span class="source-line-no">3583</span><span id="line-3583"> @Override</span>
<span class="source-line-no">3584</span><span id="line-3584"> public CompletableFuture&lt;Boolean&gt; catalogJanitorSwitch(boolean enabled) {</span>
<span class="source-line-no">3585</span><span id="line-3585"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3586</span><span id="line-3586"> .action((controller, stub) -&gt; this.&lt;EnableCatalogJanitorRequest, EnableCatalogJanitorResponse,</span>
<span class="source-line-no">3587</span><span id="line-3587"> Boolean&gt; call(controller, stub, RequestConverter.buildEnableCatalogJanitorRequest(enabled),</span>
<span class="source-line-no">3588</span><span id="line-3588"> (s, c, req, done) -&gt; s.enableCatalogJanitor(c, req, done), (resp) -&gt; resp.getPrevValue()))</span>
<span class="source-line-no">3589</span><span id="line-3589"> .call();</span>
<span class="source-line-no">3590</span><span id="line-3590"> }</span>
<span class="source-line-no">3591</span><span id="line-3591"></span>
<span class="source-line-no">3592</span><span id="line-3592"> @Override</span>
<span class="source-line-no">3593</span><span id="line-3593"> public CompletableFuture&lt;Boolean&gt; isCatalogJanitorEnabled() {</span>
<span class="source-line-no">3594</span><span id="line-3594"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3595</span><span id="line-3595"> .action((controller, stub) -&gt; this.&lt;IsCatalogJanitorEnabledRequest,</span>
<span class="source-line-no">3596</span><span id="line-3596"> IsCatalogJanitorEnabledResponse, Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">3597</span><span id="line-3597"> RequestConverter.buildIsCatalogJanitorEnabledRequest(),</span>
<span class="source-line-no">3598</span><span id="line-3598"> (s, c, req, done) -&gt; s.isCatalogJanitorEnabled(c, req, done), (resp) -&gt; resp.getValue()))</span>
<span class="source-line-no">3599</span><span id="line-3599"> .call();</span>
<span class="source-line-no">3600</span><span id="line-3600"> }</span>
<span class="source-line-no">3601</span><span id="line-3601"></span>
<span class="source-line-no">3602</span><span id="line-3602"> @Override</span>
<span class="source-line-no">3603</span><span id="line-3603"> public CompletableFuture&lt;Integer&gt; runCatalogJanitor() {</span>
<span class="source-line-no">3604</span><span id="line-3604"> return this.&lt;Integer&gt; newMasterCaller()</span>
<span class="source-line-no">3605</span><span id="line-3605"> .action((controller, stub) -&gt; this.&lt;RunCatalogScanRequest, RunCatalogScanResponse,</span>
<span class="source-line-no">3606</span><span id="line-3606"> Integer&gt; call(controller, stub, RequestConverter.buildCatalogScanRequest(),</span>
<span class="source-line-no">3607</span><span id="line-3607"> (s, c, req, done) -&gt; s.runCatalogScan(c, req, done), (resp) -&gt; resp.getScanResult()))</span>
<span class="source-line-no">3608</span><span id="line-3608"> .call();</span>
<span class="source-line-no">3609</span><span id="line-3609"> }</span>
<span class="source-line-no">3610</span><span id="line-3610"></span>
<span class="source-line-no">3611</span><span id="line-3611"> @Override</span>
<span class="source-line-no">3612</span><span id="line-3612"> public &lt;S, R&gt; CompletableFuture&lt;R&gt; coprocessorService(Function&lt;RpcChannel, S&gt; stubMaker,</span>
<span class="source-line-no">3613</span><span id="line-3613"> ServiceCaller&lt;S, R&gt; callable) {</span>
<span class="source-line-no">3614</span><span id="line-3614"> MasterCoprocessorRpcChannelImpl channel =</span>
<span class="source-line-no">3615</span><span id="line-3615"> new MasterCoprocessorRpcChannelImpl(this.&lt;Message&gt; newMasterCaller());</span>
<span class="source-line-no">3616</span><span id="line-3616"> S stub = stubMaker.apply(channel);</span>
<span class="source-line-no">3617</span><span id="line-3617"> CompletableFuture&lt;R&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3618</span><span id="line-3618"> ClientCoprocessorRpcController controller = new ClientCoprocessorRpcController();</span>
<span class="source-line-no">3619</span><span id="line-3619"> callable.call(stub, controller, resp -&gt; {</span>
<span class="source-line-no">3620</span><span id="line-3620"> if (controller.failed()) {</span>
<span class="source-line-no">3621</span><span id="line-3621"> future.completeExceptionally(controller.getFailed());</span>
<span class="source-line-no">3622</span><span id="line-3622"> } else {</span>
<span class="source-line-no">3623</span><span id="line-3623"> future.complete(resp);</span>
<span class="source-line-no">3624</span><span id="line-3624"> }</span>
<span class="source-line-no">3625</span><span id="line-3625"> });</span>
<span class="source-line-no">3626</span><span id="line-3626"> return future;</span>
<span class="source-line-no">3627</span><span id="line-3627"> }</span>
<span class="source-line-no">3628</span><span id="line-3628"></span>
<span class="source-line-no">3629</span><span id="line-3629"> @Override</span>
<span class="source-line-no">3630</span><span id="line-3630"> public &lt;S, R&gt; CompletableFuture&lt;R&gt; coprocessorService(Function&lt;RpcChannel, S&gt; stubMaker,</span>
<span class="source-line-no">3631</span><span id="line-3631"> ServiceCaller&lt;S, R&gt; callable, ServerName serverName) {</span>
<span class="source-line-no">3632</span><span id="line-3632"> RegionServerCoprocessorRpcChannelImpl channel = new RegionServerCoprocessorRpcChannelImpl(</span>
<span class="source-line-no">3633</span><span id="line-3633"> this.&lt;Message&gt; newServerCaller().serverName(serverName));</span>
<span class="source-line-no">3634</span><span id="line-3634"> S stub = stubMaker.apply(channel);</span>
<span class="source-line-no">3635</span><span id="line-3635"> CompletableFuture&lt;R&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3636</span><span id="line-3636"> ClientCoprocessorRpcController controller = new ClientCoprocessorRpcController();</span>
<span class="source-line-no">3637</span><span id="line-3637"> callable.call(stub, controller, resp -&gt; {</span>
<span class="source-line-no">3638</span><span id="line-3638"> if (controller.failed()) {</span>
<span class="source-line-no">3639</span><span id="line-3639"> future.completeExceptionally(controller.getFailed());</span>
<span class="source-line-no">3640</span><span id="line-3640"> } else {</span>
<span class="source-line-no">3641</span><span id="line-3641"> future.complete(resp);</span>
<span class="source-line-no">3642</span><span id="line-3642"> }</span>
<span class="source-line-no">3643</span><span id="line-3643"> });</span>
<span class="source-line-no">3644</span><span id="line-3644"> return future;</span>
<span class="source-line-no">3645</span><span id="line-3645"> }</span>
<span class="source-line-no">3646</span><span id="line-3646"></span>
<span class="source-line-no">3647</span><span id="line-3647"> @Override</span>
<span class="source-line-no">3648</span><span id="line-3648"> public CompletableFuture&lt;List&lt;ServerName&gt;&gt; clearDeadServers(List&lt;ServerName&gt; servers) {</span>
<span class="source-line-no">3649</span><span id="line-3649"> return this.&lt;List&lt;ServerName&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">3650</span><span id="line-3650"> .action((controller, stub) -&gt; this.&lt;ClearDeadServersRequest, ClearDeadServersResponse,</span>
<span class="source-line-no">3651</span><span id="line-3651"> List&lt;ServerName&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">3652</span><span id="line-3652"> RequestConverter.buildClearDeadServersRequest(servers),</span>
<span class="source-line-no">3653</span><span id="line-3653"> (s, c, req, done) -&gt; s.clearDeadServers(c, req, done),</span>
<span class="source-line-no">3654</span><span id="line-3654"> (resp) -&gt; ProtobufUtil.toServerNameList(resp.getServerNameList())))</span>
<span class="source-line-no">3655</span><span id="line-3655"> .call();</span>
<span class="source-line-no">3656</span><span id="line-3656"> }</span>
<span class="source-line-no">3657</span><span id="line-3657"></span>
<span class="source-line-no">3658</span><span id="line-3658"> &lt;T&gt; ServerRequestCallerBuilder&lt;T&gt; newServerCaller() {</span>
<span class="source-line-no">3659</span><span id="line-3659"> return this.connection.callerFactory.&lt;T&gt; serverRequest()</span>
<span class="source-line-no">3660</span><span id="line-3660"> .rpcTimeout(rpcTimeoutNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">3661</span><span id="line-3661"> .operationTimeout(operationTimeoutNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">3662</span><span id="line-3662"> .pause(pauseNs, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">3663</span><span id="line-3663"> .pauseForServerOverloaded(pauseNsForServerOverloaded, TimeUnit.NANOSECONDS)</span>
<span class="source-line-no">3664</span><span id="line-3664"> .maxAttempts(maxAttempts).startLogErrorsCnt(startLogErrorsCnt);</span>
<span class="source-line-no">3665</span><span id="line-3665"> }</span>
<span class="source-line-no">3666</span><span id="line-3666"></span>
<span class="source-line-no">3667</span><span id="line-3667"> @Override</span>
<span class="source-line-no">3668</span><span id="line-3668"> public CompletableFuture&lt;Void&gt; enableTableReplication(TableName tableName) {</span>
<span class="source-line-no">3669</span><span id="line-3669"> if (tableName == null) {</span>
<span class="source-line-no">3670</span><span id="line-3670"> return failedFuture(new IllegalArgumentException("Table name is null"));</span>
<span class="source-line-no">3671</span><span id="line-3671"> }</span>
<span class="source-line-no">3672</span><span id="line-3672"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3673</span><span id="line-3673"> addListener(tableExists(tableName), (exist, err) -&gt; {</span>
<span class="source-line-no">3674</span><span id="line-3674"> if (err != null) {</span>
<span class="source-line-no">3675</span><span id="line-3675"> future.completeExceptionally(err);</span>
<span class="source-line-no">3676</span><span id="line-3676"> return;</span>
<span class="source-line-no">3677</span><span id="line-3677"> }</span>
<span class="source-line-no">3678</span><span id="line-3678"> if (!exist) {</span>
<span class="source-line-no">3679</span><span id="line-3679"> future.completeExceptionally(new TableNotFoundException(</span>
<span class="source-line-no">3680</span><span id="line-3680"> "Table '" + tableName.getNameAsString() + "' does not exists."));</span>
<span class="source-line-no">3681</span><span id="line-3681"> return;</span>
<span class="source-line-no">3682</span><span id="line-3682"> }</span>
<span class="source-line-no">3683</span><span id="line-3683"> addListener(getTableSplits(tableName), (splits, err1) -&gt; {</span>
<span class="source-line-no">3684</span><span id="line-3684"> if (err1 != null) {</span>
<span class="source-line-no">3685</span><span id="line-3685"> future.completeExceptionally(err1);</span>
<span class="source-line-no">3686</span><span id="line-3686"> } else {</span>
<span class="source-line-no">3687</span><span id="line-3687"> addListener(checkAndSyncTableToPeerClusters(tableName, splits), (result, err2) -&gt; {</span>
<span class="source-line-no">3688</span><span id="line-3688"> if (err2 != null) {</span>
<span class="source-line-no">3689</span><span id="line-3689"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3690</span><span id="line-3690"> } else {</span>
<span class="source-line-no">3691</span><span id="line-3691"> addListener(setTableReplication(tableName, true), (result3, err3) -&gt; {</span>
<span class="source-line-no">3692</span><span id="line-3692"> if (err3 != null) {</span>
<span class="source-line-no">3693</span><span id="line-3693"> future.completeExceptionally(err3);</span>
<span class="source-line-no">3694</span><span id="line-3694"> } else {</span>
<span class="source-line-no">3695</span><span id="line-3695"> future.complete(result3);</span>
<span class="source-line-no">3696</span><span id="line-3696"> }</span>
<span class="source-line-no">3697</span><span id="line-3697"> });</span>
<span class="source-line-no">3698</span><span id="line-3698"> }</span>
<span class="source-line-no">3699</span><span id="line-3699"> });</span>
<span class="source-line-no">3700</span><span id="line-3700"> }</span>
<span class="source-line-no">3701</span><span id="line-3701"> });</span>
<span class="source-line-no">3702</span><span id="line-3702"> });</span>
<span class="source-line-no">3703</span><span id="line-3703"> return future;</span>
<span class="source-line-no">3704</span><span id="line-3704"> }</span>
<span class="source-line-no">3705</span><span id="line-3705"></span>
<span class="source-line-no">3706</span><span id="line-3706"> @Override</span>
<span class="source-line-no">3707</span><span id="line-3707"> public CompletableFuture&lt;Void&gt; disableTableReplication(TableName tableName) {</span>
<span class="source-line-no">3708</span><span id="line-3708"> if (tableName == null) {</span>
<span class="source-line-no">3709</span><span id="line-3709"> return failedFuture(new IllegalArgumentException("Table name is null"));</span>
<span class="source-line-no">3710</span><span id="line-3710"> }</span>
<span class="source-line-no">3711</span><span id="line-3711"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3712</span><span id="line-3712"> addListener(tableExists(tableName), (exist, err) -&gt; {</span>
<span class="source-line-no">3713</span><span id="line-3713"> if (err != null) {</span>
<span class="source-line-no">3714</span><span id="line-3714"> future.completeExceptionally(err);</span>
<span class="source-line-no">3715</span><span id="line-3715"> return;</span>
<span class="source-line-no">3716</span><span id="line-3716"> }</span>
<span class="source-line-no">3717</span><span id="line-3717"> if (!exist) {</span>
<span class="source-line-no">3718</span><span id="line-3718"> future.completeExceptionally(new TableNotFoundException(</span>
<span class="source-line-no">3719</span><span id="line-3719"> "Table '" + tableName.getNameAsString() + "' does not exists."));</span>
<span class="source-line-no">3720</span><span id="line-3720"> return;</span>
<span class="source-line-no">3721</span><span id="line-3721"> }</span>
<span class="source-line-no">3722</span><span id="line-3722"> addListener(setTableReplication(tableName, false), (result, err2) -&gt; {</span>
<span class="source-line-no">3723</span><span id="line-3723"> if (err2 != null) {</span>
<span class="source-line-no">3724</span><span id="line-3724"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3725</span><span id="line-3725"> } else {</span>
<span class="source-line-no">3726</span><span id="line-3726"> future.complete(result);</span>
<span class="source-line-no">3727</span><span id="line-3727"> }</span>
<span class="source-line-no">3728</span><span id="line-3728"> });</span>
<span class="source-line-no">3729</span><span id="line-3729"> });</span>
<span class="source-line-no">3730</span><span id="line-3730"> return future;</span>
<span class="source-line-no">3731</span><span id="line-3731"> }</span>
<span class="source-line-no">3732</span><span id="line-3732"></span>
<span class="source-line-no">3733</span><span id="line-3733"> private CompletableFuture&lt;byte[][]&gt; getTableSplits(TableName tableName) {</span>
<span class="source-line-no">3734</span><span id="line-3734"> CompletableFuture&lt;byte[][]&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3735</span><span id="line-3735"> addListener(</span>
<span class="source-line-no">3736</span><span id="line-3736"> getRegions(tableName).thenApply(regions -&gt; regions.stream()</span>
<span class="source-line-no">3737</span><span id="line-3737"> .filter(RegionReplicaUtil::isDefaultReplica).collect(Collectors.toList())),</span>
<span class="source-line-no">3738</span><span id="line-3738"> (regions, err2) -&gt; {</span>
<span class="source-line-no">3739</span><span id="line-3739"> if (err2 != null) {</span>
<span class="source-line-no">3740</span><span id="line-3740"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3741</span><span id="line-3741"> return;</span>
<span class="source-line-no">3742</span><span id="line-3742"> }</span>
<span class="source-line-no">3743</span><span id="line-3743"> if (regions.size() == 1) {</span>
<span class="source-line-no">3744</span><span id="line-3744"> future.complete(null);</span>
<span class="source-line-no">3745</span><span id="line-3745"> } else {</span>
<span class="source-line-no">3746</span><span id="line-3746"> byte[][] splits = new byte[regions.size() - 1][];</span>
<span class="source-line-no">3747</span><span id="line-3747"> for (int i = 1; i &lt; regions.size(); i++) {</span>
<span class="source-line-no">3748</span><span id="line-3748"> splits[i - 1] = regions.get(i).getStartKey();</span>
<span class="source-line-no">3749</span><span id="line-3749"> }</span>
<span class="source-line-no">3750</span><span id="line-3750"> future.complete(splits);</span>
<span class="source-line-no">3751</span><span id="line-3751"> }</span>
<span class="source-line-no">3752</span><span id="line-3752"> });</span>
<span class="source-line-no">3753</span><span id="line-3753"> return future;</span>
<span class="source-line-no">3754</span><span id="line-3754"> }</span>
<span class="source-line-no">3755</span><span id="line-3755"></span>
<span class="source-line-no">3756</span><span id="line-3756"> /**</span>
<span class="source-line-no">3757</span><span id="line-3757"> * Connect to peer and check the table descriptor on peer:</span>
<span class="source-line-no">3758</span><span id="line-3758"> * &lt;ol&gt;</span>
<span class="source-line-no">3759</span><span id="line-3759"> * &lt;li&gt;Create the same table on peer when not exist.&lt;/li&gt;</span>
<span class="source-line-no">3760</span><span id="line-3760"> * &lt;li&gt;Throw an exception if the table already has replication enabled on any of the column</span>
<span class="source-line-no">3761</span><span id="line-3761"> * families.&lt;/li&gt;</span>
<span class="source-line-no">3762</span><span id="line-3762"> * &lt;li&gt;Throw an exception if the table exists on peer cluster but descriptors are not same.&lt;/li&gt;</span>
<span class="source-line-no">3763</span><span id="line-3763"> * &lt;/ol&gt;</span>
<span class="source-line-no">3764</span><span id="line-3764"> * @param tableName name of the table to sync to the peer</span>
<span class="source-line-no">3765</span><span id="line-3765"> * @param splits table split keys</span>
<span class="source-line-no">3766</span><span id="line-3766"> */</span>
<span class="source-line-no">3767</span><span id="line-3767"> private CompletableFuture&lt;Void&gt; checkAndSyncTableToPeerClusters(TableName tableName,</span>
<span class="source-line-no">3768</span><span id="line-3768"> byte[][] splits) {</span>
<span class="source-line-no">3769</span><span id="line-3769"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3770</span><span id="line-3770"> addListener(listReplicationPeers(), (peers, err) -&gt; {</span>
<span class="source-line-no">3771</span><span id="line-3771"> if (err != null) {</span>
<span class="source-line-no">3772</span><span id="line-3772"> future.completeExceptionally(err);</span>
<span class="source-line-no">3773</span><span id="line-3773"> return;</span>
<span class="source-line-no">3774</span><span id="line-3774"> }</span>
<span class="source-line-no">3775</span><span id="line-3775"> if (peers == null || peers.size() &lt;= 0) {</span>
<span class="source-line-no">3776</span><span id="line-3776"> future.completeExceptionally(</span>
<span class="source-line-no">3777</span><span id="line-3777"> new IllegalArgumentException("Found no peer cluster for replication."));</span>
<span class="source-line-no">3778</span><span id="line-3778"> return;</span>
<span class="source-line-no">3779</span><span id="line-3779"> }</span>
<span class="source-line-no">3780</span><span id="line-3780"> List&lt;CompletableFuture&lt;Void&gt;&gt; futures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">3781</span><span id="line-3781"> peers.stream().filter(peer -&gt; peer.getPeerConfig().needToReplicate(tableName))</span>
<span class="source-line-no">3782</span><span id="line-3782"> .forEach(peer -&gt; {</span>
<span class="source-line-no">3783</span><span id="line-3783"> futures.add(trySyncTableToPeerCluster(tableName, splits, peer));</span>
<span class="source-line-no">3784</span><span id="line-3784"> });</span>
<span class="source-line-no">3785</span><span id="line-3785"> addListener(</span>
<span class="source-line-no">3786</span><span id="line-3786"> CompletableFuture.allOf(futures.toArray(new CompletableFuture&lt;?&gt;[futures.size()])),</span>
<span class="source-line-no">3787</span><span id="line-3787"> (result, err2) -&gt; {</span>
<span class="source-line-no">3788</span><span id="line-3788"> if (err2 != null) {</span>
<span class="source-line-no">3789</span><span id="line-3789"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3790</span><span id="line-3790"> } else {</span>
<span class="source-line-no">3791</span><span id="line-3791"> future.complete(result);</span>
<span class="source-line-no">3792</span><span id="line-3792"> }</span>
<span class="source-line-no">3793</span><span id="line-3793"> });</span>
<span class="source-line-no">3794</span><span id="line-3794"> });</span>
<span class="source-line-no">3795</span><span id="line-3795"> return future;</span>
<span class="source-line-no">3796</span><span id="line-3796"> }</span>
<span class="source-line-no">3797</span><span id="line-3797"></span>
<span class="source-line-no">3798</span><span id="line-3798"> private CompletableFuture&lt;Void&gt; trySyncTableToPeerCluster(TableName tableName, byte[][] splits,</span>
<span class="source-line-no">3799</span><span id="line-3799"> ReplicationPeerDescription peer) {</span>
<span class="source-line-no">3800</span><span id="line-3800"> Configuration peerConf;</span>
<span class="source-line-no">3801</span><span id="line-3801"> try {</span>
<span class="source-line-no">3802</span><span id="line-3802"> peerConf = ReplicationPeerConfigUtil</span>
<span class="source-line-no">3803</span><span id="line-3803"> .getPeerClusterConfiguration(connection.getConfiguration(), peer.getPeerConfig());</span>
<span class="source-line-no">3804</span><span id="line-3804"> } catch (IOException e) {</span>
<span class="source-line-no">3805</span><span id="line-3805"> return failedFuture(e);</span>
<span class="source-line-no">3806</span><span id="line-3806"> }</span>
<span class="source-line-no">3807</span><span id="line-3807"> URI connectionUri =</span>
<span class="source-line-no">3808</span><span id="line-3808"> ConnectionRegistryFactory.tryParseAsConnectionURI(peer.getPeerConfig().getClusterKey());</span>
<span class="source-line-no">3809</span><span id="line-3809"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3810</span><span id="line-3810"> addListener(ConnectionFactory.createAsyncConnection(connectionUri, peerConf), (conn, err) -&gt; {</span>
<span class="source-line-no">3811</span><span id="line-3811"> if (err != null) {</span>
<span class="source-line-no">3812</span><span id="line-3812"> future.completeExceptionally(err);</span>
<span class="source-line-no">3813</span><span id="line-3813"> return;</span>
<span class="source-line-no">3814</span><span id="line-3814"> }</span>
<span class="source-line-no">3815</span><span id="line-3815"> addListener(getDescriptor(tableName), (tableDesc, err1) -&gt; {</span>
<span class="source-line-no">3816</span><span id="line-3816"> if (err1 != null) {</span>
<span class="source-line-no">3817</span><span id="line-3817"> future.completeExceptionally(err1);</span>
<span class="source-line-no">3818</span><span id="line-3818"> return;</span>
<span class="source-line-no">3819</span><span id="line-3819"> }</span>
<span class="source-line-no">3820</span><span id="line-3820"> AsyncAdmin peerAdmin = conn.getAdmin();</span>
<span class="source-line-no">3821</span><span id="line-3821"> addListener(peerAdmin.tableExists(tableName), (exist, err2) -&gt; {</span>
<span class="source-line-no">3822</span><span id="line-3822"> if (err2 != null) {</span>
<span class="source-line-no">3823</span><span id="line-3823"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3824</span><span id="line-3824"> return;</span>
<span class="source-line-no">3825</span><span id="line-3825"> }</span>
<span class="source-line-no">3826</span><span id="line-3826"> if (!exist) {</span>
<span class="source-line-no">3827</span><span id="line-3827"> CompletableFuture&lt;Void&gt; createTableFuture = null;</span>
<span class="source-line-no">3828</span><span id="line-3828"> if (splits == null) {</span>
<span class="source-line-no">3829</span><span id="line-3829"> createTableFuture = peerAdmin.createTable(tableDesc);</span>
<span class="source-line-no">3830</span><span id="line-3830"> } else {</span>
<span class="source-line-no">3831</span><span id="line-3831"> createTableFuture = peerAdmin.createTable(tableDesc, splits);</span>
<span class="source-line-no">3832</span><span id="line-3832"> }</span>
<span class="source-line-no">3833</span><span id="line-3833"> addListener(createTableFuture, (result, err3) -&gt; {</span>
<span class="source-line-no">3834</span><span id="line-3834"> if (err3 != null) {</span>
<span class="source-line-no">3835</span><span id="line-3835"> future.completeExceptionally(err3);</span>
<span class="source-line-no">3836</span><span id="line-3836"> } else {</span>
<span class="source-line-no">3837</span><span id="line-3837"> future.complete(result);</span>
<span class="source-line-no">3838</span><span id="line-3838"> }</span>
<span class="source-line-no">3839</span><span id="line-3839"> });</span>
<span class="source-line-no">3840</span><span id="line-3840"> } else {</span>
<span class="source-line-no">3841</span><span id="line-3841"> addListener(compareTableWithPeerCluster(tableName, tableDesc, peer, peerAdmin),</span>
<span class="source-line-no">3842</span><span id="line-3842"> (result, err4) -&gt; {</span>
<span class="source-line-no">3843</span><span id="line-3843"> if (err4 != null) {</span>
<span class="source-line-no">3844</span><span id="line-3844"> future.completeExceptionally(err4);</span>
<span class="source-line-no">3845</span><span id="line-3845"> } else {</span>
<span class="source-line-no">3846</span><span id="line-3846"> future.complete(result);</span>
<span class="source-line-no">3847</span><span id="line-3847"> }</span>
<span class="source-line-no">3848</span><span id="line-3848"> });</span>
<span class="source-line-no">3849</span><span id="line-3849"> }</span>
<span class="source-line-no">3850</span><span id="line-3850"> });</span>
<span class="source-line-no">3851</span><span id="line-3851"> });</span>
<span class="source-line-no">3852</span><span id="line-3852"> });</span>
<span class="source-line-no">3853</span><span id="line-3853"> return future;</span>
<span class="source-line-no">3854</span><span id="line-3854"> }</span>
<span class="source-line-no">3855</span><span id="line-3855"></span>
<span class="source-line-no">3856</span><span id="line-3856"> private CompletableFuture&lt;Void&gt; compareTableWithPeerCluster(TableName tableName,</span>
<span class="source-line-no">3857</span><span id="line-3857"> TableDescriptor tableDesc, ReplicationPeerDescription peer, AsyncAdmin peerAdmin) {</span>
<span class="source-line-no">3858</span><span id="line-3858"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3859</span><span id="line-3859"> addListener(peerAdmin.getDescriptor(tableName), (peerTableDesc, err) -&gt; {</span>
<span class="source-line-no">3860</span><span id="line-3860"> if (err != null) {</span>
<span class="source-line-no">3861</span><span id="line-3861"> future.completeExceptionally(err);</span>
<span class="source-line-no">3862</span><span id="line-3862"> return;</span>
<span class="source-line-no">3863</span><span id="line-3863"> }</span>
<span class="source-line-no">3864</span><span id="line-3864"> if (peerTableDesc == null) {</span>
<span class="source-line-no">3865</span><span id="line-3865"> future.completeExceptionally(</span>
<span class="source-line-no">3866</span><span id="line-3866"> new IllegalArgumentException("Failed to get table descriptor for table "</span>
<span class="source-line-no">3867</span><span id="line-3867"> + tableName.getNameAsString() + " from peer cluster " + peer.getPeerId()));</span>
<span class="source-line-no">3868</span><span id="line-3868"> return;</span>
<span class="source-line-no">3869</span><span id="line-3869"> }</span>
<span class="source-line-no">3870</span><span id="line-3870"> if (TableDescriptor.COMPARATOR_IGNORE_REPLICATION.compare(peerTableDesc, tableDesc) != 0) {</span>
<span class="source-line-no">3871</span><span id="line-3871"> future.completeExceptionally(new IllegalArgumentException(</span>
<span class="source-line-no">3872</span><span id="line-3872"> "Table " + tableName.getNameAsString() + " exists in peer cluster " + peer.getPeerId()</span>
<span class="source-line-no">3873</span><span id="line-3873"> + ", but the table descriptors are not same when compared with source cluster."</span>
<span class="source-line-no">3874</span><span id="line-3874"> + " Thus can not enable the table's replication switch."));</span>
<span class="source-line-no">3875</span><span id="line-3875"> return;</span>
<span class="source-line-no">3876</span><span id="line-3876"> }</span>
<span class="source-line-no">3877</span><span id="line-3877"> future.complete(null);</span>
<span class="source-line-no">3878</span><span id="line-3878"> });</span>
<span class="source-line-no">3879</span><span id="line-3879"> return future;</span>
<span class="source-line-no">3880</span><span id="line-3880"> }</span>
<span class="source-line-no">3881</span><span id="line-3881"></span>
<span class="source-line-no">3882</span><span id="line-3882"> /**</span>
<span class="source-line-no">3883</span><span id="line-3883"> * Set the table's replication switch if the table's replication switch is already not set.</span>
<span class="source-line-no">3884</span><span id="line-3884"> * @param tableName name of the table</span>
<span class="source-line-no">3885</span><span id="line-3885"> * @param enableRep is replication switch enable or disable</span>
<span class="source-line-no">3886</span><span id="line-3886"> */</span>
<span class="source-line-no">3887</span><span id="line-3887"> private CompletableFuture&lt;Void&gt; setTableReplication(TableName tableName, boolean enableRep) {</span>
<span class="source-line-no">3888</span><span id="line-3888"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3889</span><span id="line-3889"> addListener(getDescriptor(tableName), (tableDesc, err) -&gt; {</span>
<span class="source-line-no">3890</span><span id="line-3890"> if (err != null) {</span>
<span class="source-line-no">3891</span><span id="line-3891"> future.completeExceptionally(err);</span>
<span class="source-line-no">3892</span><span id="line-3892"> return;</span>
<span class="source-line-no">3893</span><span id="line-3893"> }</span>
<span class="source-line-no">3894</span><span id="line-3894"> if (!tableDesc.matchReplicationScope(enableRep)) {</span>
<span class="source-line-no">3895</span><span id="line-3895"> int scope =</span>
<span class="source-line-no">3896</span><span id="line-3896"> enableRep ? HConstants.REPLICATION_SCOPE_GLOBAL : HConstants.REPLICATION_SCOPE_LOCAL;</span>
<span class="source-line-no">3897</span><span id="line-3897"> TableDescriptor newTableDesc =</span>
<span class="source-line-no">3898</span><span id="line-3898"> TableDescriptorBuilder.newBuilder(tableDesc).setReplicationScope(scope).build();</span>
<span class="source-line-no">3899</span><span id="line-3899"> addListener(modifyTable(newTableDesc), (result, err2) -&gt; {</span>
<span class="source-line-no">3900</span><span id="line-3900"> if (err2 != null) {</span>
<span class="source-line-no">3901</span><span id="line-3901"> future.completeExceptionally(err2);</span>
<span class="source-line-no">3902</span><span id="line-3902"> } else {</span>
<span class="source-line-no">3903</span><span id="line-3903"> future.complete(result);</span>
<span class="source-line-no">3904</span><span id="line-3904"> }</span>
<span class="source-line-no">3905</span><span id="line-3905"> });</span>
<span class="source-line-no">3906</span><span id="line-3906"> } else {</span>
<span class="source-line-no">3907</span><span id="line-3907"> future.complete(null);</span>
<span class="source-line-no">3908</span><span id="line-3908"> }</span>
<span class="source-line-no">3909</span><span id="line-3909"> });</span>
<span class="source-line-no">3910</span><span id="line-3910"> return future;</span>
<span class="source-line-no">3911</span><span id="line-3911"> }</span>
<span class="source-line-no">3912</span><span id="line-3912"></span>
<span class="source-line-no">3913</span><span id="line-3913"> @Override</span>
<span class="source-line-no">3914</span><span id="line-3914"> public CompletableFuture&lt;Boolean&gt; isReplicationPeerEnabled(String peerId) {</span>
<span class="source-line-no">3915</span><span id="line-3915"> GetReplicationPeerStateRequest.Builder request = GetReplicationPeerStateRequest.newBuilder();</span>
<span class="source-line-no">3916</span><span id="line-3916"> request.setPeerId(peerId);</span>
<span class="source-line-no">3917</span><span id="line-3917"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3918</span><span id="line-3918"> .action((controller, stub) -&gt; this.&lt;GetReplicationPeerStateRequest,</span>
<span class="source-line-no">3919</span><span id="line-3919"> GetReplicationPeerStateResponse, Boolean&gt; call(controller, stub, request.build(),</span>
<span class="source-line-no">3920</span><span id="line-3920"> (s, c, req, done) -&gt; s.isReplicationPeerEnabled(c, req, done),</span>
<span class="source-line-no">3921</span><span id="line-3921"> resp -&gt; resp.getIsEnabled()))</span>
<span class="source-line-no">3922</span><span id="line-3922"> .call();</span>
<span class="source-line-no">3923</span><span id="line-3923"> }</span>
<span class="source-line-no">3924</span><span id="line-3924"></span>
<span class="source-line-no">3925</span><span id="line-3925"> private void waitUntilAllReplicationPeerModificationProceduresDone(</span>
<span class="source-line-no">3926</span><span id="line-3926"> CompletableFuture&lt;Boolean&gt; future, boolean prevOn, int retries) {</span>
<span class="source-line-no">3927</span><span id="line-3927"> CompletableFuture&lt;List&lt;ProcedureProtos.Procedure&gt;&gt; callFuture =</span>
<span class="source-line-no">3928</span><span id="line-3928"> this.&lt;List&lt;ProcedureProtos.Procedure&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">3929</span><span id="line-3929"> .action((controller, stub) -&gt; this.&lt;GetReplicationPeerModificationProceduresRequest,</span>
<span class="source-line-no">3930</span><span id="line-3930"> GetReplicationPeerModificationProceduresResponse, List&lt;ProcedureProtos.Procedure&gt;&gt; call(</span>
<span class="source-line-no">3931</span><span id="line-3931"> controller, stub, GetReplicationPeerModificationProceduresRequest.getDefaultInstance(),</span>
<span class="source-line-no">3932</span><span id="line-3932"> (s, c, req, done) -&gt; s.getReplicationPeerModificationProcedures(c, req, done),</span>
<span class="source-line-no">3933</span><span id="line-3933"> resp -&gt; resp.getProcedureList()))</span>
<span class="source-line-no">3934</span><span id="line-3934"> .call();</span>
<span class="source-line-no">3935</span><span id="line-3935"> addListener(callFuture, (r, e) -&gt; {</span>
<span class="source-line-no">3936</span><span id="line-3936"> if (e != null) {</span>
<span class="source-line-no">3937</span><span id="line-3937"> future.completeExceptionally(e);</span>
<span class="source-line-no">3938</span><span id="line-3938"> } else if (r.isEmpty()) {</span>
<span class="source-line-no">3939</span><span id="line-3939"> // we are done</span>
<span class="source-line-no">3940</span><span id="line-3940"> future.complete(prevOn);</span>
<span class="source-line-no">3941</span><span id="line-3941"> } else {</span>
<span class="source-line-no">3942</span><span id="line-3942"> // retry later to see if the procedures are done</span>
<span class="source-line-no">3943</span><span id="line-3943"> retryTimer.newTimeout(</span>
<span class="source-line-no">3944</span><span id="line-3944"> t -&gt; waitUntilAllReplicationPeerModificationProceduresDone(future, prevOn, retries + 1),</span>
<span class="source-line-no">3945</span><span id="line-3945"> ConnectionUtils.getPauseTime(pauseNs, retries), TimeUnit.NANOSECONDS);</span>
<span class="source-line-no">3946</span><span id="line-3946"> }</span>
<span class="source-line-no">3947</span><span id="line-3947"> });</span>
<span class="source-line-no">3948</span><span id="line-3948"> }</span>
<span class="source-line-no">3949</span><span id="line-3949"></span>
<span class="source-line-no">3950</span><span id="line-3950"> @Override</span>
<span class="source-line-no">3951</span><span id="line-3951"> public CompletableFuture&lt;Boolean&gt; replicationPeerModificationSwitch(boolean on,</span>
<span class="source-line-no">3952</span><span id="line-3952"> boolean drainProcedures) {</span>
<span class="source-line-no">3953</span><span id="line-3953"> ReplicationPeerModificationSwitchRequest request =</span>
<span class="source-line-no">3954</span><span id="line-3954"> ReplicationPeerModificationSwitchRequest.newBuilder().setOn(on).build();</span>
<span class="source-line-no">3955</span><span id="line-3955"> CompletableFuture&lt;Boolean&gt; callFuture = this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3956</span><span id="line-3956"> .action((controller, stub) -&gt; this.&lt;ReplicationPeerModificationSwitchRequest,</span>
<span class="source-line-no">3957</span><span id="line-3957"> ReplicationPeerModificationSwitchResponse, Boolean&gt; call(controller, stub, request,</span>
<span class="source-line-no">3958</span><span id="line-3958"> (s, c, req, done) -&gt; s.replicationPeerModificationSwitch(c, req, done),</span>
<span class="source-line-no">3959</span><span id="line-3959"> resp -&gt; resp.getPreviousValue()))</span>
<span class="source-line-no">3960</span><span id="line-3960"> .call();</span>
<span class="source-line-no">3961</span><span id="line-3961"> // if we do not need to wait all previous peer modification procedure done, or we are enabling</span>
<span class="source-line-no">3962</span><span id="line-3962"> // peer modification, just return here.</span>
<span class="source-line-no">3963</span><span id="line-3963"> if (!drainProcedures || on) {</span>
<span class="source-line-no">3964</span><span id="line-3964"> return callFuture;</span>
<span class="source-line-no">3965</span><span id="line-3965"> }</span>
<span class="source-line-no">3966</span><span id="line-3966"> // otherwise we need to wait until all previous peer modification procedure done</span>
<span class="source-line-no">3967</span><span id="line-3967"> CompletableFuture&lt;Boolean&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3968</span><span id="line-3968"> addListener(callFuture, (prevOn, err) -&gt; {</span>
<span class="source-line-no">3969</span><span id="line-3969"> if (err != null) {</span>
<span class="source-line-no">3970</span><span id="line-3970"> future.completeExceptionally(err);</span>
<span class="source-line-no">3971</span><span id="line-3971"> return;</span>
<span class="source-line-no">3972</span><span id="line-3972"> }</span>
<span class="source-line-no">3973</span><span id="line-3973"> // even if the previous state is disabled, we still need to wait here, as there could be</span>
<span class="source-line-no">3974</span><span id="line-3974"> // another client thread which called this method just before us and have already changed the</span>
<span class="source-line-no">3975</span><span id="line-3975"> // state to off, but there are still peer modification procedures not finished, so we should</span>
<span class="source-line-no">3976</span><span id="line-3976"> // also wait here.</span>
<span class="source-line-no">3977</span><span id="line-3977"> waitUntilAllReplicationPeerModificationProceduresDone(future, prevOn, 0);</span>
<span class="source-line-no">3978</span><span id="line-3978"> });</span>
<span class="source-line-no">3979</span><span id="line-3979"> return future;</span>
<span class="source-line-no">3980</span><span id="line-3980"> }</span>
<span class="source-line-no">3981</span><span id="line-3981"></span>
<span class="source-line-no">3982</span><span id="line-3982"> @Override</span>
<span class="source-line-no">3983</span><span id="line-3983"> public CompletableFuture&lt;Boolean&gt; isReplicationPeerModificationEnabled() {</span>
<span class="source-line-no">3984</span><span id="line-3984"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">3985</span><span id="line-3985"> .action((controller, stub) -&gt; this.&lt;IsReplicationPeerModificationEnabledRequest,</span>
<span class="source-line-no">3986</span><span id="line-3986"> IsReplicationPeerModificationEnabledResponse, Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">3987</span><span id="line-3987"> IsReplicationPeerModificationEnabledRequest.getDefaultInstance(),</span>
<span class="source-line-no">3988</span><span id="line-3988"> (s, c, req, done) -&gt; s.isReplicationPeerModificationEnabled(c, req, done),</span>
<span class="source-line-no">3989</span><span id="line-3989"> (resp) -&gt; resp.getEnabled()))</span>
<span class="source-line-no">3990</span><span id="line-3990"> .call();</span>
<span class="source-line-no">3991</span><span id="line-3991"> }</span>
<span class="source-line-no">3992</span><span id="line-3992"></span>
<span class="source-line-no">3993</span><span id="line-3993"> @Override</span>
<span class="source-line-no">3994</span><span id="line-3994"> public CompletableFuture&lt;CacheEvictionStats&gt; clearBlockCache(TableName tableName) {</span>
<span class="source-line-no">3995</span><span id="line-3995"> CompletableFuture&lt;CacheEvictionStats&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">3996</span><span id="line-3996"> addListener(getTableHRegionLocations(tableName), (locations, err) -&gt; {</span>
<span class="source-line-no">3997</span><span id="line-3997"> if (err != null) {</span>
<span class="source-line-no">3998</span><span id="line-3998"> future.completeExceptionally(err);</span>
<span class="source-line-no">3999</span><span id="line-3999"> return;</span>
<span class="source-line-no">4000</span><span id="line-4000"> }</span>
<span class="source-line-no">4001</span><span id="line-4001"> Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; regionInfoByServerName =</span>
<span class="source-line-no">4002</span><span id="line-4002"> locations.stream().filter(l -&gt; l.getRegion() != null)</span>
<span class="source-line-no">4003</span><span id="line-4003"> .filter(l -&gt; !l.getRegion().isOffline()).filter(l -&gt; l.getServerName() != null)</span>
<span class="source-line-no">4004</span><span id="line-4004"> .collect(Collectors.groupingBy(l -&gt; l.getServerName(),</span>
<span class="source-line-no">4005</span><span id="line-4005"> Collectors.mapping(l -&gt; l.getRegion(), Collectors.toList())));</span>
<span class="source-line-no">4006</span><span id="line-4006"> List&lt;CompletableFuture&lt;CacheEvictionStats&gt;&gt; futures = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">4007</span><span id="line-4007"> CacheEvictionStatsAggregator aggregator = new CacheEvictionStatsAggregator();</span>
<span class="source-line-no">4008</span><span id="line-4008"> for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : regionInfoByServerName.entrySet()) {</span>
<span class="source-line-no">4009</span><span id="line-4009"> futures</span>
<span class="source-line-no">4010</span><span id="line-4010"> .add(clearBlockCache(entry.getKey(), entry.getValue()).whenComplete((stats, err2) -&gt; {</span>
<span class="source-line-no">4011</span><span id="line-4011"> if (err2 != null) {</span>
<span class="source-line-no">4012</span><span id="line-4012"> future.completeExceptionally(unwrapCompletionException(err2));</span>
<span class="source-line-no">4013</span><span id="line-4013"> } else {</span>
<span class="source-line-no">4014</span><span id="line-4014"> aggregator.append(stats);</span>
<span class="source-line-no">4015</span><span id="line-4015"> }</span>
<span class="source-line-no">4016</span><span id="line-4016"> }));</span>
<span class="source-line-no">4017</span><span id="line-4017"> }</span>
<span class="source-line-no">4018</span><span id="line-4018"> addListener(CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])),</span>
<span class="source-line-no">4019</span><span id="line-4019"> (ret, err3) -&gt; {</span>
<span class="source-line-no">4020</span><span id="line-4020"> if (err3 != null) {</span>
<span class="source-line-no">4021</span><span id="line-4021"> future.completeExceptionally(unwrapCompletionException(err3));</span>
<span class="source-line-no">4022</span><span id="line-4022"> } else {</span>
<span class="source-line-no">4023</span><span id="line-4023"> future.complete(aggregator.sum());</span>
<span class="source-line-no">4024</span><span id="line-4024"> }</span>
<span class="source-line-no">4025</span><span id="line-4025"> });</span>
<span class="source-line-no">4026</span><span id="line-4026"> });</span>
<span class="source-line-no">4027</span><span id="line-4027"> return future;</span>
<span class="source-line-no">4028</span><span id="line-4028"> }</span>
<span class="source-line-no">4029</span><span id="line-4029"></span>
<span class="source-line-no">4030</span><span id="line-4030"> @Override</span>
<span class="source-line-no">4031</span><span id="line-4031"> public CompletableFuture&lt;Void&gt; cloneTableSchema(TableName tableName, TableName newTableName,</span>
<span class="source-line-no">4032</span><span id="line-4032"> boolean preserveSplits) {</span>
<span class="source-line-no">4033</span><span id="line-4033"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">4034</span><span id="line-4034"> addListener(tableExists(tableName), (exist, err) -&gt; {</span>
<span class="source-line-no">4035</span><span id="line-4035"> if (err != null) {</span>
<span class="source-line-no">4036</span><span id="line-4036"> future.completeExceptionally(err);</span>
<span class="source-line-no">4037</span><span id="line-4037"> return;</span>
<span class="source-line-no">4038</span><span id="line-4038"> }</span>
<span class="source-line-no">4039</span><span id="line-4039"> if (!exist) {</span>
<span class="source-line-no">4040</span><span id="line-4040"> future.completeExceptionally(new TableNotFoundException(tableName));</span>
<span class="source-line-no">4041</span><span id="line-4041"> return;</span>
<span class="source-line-no">4042</span><span id="line-4042"> }</span>
<span class="source-line-no">4043</span><span id="line-4043"> addListener(tableExists(newTableName), (exist1, err1) -&gt; {</span>
<span class="source-line-no">4044</span><span id="line-4044"> if (err1 != null) {</span>
<span class="source-line-no">4045</span><span id="line-4045"> future.completeExceptionally(err1);</span>
<span class="source-line-no">4046</span><span id="line-4046"> return;</span>
<span class="source-line-no">4047</span><span id="line-4047"> }</span>
<span class="source-line-no">4048</span><span id="line-4048"> if (exist1) {</span>
<span class="source-line-no">4049</span><span id="line-4049"> future.completeExceptionally(new TableExistsException(newTableName));</span>
<span class="source-line-no">4050</span><span id="line-4050"> return;</span>
<span class="source-line-no">4051</span><span id="line-4051"> }</span>
<span class="source-line-no">4052</span><span id="line-4052"> addListener(getDescriptor(tableName), (tableDesc, err2) -&gt; {</span>
<span class="source-line-no">4053</span><span id="line-4053"> if (err2 != null) {</span>
<span class="source-line-no">4054</span><span id="line-4054"> future.completeExceptionally(err2);</span>
<span class="source-line-no">4055</span><span id="line-4055"> return;</span>
<span class="source-line-no">4056</span><span id="line-4056"> }</span>
<span class="source-line-no">4057</span><span id="line-4057"> TableDescriptor newTableDesc = TableDescriptorBuilder.copy(newTableName, tableDesc);</span>
<span class="source-line-no">4058</span><span id="line-4058"> if (preserveSplits) {</span>
<span class="source-line-no">4059</span><span id="line-4059"> addListener(getTableSplits(tableName), (splits, err3) -&gt; {</span>
<span class="source-line-no">4060</span><span id="line-4060"> if (err3 != null) {</span>
<span class="source-line-no">4061</span><span id="line-4061"> future.completeExceptionally(err3);</span>
<span class="source-line-no">4062</span><span id="line-4062"> } else {</span>
<span class="source-line-no">4063</span><span id="line-4063"> addListener(</span>
<span class="source-line-no">4064</span><span id="line-4064"> splits != null ? createTable(newTableDesc, splits) : createTable(newTableDesc),</span>
<span class="source-line-no">4065</span><span id="line-4065"> (result, err4) -&gt; {</span>
<span class="source-line-no">4066</span><span id="line-4066"> if (err4 != null) {</span>
<span class="source-line-no">4067</span><span id="line-4067"> future.completeExceptionally(err4);</span>
<span class="source-line-no">4068</span><span id="line-4068"> } else {</span>
<span class="source-line-no">4069</span><span id="line-4069"> future.complete(result);</span>
<span class="source-line-no">4070</span><span id="line-4070"> }</span>
<span class="source-line-no">4071</span><span id="line-4071"> });</span>
<span class="source-line-no">4072</span><span id="line-4072"> }</span>
<span class="source-line-no">4073</span><span id="line-4073"> });</span>
<span class="source-line-no">4074</span><span id="line-4074"> } else {</span>
<span class="source-line-no">4075</span><span id="line-4075"> addListener(createTable(newTableDesc), (result, err5) -&gt; {</span>
<span class="source-line-no">4076</span><span id="line-4076"> if (err5 != null) {</span>
<span class="source-line-no">4077</span><span id="line-4077"> future.completeExceptionally(err5);</span>
<span class="source-line-no">4078</span><span id="line-4078"> } else {</span>
<span class="source-line-no">4079</span><span id="line-4079"> future.complete(result);</span>
<span class="source-line-no">4080</span><span id="line-4080"> }</span>
<span class="source-line-no">4081</span><span id="line-4081"> });</span>
<span class="source-line-no">4082</span><span id="line-4082"> }</span>
<span class="source-line-no">4083</span><span id="line-4083"> });</span>
<span class="source-line-no">4084</span><span id="line-4084"> });</span>
<span class="source-line-no">4085</span><span id="line-4085"> });</span>
<span class="source-line-no">4086</span><span id="line-4086"> return future;</span>
<span class="source-line-no">4087</span><span id="line-4087"> }</span>
<span class="source-line-no">4088</span><span id="line-4088"></span>
<span class="source-line-no">4089</span><span id="line-4089"> private CompletableFuture&lt;CacheEvictionStats&gt; clearBlockCache(ServerName serverName,</span>
<span class="source-line-no">4090</span><span id="line-4090"> List&lt;RegionInfo&gt; hris) {</span>
<span class="source-line-no">4091</span><span id="line-4091"> return this.&lt;CacheEvictionStats&gt; newAdminCaller()</span>
<span class="source-line-no">4092</span><span id="line-4092"> .action((controller, stub) -&gt; this.&lt;ClearRegionBlockCacheRequest,</span>
<span class="source-line-no">4093</span><span id="line-4093"> ClearRegionBlockCacheResponse, CacheEvictionStats&gt; adminCall(controller, stub,</span>
<span class="source-line-no">4094</span><span id="line-4094"> RequestConverter.buildClearRegionBlockCacheRequest(hris),</span>
<span class="source-line-no">4095</span><span id="line-4095"> (s, c, req, done) -&gt; s.clearRegionBlockCache(controller, req, done),</span>
<span class="source-line-no">4096</span><span id="line-4096"> resp -&gt; ProtobufUtil.toCacheEvictionStats(resp.getStats())))</span>
<span class="source-line-no">4097</span><span id="line-4097"> .serverName(serverName).call();</span>
<span class="source-line-no">4098</span><span id="line-4098"> }</span>
<span class="source-line-no">4099</span><span id="line-4099"></span>
<span class="source-line-no">4100</span><span id="line-4100"> @Override</span>
<span class="source-line-no">4101</span><span id="line-4101"> public CompletableFuture&lt;Boolean&gt; switchRpcThrottle(boolean enable) {</span>
<span class="source-line-no">4102</span><span id="line-4102"> CompletableFuture&lt;Boolean&gt; future = this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">4103</span><span id="line-4103"> .action((controller, stub) -&gt; this.&lt;SwitchRpcThrottleRequest, SwitchRpcThrottleResponse,</span>
<span class="source-line-no">4104</span><span id="line-4104"> Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">4105</span><span id="line-4105"> SwitchRpcThrottleRequest.newBuilder().setRpcThrottleEnabled(enable).build(),</span>
<span class="source-line-no">4106</span><span id="line-4106"> (s, c, req, done) -&gt; s.switchRpcThrottle(c, req, done),</span>
<span class="source-line-no">4107</span><span id="line-4107"> resp -&gt; resp.getPreviousRpcThrottleEnabled()))</span>
<span class="source-line-no">4108</span><span id="line-4108"> .call();</span>
<span class="source-line-no">4109</span><span id="line-4109"> return future;</span>
<span class="source-line-no">4110</span><span id="line-4110"> }</span>
<span class="source-line-no">4111</span><span id="line-4111"></span>
<span class="source-line-no">4112</span><span id="line-4112"> @Override</span>
<span class="source-line-no">4113</span><span id="line-4113"> public CompletableFuture&lt;Boolean&gt; isRpcThrottleEnabled() {</span>
<span class="source-line-no">4114</span><span id="line-4114"> CompletableFuture&lt;Boolean&gt; future = this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">4115</span><span id="line-4115"> .action((controller, stub) -&gt; this.&lt;IsRpcThrottleEnabledRequest, IsRpcThrottleEnabledResponse,</span>
<span class="source-line-no">4116</span><span id="line-4116"> Boolean&gt; call(controller, stub, IsRpcThrottleEnabledRequest.newBuilder().build(),</span>
<span class="source-line-no">4117</span><span id="line-4117"> (s, c, req, done) -&gt; s.isRpcThrottleEnabled(c, req, done),</span>
<span class="source-line-no">4118</span><span id="line-4118"> resp -&gt; resp.getRpcThrottleEnabled()))</span>
<span class="source-line-no">4119</span><span id="line-4119"> .call();</span>
<span class="source-line-no">4120</span><span id="line-4120"> return future;</span>
<span class="source-line-no">4121</span><span id="line-4121"> }</span>
<span class="source-line-no">4122</span><span id="line-4122"></span>
<span class="source-line-no">4123</span><span id="line-4123"> @Override</span>
<span class="source-line-no">4124</span><span id="line-4124"> public CompletableFuture&lt;Boolean&gt; exceedThrottleQuotaSwitch(boolean enable) {</span>
<span class="source-line-no">4125</span><span id="line-4125"> CompletableFuture&lt;Boolean&gt; future = this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">4126</span><span id="line-4126"> .action((controller, stub) -&gt; this.&lt;SwitchExceedThrottleQuotaRequest,</span>
<span class="source-line-no">4127</span><span id="line-4127"> SwitchExceedThrottleQuotaResponse, Boolean&gt; call(controller, stub,</span>
<span class="source-line-no">4128</span><span id="line-4128"> SwitchExceedThrottleQuotaRequest.newBuilder().setExceedThrottleQuotaEnabled(enable)</span>
<span class="source-line-no">4129</span><span id="line-4129"> .build(),</span>
<span class="source-line-no">4130</span><span id="line-4130"> (s, c, req, done) -&gt; s.switchExceedThrottleQuota(c, req, done),</span>
<span class="source-line-no">4131</span><span id="line-4131"> resp -&gt; resp.getPreviousExceedThrottleQuotaEnabled()))</span>
<span class="source-line-no">4132</span><span id="line-4132"> .call();</span>
<span class="source-line-no">4133</span><span id="line-4133"> return future;</span>
<span class="source-line-no">4134</span><span id="line-4134"> }</span>
<span class="source-line-no">4135</span><span id="line-4135"></span>
<span class="source-line-no">4136</span><span id="line-4136"> @Override</span>
<span class="source-line-no">4137</span><span id="line-4137"> public CompletableFuture&lt;Map&lt;TableName, Long&gt;&gt; getSpaceQuotaTableSizes() {</span>
<span class="source-line-no">4138</span><span id="line-4138"> return this.&lt;Map&lt;TableName, Long&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4139</span><span id="line-4139"> .action((controller, stub) -&gt; this.&lt;GetSpaceQuotaRegionSizesRequest,</span>
<span class="source-line-no">4140</span><span id="line-4140"> GetSpaceQuotaRegionSizesResponse, Map&lt;TableName, Long&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">4141</span><span id="line-4141"> RequestConverter.buildGetSpaceQuotaRegionSizesRequest(),</span>
<span class="source-line-no">4142</span><span id="line-4142"> (s, c, req, done) -&gt; s.getSpaceQuotaRegionSizes(c, req, done),</span>
<span class="source-line-no">4143</span><span id="line-4143"> resp -&gt; resp.getSizesList().stream().collect(Collectors</span>
<span class="source-line-no">4144</span><span id="line-4144"> .toMap(sizes -&gt; ProtobufUtil.toTableName(sizes.getTableName()), RegionSizes::getSize))))</span>
<span class="source-line-no">4145</span><span id="line-4145"> .call();</span>
<span class="source-line-no">4146</span><span id="line-4146"> }</span>
<span class="source-line-no">4147</span><span id="line-4147"></span>
<span class="source-line-no">4148</span><span id="line-4148"> @Override</span>
<span class="source-line-no">4149</span><span id="line-4149"> public CompletableFuture&lt;Map&lt;TableName, SpaceQuotaSnapshot&gt;&gt;</span>
<span class="source-line-no">4150</span><span id="line-4150"> getRegionServerSpaceQuotaSnapshots(ServerName serverName) {</span>
<span class="source-line-no">4151</span><span id="line-4151"> return this.&lt;Map&lt;TableName, SpaceQuotaSnapshot&gt;&gt; newAdminCaller()</span>
<span class="source-line-no">4152</span><span id="line-4152"> .action((controller, stub) -&gt; this.&lt;GetSpaceQuotaSnapshotsRequest,</span>
<span class="source-line-no">4153</span><span id="line-4153"> GetSpaceQuotaSnapshotsResponse, Map&lt;TableName, SpaceQuotaSnapshot&gt;&gt; adminCall(controller,</span>
<span class="source-line-no">4154</span><span id="line-4154"> stub, RequestConverter.buildGetSpaceQuotaSnapshotsRequest(),</span>
<span class="source-line-no">4155</span><span id="line-4155"> (s, c, req, done) -&gt; s.getSpaceQuotaSnapshots(controller, req, done),</span>
<span class="source-line-no">4156</span><span id="line-4156"> resp -&gt; resp.getSnapshotsList().stream()</span>
<span class="source-line-no">4157</span><span id="line-4157"> .collect(Collectors.toMap(snapshot -&gt; ProtobufUtil.toTableName(snapshot.getTableName()),</span>
<span class="source-line-no">4158</span><span id="line-4158"> snapshot -&gt; SpaceQuotaSnapshot.toSpaceQuotaSnapshot(snapshot.getSnapshot())))))</span>
<span class="source-line-no">4159</span><span id="line-4159"> .serverName(serverName).call();</span>
<span class="source-line-no">4160</span><span id="line-4160"> }</span>
<span class="source-line-no">4161</span><span id="line-4161"></span>
<span class="source-line-no">4162</span><span id="line-4162"> private CompletableFuture&lt;SpaceQuotaSnapshot&gt;</span>
<span class="source-line-no">4163</span><span id="line-4163"> getCurrentSpaceQuotaSnapshot(Converter&lt;SpaceQuotaSnapshot, GetQuotaStatesResponse&gt; converter) {</span>
<span class="source-line-no">4164</span><span id="line-4164"> return this.&lt;SpaceQuotaSnapshot&gt; newMasterCaller()</span>
<span class="source-line-no">4165</span><span id="line-4165"> .action((controller, stub) -&gt; this.&lt;GetQuotaStatesRequest, GetQuotaStatesResponse,</span>
<span class="source-line-no">4166</span><span id="line-4166"> SpaceQuotaSnapshot&gt; call(controller, stub, RequestConverter.buildGetQuotaStatesRequest(),</span>
<span class="source-line-no">4167</span><span id="line-4167"> (s, c, req, done) -&gt; s.getQuotaStates(c, req, done), converter))</span>
<span class="source-line-no">4168</span><span id="line-4168"> .call();</span>
<span class="source-line-no">4169</span><span id="line-4169"> }</span>
<span class="source-line-no">4170</span><span id="line-4170"></span>
<span class="source-line-no">4171</span><span id="line-4171"> @Override</span>
<span class="source-line-no">4172</span><span id="line-4172"> public CompletableFuture&lt;SpaceQuotaSnapshot&gt; getCurrentSpaceQuotaSnapshot(String namespace) {</span>
<span class="source-line-no">4173</span><span id="line-4173"> return getCurrentSpaceQuotaSnapshot(resp -&gt; resp.getNsSnapshotsList().stream()</span>
<span class="source-line-no">4174</span><span id="line-4174"> .filter(s -&gt; s.getNamespace().equals(namespace)).findFirst()</span>
<span class="source-line-no">4175</span><span id="line-4175"> .map(s -&gt; SpaceQuotaSnapshot.toSpaceQuotaSnapshot(s.getSnapshot())).orElse(null));</span>
<span class="source-line-no">4176</span><span id="line-4176"> }</span>
<span class="source-line-no">4177</span><span id="line-4177"></span>
<span class="source-line-no">4178</span><span id="line-4178"> @Override</span>
<span class="source-line-no">4179</span><span id="line-4179"> public CompletableFuture&lt;SpaceQuotaSnapshot&gt; getCurrentSpaceQuotaSnapshot(TableName tableName) {</span>
<span class="source-line-no">4180</span><span id="line-4180"> HBaseProtos.TableName protoTableName = ProtobufUtil.toProtoTableName(tableName);</span>
<span class="source-line-no">4181</span><span id="line-4181"> return getCurrentSpaceQuotaSnapshot(resp -&gt; resp.getTableSnapshotsList().stream()</span>
<span class="source-line-no">4182</span><span id="line-4182"> .filter(s -&gt; s.getTableName().equals(protoTableName)).findFirst()</span>
<span class="source-line-no">4183</span><span id="line-4183"> .map(s -&gt; SpaceQuotaSnapshot.toSpaceQuotaSnapshot(s.getSnapshot())).orElse(null));</span>
<span class="source-line-no">4184</span><span id="line-4184"> }</span>
<span class="source-line-no">4185</span><span id="line-4185"></span>
<span class="source-line-no">4186</span><span id="line-4186"> @Override</span>
<span class="source-line-no">4187</span><span id="line-4187"> public CompletableFuture&lt;Void&gt; grant(UserPermission userPermission,</span>
<span class="source-line-no">4188</span><span id="line-4188"> boolean mergeExistingPermissions) {</span>
<span class="source-line-no">4189</span><span id="line-4189"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4190</span><span id="line-4190"> .action((controller, stub) -&gt; this.&lt;GrantRequest, GrantResponse, Void&gt; call(controller, stub,</span>
<span class="source-line-no">4191</span><span id="line-4191"> ShadedAccessControlUtil.buildGrantRequest(userPermission, mergeExistingPermissions),</span>
<span class="source-line-no">4192</span><span id="line-4192"> (s, c, req, done) -&gt; s.grant(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4193</span><span id="line-4193"> .call();</span>
<span class="source-line-no">4194</span><span id="line-4194"> }</span>
<span class="source-line-no">4195</span><span id="line-4195"></span>
<span class="source-line-no">4196</span><span id="line-4196"> @Override</span>
<span class="source-line-no">4197</span><span id="line-4197"> public CompletableFuture&lt;Void&gt; revoke(UserPermission userPermission) {</span>
<span class="source-line-no">4198</span><span id="line-4198"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4199</span><span id="line-4199"> .action((controller, stub) -&gt; this.&lt;RevokeRequest, RevokeResponse, Void&gt; call(controller,</span>
<span class="source-line-no">4200</span><span id="line-4200"> stub, ShadedAccessControlUtil.buildRevokeRequest(userPermission),</span>
<span class="source-line-no">4201</span><span id="line-4201"> (s, c, req, done) -&gt; s.revoke(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4202</span><span id="line-4202"> .call();</span>
<span class="source-line-no">4203</span><span id="line-4203"> }</span>
<span class="source-line-no">4204</span><span id="line-4204"></span>
<span class="source-line-no">4205</span><span id="line-4205"> @Override</span>
<span class="source-line-no">4206</span><span id="line-4206"> public CompletableFuture&lt;List&lt;UserPermission&gt;&gt;</span>
<span class="source-line-no">4207</span><span id="line-4207"> getUserPermissions(GetUserPermissionsRequest getUserPermissionsRequest) {</span>
<span class="source-line-no">4208</span><span id="line-4208"> return this.&lt;List&lt;UserPermission&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4209</span><span id="line-4209"> .action((controller, stub) -&gt; this.&lt;AccessControlProtos.GetUserPermissionsRequest,</span>
<span class="source-line-no">4210</span><span id="line-4210"> GetUserPermissionsResponse, List&lt;UserPermission&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">4211</span><span id="line-4211"> ShadedAccessControlUtil.buildGetUserPermissionsRequest(getUserPermissionsRequest),</span>
<span class="source-line-no">4212</span><span id="line-4212"> (s, c, req, done) -&gt; s.getUserPermissions(c, req, done),</span>
<span class="source-line-no">4213</span><span id="line-4213"> resp -&gt; resp.getUserPermissionList().stream()</span>
<span class="source-line-no">4214</span><span id="line-4214"> .map(uPerm -&gt; ShadedAccessControlUtil.toUserPermission(uPerm))</span>
<span class="source-line-no">4215</span><span id="line-4215"> .collect(Collectors.toList())))</span>
<span class="source-line-no">4216</span><span id="line-4216"> .call();</span>
<span class="source-line-no">4217</span><span id="line-4217"> }</span>
<span class="source-line-no">4218</span><span id="line-4218"></span>
<span class="source-line-no">4219</span><span id="line-4219"> @Override</span>
<span class="source-line-no">4220</span><span id="line-4220"> public CompletableFuture&lt;List&lt;Boolean&gt;&gt; hasUserPermissions(String userName,</span>
<span class="source-line-no">4221</span><span id="line-4221"> List&lt;Permission&gt; permissions) {</span>
<span class="source-line-no">4222</span><span id="line-4222"> return this.&lt;List&lt;Boolean&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4223</span><span id="line-4223"> .action((controller, stub) -&gt; this.&lt;HasUserPermissionsRequest, HasUserPermissionsResponse,</span>
<span class="source-line-no">4224</span><span id="line-4224"> List&lt;Boolean&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">4225</span><span id="line-4225"> ShadedAccessControlUtil.buildHasUserPermissionsRequest(userName, permissions),</span>
<span class="source-line-no">4226</span><span id="line-4226"> (s, c, req, done) -&gt; s.hasUserPermissions(c, req, done),</span>
<span class="source-line-no">4227</span><span id="line-4227"> resp -&gt; resp.getHasUserPermissionList()))</span>
<span class="source-line-no">4228</span><span id="line-4228"> .call();</span>
<span class="source-line-no">4229</span><span id="line-4229"> }</span>
<span class="source-line-no">4230</span><span id="line-4230"></span>
<span class="source-line-no">4231</span><span id="line-4231"> @Override</span>
<span class="source-line-no">4232</span><span id="line-4232"> public CompletableFuture&lt;Boolean&gt; snapshotCleanupSwitch(final boolean on, final boolean sync) {</span>
<span class="source-line-no">4233</span><span id="line-4233"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">4234</span><span id="line-4234"> .action((controller, stub) -&gt; this.call(controller, stub,</span>
<span class="source-line-no">4235</span><span id="line-4235"> RequestConverter.buildSetSnapshotCleanupRequest(on, sync),</span>
<span class="source-line-no">4236</span><span id="line-4236"> MasterService.Interface::switchSnapshotCleanup,</span>
<span class="source-line-no">4237</span><span id="line-4237"> SetSnapshotCleanupResponse::getPrevSnapshotCleanup))</span>
<span class="source-line-no">4238</span><span id="line-4238"> .call();</span>
<span class="source-line-no">4239</span><span id="line-4239"> }</span>
<span class="source-line-no">4240</span><span id="line-4240"></span>
<span class="source-line-no">4241</span><span id="line-4241"> @Override</span>
<span class="source-line-no">4242</span><span id="line-4242"> public CompletableFuture&lt;Boolean&gt; isSnapshotCleanupEnabled() {</span>
<span class="source-line-no">4243</span><span id="line-4243"> return this.&lt;Boolean&gt; newMasterCaller()</span>
<span class="source-line-no">4244</span><span id="line-4244"> .action((controller, stub) -&gt; this.call(controller, stub,</span>
<span class="source-line-no">4245</span><span id="line-4245"> RequestConverter.buildIsSnapshotCleanupEnabledRequest(),</span>
<span class="source-line-no">4246</span><span id="line-4246"> MasterService.Interface::isSnapshotCleanupEnabled,</span>
<span class="source-line-no">4247</span><span id="line-4247"> IsSnapshotCleanupEnabledResponse::getEnabled))</span>
<span class="source-line-no">4248</span><span id="line-4248"> .call();</span>
<span class="source-line-no">4249</span><span id="line-4249"> }</span>
<span class="source-line-no">4250</span><span id="line-4250"></span>
<span class="source-line-no">4251</span><span id="line-4251"> @Override</span>
<span class="source-line-no">4252</span><span id="line-4252"> public CompletableFuture&lt;Void&gt; moveServersToRSGroup(Set&lt;Address&gt; servers, String groupName) {</span>
<span class="source-line-no">4253</span><span id="line-4253"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4254</span><span id="line-4254"> .action((controller, stub) -&gt; this.&lt;MoveServersRequest, MoveServersResponse, Void&gt; call(</span>
<span class="source-line-no">4255</span><span id="line-4255"> controller, stub, RequestConverter.buildMoveServersRequest(servers, groupName),</span>
<span class="source-line-no">4256</span><span id="line-4256"> (s, c, req, done) -&gt; s.moveServers(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4257</span><span id="line-4257"> .call();</span>
<span class="source-line-no">4258</span><span id="line-4258"> }</span>
<span class="source-line-no">4259</span><span id="line-4259"></span>
<span class="source-line-no">4260</span><span id="line-4260"> @Override</span>
<span class="source-line-no">4261</span><span id="line-4261"> public CompletableFuture&lt;Void&gt; addRSGroup(String groupName) {</span>
<span class="source-line-no">4262</span><span id="line-4262"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4263</span><span id="line-4263"> .action((controller, stub) -&gt; this.&lt;AddRSGroupRequest, AddRSGroupResponse, Void&gt; call(</span>
<span class="source-line-no">4264</span><span id="line-4264"> controller, stub, AddRSGroupRequest.newBuilder().setRSGroupName(groupName).build(),</span>
<span class="source-line-no">4265</span><span id="line-4265"> (s, c, req, done) -&gt; s.addRSGroup(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4266</span><span id="line-4266"> .call();</span>
<span class="source-line-no">4267</span><span id="line-4267"> }</span>
<span class="source-line-no">4268</span><span id="line-4268"></span>
<span class="source-line-no">4269</span><span id="line-4269"> @Override</span>
<span class="source-line-no">4270</span><span id="line-4270"> public CompletableFuture&lt;Void&gt; removeRSGroup(String groupName) {</span>
<span class="source-line-no">4271</span><span id="line-4271"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4272</span><span id="line-4272"> .action((controller, stub) -&gt; this.&lt;RemoveRSGroupRequest, RemoveRSGroupResponse, Void&gt; call(</span>
<span class="source-line-no">4273</span><span id="line-4273"> controller, stub, RemoveRSGroupRequest.newBuilder().setRSGroupName(groupName).build(),</span>
<span class="source-line-no">4274</span><span id="line-4274"> (s, c, req, done) -&gt; s.removeRSGroup(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4275</span><span id="line-4275"> .call();</span>
<span class="source-line-no">4276</span><span id="line-4276"> }</span>
<span class="source-line-no">4277</span><span id="line-4277"></span>
<span class="source-line-no">4278</span><span id="line-4278"> @Override</span>
<span class="source-line-no">4279</span><span id="line-4279"> public CompletableFuture&lt;BalanceResponse&gt; balanceRSGroup(String groupName,</span>
<span class="source-line-no">4280</span><span id="line-4280"> BalanceRequest request) {</span>
<span class="source-line-no">4281</span><span id="line-4281"> return this.&lt;BalanceResponse&gt; newMasterCaller()</span>
<span class="source-line-no">4282</span><span id="line-4282"> .action((controller, stub) -&gt; this.&lt;BalanceRSGroupRequest, BalanceRSGroupResponse,</span>
<span class="source-line-no">4283</span><span id="line-4283"> BalanceResponse&gt; call(controller, stub,</span>
<span class="source-line-no">4284</span><span id="line-4284"> ProtobufUtil.createBalanceRSGroupRequest(groupName, request),</span>
<span class="source-line-no">4285</span><span id="line-4285"> MasterService.Interface::balanceRSGroup, ProtobufUtil::toBalanceResponse))</span>
<span class="source-line-no">4286</span><span id="line-4286"> .call();</span>
<span class="source-line-no">4287</span><span id="line-4287"> }</span>
<span class="source-line-no">4288</span><span id="line-4288"></span>
<span class="source-line-no">4289</span><span id="line-4289"> @Override</span>
<span class="source-line-no">4290</span><span id="line-4290"> public CompletableFuture&lt;List&lt;RSGroupInfo&gt;&gt; listRSGroups() {</span>
<span class="source-line-no">4291</span><span id="line-4291"> return this.&lt;List&lt;RSGroupInfo&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4292</span><span id="line-4292"> .action((controller, stub) -&gt; this.&lt;ListRSGroupInfosRequest, ListRSGroupInfosResponse,</span>
<span class="source-line-no">4293</span><span id="line-4293"> List&lt;RSGroupInfo&gt;&gt; call(controller, stub, ListRSGroupInfosRequest.getDefaultInstance(),</span>
<span class="source-line-no">4294</span><span id="line-4294"> (s, c, req, done) -&gt; s.listRSGroupInfos(c, req, done), resp -&gt; resp.getRSGroupInfoList()</span>
<span class="source-line-no">4295</span><span id="line-4295"> .stream().map(r -&gt; ProtobufUtil.toGroupInfo(r)).collect(Collectors.toList())))</span>
<span class="source-line-no">4296</span><span id="line-4296"> .call();</span>
<span class="source-line-no">4297</span><span id="line-4297"> }</span>
<span class="source-line-no">4298</span><span id="line-4298"></span>
<span class="source-line-no">4299</span><span id="line-4299"> private CompletableFuture&lt;List&lt;LogEntry&gt;&gt; getSlowLogResponses(</span>
<span class="source-line-no">4300</span><span id="line-4300"> final Map&lt;String, Object&gt; filterParams, final Set&lt;ServerName&gt; serverNames, final int limit,</span>
<span class="source-line-no">4301</span><span id="line-4301"> final String logType) {</span>
<span class="source-line-no">4302</span><span id="line-4302"> if (CollectionUtils.isEmpty(serverNames)) {</span>
<span class="source-line-no">4303</span><span id="line-4303"> return CompletableFuture.completedFuture(Collections.emptyList());</span>
<span class="source-line-no">4304</span><span id="line-4304"> }</span>
<span class="source-line-no">4305</span><span id="line-4305"> return CompletableFuture.supplyAsync(() -&gt; serverNames</span>
<span class="source-line-no">4306</span><span id="line-4306"> .stream().map((ServerName serverName) -&gt; getSlowLogResponseFromServer(serverName,</span>
<span class="source-line-no">4307</span><span id="line-4307"> filterParams, limit, logType))</span>
<span class="source-line-no">4308</span><span id="line-4308"> .map(CompletableFuture::join).flatMap(List::stream).collect(Collectors.toList()));</span>
<span class="source-line-no">4309</span><span id="line-4309"> }</span>
<span class="source-line-no">4310</span><span id="line-4310"></span>
<span class="source-line-no">4311</span><span id="line-4311"> private CompletableFuture&lt;List&lt;LogEntry&gt;&gt; getSlowLogResponseFromServer(ServerName serverName,</span>
<span class="source-line-no">4312</span><span id="line-4312"> Map&lt;String, Object&gt; filterParams, int limit, String logType) {</span>
<span class="source-line-no">4313</span><span id="line-4313"> return this.&lt;List&lt;LogEntry&gt;&gt; newAdminCaller()</span>
<span class="source-line-no">4314</span><span id="line-4314"> .action((controller, stub) -&gt; this.adminCall(controller, stub,</span>
<span class="source-line-no">4315</span><span id="line-4315"> RequestConverter.buildSlowLogResponseRequest(filterParams, limit, logType),</span>
<span class="source-line-no">4316</span><span id="line-4316"> AdminService.Interface::getLogEntries, ProtobufUtil::toSlowLogPayloads))</span>
<span class="source-line-no">4317</span><span id="line-4317"> .serverName(serverName).call();</span>
<span class="source-line-no">4318</span><span id="line-4318"> }</span>
<span class="source-line-no">4319</span><span id="line-4319"></span>
<span class="source-line-no">4320</span><span id="line-4320"> @Override</span>
<span class="source-line-no">4321</span><span id="line-4321"> public CompletableFuture&lt;List&lt;Boolean&gt;&gt;</span>
<span class="source-line-no">4322</span><span id="line-4322"> clearSlowLogResponses(@Nullable Set&lt;ServerName&gt; serverNames) {</span>
<span class="source-line-no">4323</span><span id="line-4323"> if (CollectionUtils.isEmpty(serverNames)) {</span>
<span class="source-line-no">4324</span><span id="line-4324"> return CompletableFuture.completedFuture(Collections.emptyList());</span>
<span class="source-line-no">4325</span><span id="line-4325"> }</span>
<span class="source-line-no">4326</span><span id="line-4326"> List&lt;CompletableFuture&lt;Boolean&gt;&gt; clearSlowLogResponseList =</span>
<span class="source-line-no">4327</span><span id="line-4327"> serverNames.stream().map(this::clearSlowLogsResponses).collect(Collectors.toList());</span>
<span class="source-line-no">4328</span><span id="line-4328"> return convertToFutureOfList(clearSlowLogResponseList);</span>
<span class="source-line-no">4329</span><span id="line-4329"> }</span>
<span class="source-line-no">4330</span><span id="line-4330"></span>
<span class="source-line-no">4331</span><span id="line-4331"> private CompletableFuture&lt;Boolean&gt; clearSlowLogsResponses(final ServerName serverName) {</span>
<span class="source-line-no">4332</span><span id="line-4332"> return this.&lt;Boolean&gt; newAdminCaller()</span>
<span class="source-line-no">4333</span><span id="line-4333"> .action((controller, stub) -&gt; this.adminCall(controller, stub,</span>
<span class="source-line-no">4334</span><span id="line-4334"> RequestConverter.buildClearSlowLogResponseRequest(),</span>
<span class="source-line-no">4335</span><span id="line-4335"> AdminService.Interface::clearSlowLogsResponses, ProtobufUtil::toClearSlowLogPayload))</span>
<span class="source-line-no">4336</span><span id="line-4336"> .serverName(serverName).call();</span>
<span class="source-line-no">4337</span><span id="line-4337"> }</span>
<span class="source-line-no">4338</span><span id="line-4338"></span>
<span class="source-line-no">4339</span><span id="line-4339"> private static &lt;T&gt; CompletableFuture&lt;List&lt;T&gt;&gt;</span>
<span class="source-line-no">4340</span><span id="line-4340"> convertToFutureOfList(List&lt;CompletableFuture&lt;T&gt;&gt; futures) {</span>
<span class="source-line-no">4341</span><span id="line-4341"> CompletableFuture&lt;Void&gt; allDoneFuture =</span>
<span class="source-line-no">4342</span><span id="line-4342"> CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));</span>
<span class="source-line-no">4343</span><span id="line-4343"> return allDoneFuture</span>
<span class="source-line-no">4344</span><span id="line-4344"> .thenApply(v -&gt; futures.stream().map(CompletableFuture::join).collect(Collectors.toList()));</span>
<span class="source-line-no">4345</span><span id="line-4345"> }</span>
<span class="source-line-no">4346</span><span id="line-4346"></span>
<span class="source-line-no">4347</span><span id="line-4347"> @Override</span>
<span class="source-line-no">4348</span><span id="line-4348"> public CompletableFuture&lt;List&lt;TableName&gt;&gt; listTablesInRSGroup(String groupName) {</span>
<span class="source-line-no">4349</span><span id="line-4349"> return this.&lt;List&lt;TableName&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4350</span><span id="line-4350"> .action((controller, stub) -&gt; this.&lt;ListTablesInRSGroupRequest, ListTablesInRSGroupResponse,</span>
<span class="source-line-no">4351</span><span id="line-4351"> List&lt;TableName&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">4352</span><span id="line-4352"> ListTablesInRSGroupRequest.newBuilder().setGroupName(groupName).build(),</span>
<span class="source-line-no">4353</span><span id="line-4353"> (s, c, req, done) -&gt; s.listTablesInRSGroup(c, req, done), resp -&gt; resp.getTableNameList()</span>
<span class="source-line-no">4354</span><span id="line-4354"> .stream().map(ProtobufUtil::toTableName).collect(Collectors.toList())))</span>
<span class="source-line-no">4355</span><span id="line-4355"> .call();</span>
<span class="source-line-no">4356</span><span id="line-4356"> }</span>
<span class="source-line-no">4357</span><span id="line-4357"></span>
<span class="source-line-no">4358</span><span id="line-4358"> @Override</span>
<span class="source-line-no">4359</span><span id="line-4359"> public CompletableFuture&lt;Pair&lt;List&lt;String&gt;, List&lt;TableName&gt;&gt;&gt;</span>
<span class="source-line-no">4360</span><span id="line-4360"> getConfiguredNamespacesAndTablesInRSGroup(String groupName) {</span>
<span class="source-line-no">4361</span><span id="line-4361"> return this.&lt;Pair&lt;List&lt;String&gt;, List&lt;TableName&gt;&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4362</span><span id="line-4362"> .action((controller, stub) -&gt; this.&lt;GetConfiguredNamespacesAndTablesInRSGroupRequest,</span>
<span class="source-line-no">4363</span><span id="line-4363"> GetConfiguredNamespacesAndTablesInRSGroupResponse,</span>
<span class="source-line-no">4364</span><span id="line-4364"> Pair&lt;List&lt;String&gt;, List&lt;TableName&gt;&gt;&gt; call(controller, stub,</span>
<span class="source-line-no">4365</span><span id="line-4365"> GetConfiguredNamespacesAndTablesInRSGroupRequest.newBuilder().setGroupName(groupName)</span>
<span class="source-line-no">4366</span><span id="line-4366"> .build(),</span>
<span class="source-line-no">4367</span><span id="line-4367"> (s, c, req, done) -&gt; s.getConfiguredNamespacesAndTablesInRSGroup(c, req, done),</span>
<span class="source-line-no">4368</span><span id="line-4368"> resp -&gt; Pair.newPair(resp.getNamespaceList(), resp.getTableNameList().stream()</span>
<span class="source-line-no">4369</span><span id="line-4369"> .map(ProtobufUtil::toTableName).collect(Collectors.toList()))))</span>
<span class="source-line-no">4370</span><span id="line-4370"> .call();</span>
<span class="source-line-no">4371</span><span id="line-4371"> }</span>
<span class="source-line-no">4372</span><span id="line-4372"></span>
<span class="source-line-no">4373</span><span id="line-4373"> @Override</span>
<span class="source-line-no">4374</span><span id="line-4374"> public CompletableFuture&lt;RSGroupInfo&gt; getRSGroup(Address hostPort) {</span>
<span class="source-line-no">4375</span><span id="line-4375"> return this.&lt;RSGroupInfo&gt; newMasterCaller()</span>
<span class="source-line-no">4376</span><span id="line-4376"> .action((controller, stub) -&gt; this.&lt;GetRSGroupInfoOfServerRequest,</span>
<span class="source-line-no">4377</span><span id="line-4377"> GetRSGroupInfoOfServerResponse, RSGroupInfo&gt; call(controller, stub,</span>
<span class="source-line-no">4378</span><span id="line-4378"> GetRSGroupInfoOfServerRequest.newBuilder()</span>
<span class="source-line-no">4379</span><span id="line-4379"> .setServer(HBaseProtos.ServerName.newBuilder().setHostName(hostPort.getHostname())</span>
<span class="source-line-no">4380</span><span id="line-4380"> .setPort(hostPort.getPort()).build())</span>
<span class="source-line-no">4381</span><span id="line-4381"> .build(),</span>
<span class="source-line-no">4382</span><span id="line-4382"> (s, c, req, done) -&gt; s.getRSGroupInfoOfServer(c, req, done),</span>
<span class="source-line-no">4383</span><span id="line-4383"> resp -&gt; resp.hasRSGroupInfo() ? ProtobufUtil.toGroupInfo(resp.getRSGroupInfo()) : null))</span>
<span class="source-line-no">4384</span><span id="line-4384"> .call();</span>
<span class="source-line-no">4385</span><span id="line-4385"> }</span>
<span class="source-line-no">4386</span><span id="line-4386"></span>
<span class="source-line-no">4387</span><span id="line-4387"> @Override</span>
<span class="source-line-no">4388</span><span id="line-4388"> public CompletableFuture&lt;Void&gt; removeServersFromRSGroup(Set&lt;Address&gt; servers) {</span>
<span class="source-line-no">4389</span><span id="line-4389"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4390</span><span id="line-4390"> .action((controller, stub) -&gt; this.&lt;RemoveServersRequest, RemoveServersResponse, Void&gt; call(</span>
<span class="source-line-no">4391</span><span id="line-4391"> controller, stub, RequestConverter.buildRemoveServersRequest(servers),</span>
<span class="source-line-no">4392</span><span id="line-4392"> (s, c, req, done) -&gt; s.removeServers(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4393</span><span id="line-4393"> .call();</span>
<span class="source-line-no">4394</span><span id="line-4394"> }</span>
<span class="source-line-no">4395</span><span id="line-4395"></span>
<span class="source-line-no">4396</span><span id="line-4396"> @Override</span>
<span class="source-line-no">4397</span><span id="line-4397"> public CompletableFuture&lt;Void&gt; setRSGroup(Set&lt;TableName&gt; tables, String groupName) {</span>
<span class="source-line-no">4398</span><span id="line-4398"> CompletableFuture&lt;Void&gt; future = new CompletableFuture&lt;&gt;();</span>
<span class="source-line-no">4399</span><span id="line-4399"> for (TableName tableName : tables) {</span>
<span class="source-line-no">4400</span><span id="line-4400"> addListener(tableExists(tableName), (exist, err) -&gt; {</span>
<span class="source-line-no">4401</span><span id="line-4401"> if (err != null) {</span>
<span class="source-line-no">4402</span><span id="line-4402"> future.completeExceptionally(err);</span>
<span class="source-line-no">4403</span><span id="line-4403"> return;</span>
<span class="source-line-no">4404</span><span id="line-4404"> }</span>
<span class="source-line-no">4405</span><span id="line-4405"> if (!exist) {</span>
<span class="source-line-no">4406</span><span id="line-4406"> future.completeExceptionally(new TableNotFoundException(tableName));</span>
<span class="source-line-no">4407</span><span id="line-4407"> return;</span>
<span class="source-line-no">4408</span><span id="line-4408"> }</span>
<span class="source-line-no">4409</span><span id="line-4409"> });</span>
<span class="source-line-no">4410</span><span id="line-4410"> }</span>
<span class="source-line-no">4411</span><span id="line-4411"> addListener(listTableDescriptors(new ArrayList&lt;&gt;(tables)), (tableDescriptions, err) -&gt; {</span>
<span class="source-line-no">4412</span><span id="line-4412"> if (err != null) {</span>
<span class="source-line-no">4413</span><span id="line-4413"> future.completeExceptionally(err);</span>
<span class="source-line-no">4414</span><span id="line-4414"> return;</span>
<span class="source-line-no">4415</span><span id="line-4415"> }</span>
<span class="source-line-no">4416</span><span id="line-4416"> if (tableDescriptions == null || tableDescriptions.isEmpty()) {</span>
<span class="source-line-no">4417</span><span id="line-4417"> future.complete(null);</span>
<span class="source-line-no">4418</span><span id="line-4418"> return;</span>
<span class="source-line-no">4419</span><span id="line-4419"> }</span>
<span class="source-line-no">4420</span><span id="line-4420"> List&lt;TableDescriptor&gt; newTableDescriptors = new ArrayList&lt;&gt;();</span>
<span class="source-line-no">4421</span><span id="line-4421"> for (TableDescriptor td : tableDescriptions) {</span>
<span class="source-line-no">4422</span><span id="line-4422"> newTableDescriptors</span>
<span class="source-line-no">4423</span><span id="line-4423"> .add(TableDescriptorBuilder.newBuilder(td).setRegionServerGroup(groupName).build());</span>
<span class="source-line-no">4424</span><span id="line-4424"> }</span>
<span class="source-line-no">4425</span><span id="line-4425"> addListener(</span>
<span class="source-line-no">4426</span><span id="line-4426"> CompletableFuture.allOf(</span>
<span class="source-line-no">4427</span><span id="line-4427"> newTableDescriptors.stream().map(this::modifyTable).toArray(CompletableFuture[]::new)),</span>
<span class="source-line-no">4428</span><span id="line-4428"> (v, e) -&gt; {</span>
<span class="source-line-no">4429</span><span id="line-4429"> if (e != null) {</span>
<span class="source-line-no">4430</span><span id="line-4430"> future.completeExceptionally(e);</span>
<span class="source-line-no">4431</span><span id="line-4431"> } else {</span>
<span class="source-line-no">4432</span><span id="line-4432"> future.complete(v);</span>
<span class="source-line-no">4433</span><span id="line-4433"> }</span>
<span class="source-line-no">4434</span><span id="line-4434"> });</span>
<span class="source-line-no">4435</span><span id="line-4435"> });</span>
<span class="source-line-no">4436</span><span id="line-4436"> return future;</span>
<span class="source-line-no">4437</span><span id="line-4437"> }</span>
<span class="source-line-no">4438</span><span id="line-4438"></span>
<span class="source-line-no">4439</span><span id="line-4439"> @Override</span>
<span class="source-line-no">4440</span><span id="line-4440"> public CompletableFuture&lt;RSGroupInfo&gt; getRSGroup(TableName table) {</span>
<span class="source-line-no">4441</span><span id="line-4441"> return this.&lt;RSGroupInfo&gt; newMasterCaller()</span>
<span class="source-line-no">4442</span><span id="line-4442"> .action((controller, stub) -&gt; this.&lt;GetRSGroupInfoOfTableRequest,</span>
<span class="source-line-no">4443</span><span id="line-4443"> GetRSGroupInfoOfTableResponse, RSGroupInfo&gt; call(controller, stub,</span>
<span class="source-line-no">4444</span><span id="line-4444"> GetRSGroupInfoOfTableRequest.newBuilder()</span>
<span class="source-line-no">4445</span><span id="line-4445"> .setTableName(ProtobufUtil.toProtoTableName(table)).build(),</span>
<span class="source-line-no">4446</span><span id="line-4446"> (s, c, req, done) -&gt; s.getRSGroupInfoOfTable(c, req, done),</span>
<span class="source-line-no">4447</span><span id="line-4447"> resp -&gt; resp.hasRSGroupInfo() ? ProtobufUtil.toGroupInfo(resp.getRSGroupInfo()) : null))</span>
<span class="source-line-no">4448</span><span id="line-4448"> .call();</span>
<span class="source-line-no">4449</span><span id="line-4449"> }</span>
<span class="source-line-no">4450</span><span id="line-4450"></span>
<span class="source-line-no">4451</span><span id="line-4451"> @Override</span>
<span class="source-line-no">4452</span><span id="line-4452"> public CompletableFuture&lt;RSGroupInfo&gt; getRSGroup(String groupName) {</span>
<span class="source-line-no">4453</span><span id="line-4453"> return this.&lt;RSGroupInfo&gt; newMasterCaller()</span>
<span class="source-line-no">4454</span><span id="line-4454"> .action((controller, stub) -&gt; this.&lt;GetRSGroupInfoRequest, GetRSGroupInfoResponse,</span>
<span class="source-line-no">4455</span><span id="line-4455"> RSGroupInfo&gt; call(controller, stub,</span>
<span class="source-line-no">4456</span><span id="line-4456"> GetRSGroupInfoRequest.newBuilder().setRSGroupName(groupName).build(),</span>
<span class="source-line-no">4457</span><span id="line-4457"> (s, c, req, done) -&gt; s.getRSGroupInfo(c, req, done),</span>
<span class="source-line-no">4458</span><span id="line-4458"> resp -&gt; resp.hasRSGroupInfo() ? ProtobufUtil.toGroupInfo(resp.getRSGroupInfo()) : null))</span>
<span class="source-line-no">4459</span><span id="line-4459"> .call();</span>
<span class="source-line-no">4460</span><span id="line-4460"> }</span>
<span class="source-line-no">4461</span><span id="line-4461"></span>
<span class="source-line-no">4462</span><span id="line-4462"> @Override</span>
<span class="source-line-no">4463</span><span id="line-4463"> public CompletableFuture&lt;Void&gt; renameRSGroup(String oldName, String newName) {</span>
<span class="source-line-no">4464</span><span id="line-4464"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4465</span><span id="line-4465"> .action((controller, stub) -&gt; this.&lt;RenameRSGroupRequest, RenameRSGroupResponse, Void&gt; call(</span>
<span class="source-line-no">4466</span><span id="line-4466"> controller, stub, RenameRSGroupRequest.newBuilder().setOldRsgroupName(oldName)</span>
<span class="source-line-no">4467</span><span id="line-4467"> .setNewRsgroupName(newName).build(),</span>
<span class="source-line-no">4468</span><span id="line-4468"> (s, c, req, done) -&gt; s.renameRSGroup(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4469</span><span id="line-4469"> .call();</span>
<span class="source-line-no">4470</span><span id="line-4470"> }</span>
<span class="source-line-no">4471</span><span id="line-4471"></span>
<span class="source-line-no">4472</span><span id="line-4472"> @Override</span>
<span class="source-line-no">4473</span><span id="line-4473"> public CompletableFuture&lt;Void&gt; updateRSGroupConfig(String groupName,</span>
<span class="source-line-no">4474</span><span id="line-4474"> Map&lt;String, String&gt; configuration) {</span>
<span class="source-line-no">4475</span><span id="line-4475"> UpdateRSGroupConfigRequest.Builder request =</span>
<span class="source-line-no">4476</span><span id="line-4476"> UpdateRSGroupConfigRequest.newBuilder().setGroupName(groupName);</span>
<span class="source-line-no">4477</span><span id="line-4477"> if (configuration != null) {</span>
<span class="source-line-no">4478</span><span id="line-4478"> configuration.entrySet().forEach(e -&gt; request.addConfiguration(</span>
<span class="source-line-no">4479</span><span id="line-4479"> NameStringPair.newBuilder().setName(e.getKey()).setValue(e.getValue()).build()));</span>
<span class="source-line-no">4480</span><span id="line-4480"> }</span>
<span class="source-line-no">4481</span><span id="line-4481"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4482</span><span id="line-4482"> .action((controller, stub) -&gt; this.&lt;UpdateRSGroupConfigRequest, UpdateRSGroupConfigResponse,</span>
<span class="source-line-no">4483</span><span id="line-4483"> Void&gt; call(controller, stub, request.build(),</span>
<span class="source-line-no">4484</span><span id="line-4484"> (s, c, req, done) -&gt; s.updateRSGroupConfig(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4485</span><span id="line-4485"> .call();</span>
<span class="source-line-no">4486</span><span id="line-4486"> }</span>
<span class="source-line-no">4487</span><span id="line-4487"></span>
<span class="source-line-no">4488</span><span id="line-4488"> private CompletableFuture&lt;List&lt;LogEntry&gt;&gt; getBalancerDecisions(final int limit) {</span>
<span class="source-line-no">4489</span><span id="line-4489"> return this.&lt;List&lt;LogEntry&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4490</span><span id="line-4490"> .action((controller, stub) -&gt; this.call(controller, stub,</span>
<span class="source-line-no">4491</span><span id="line-4491"> ProtobufUtil.toBalancerDecisionRequest(limit), MasterService.Interface::getLogEntries,</span>
<span class="source-line-no">4492</span><span id="line-4492"> ProtobufUtil::toBalancerDecisionResponse))</span>
<span class="source-line-no">4493</span><span id="line-4493"> .call();</span>
<span class="source-line-no">4494</span><span id="line-4494"> }</span>
<span class="source-line-no">4495</span><span id="line-4495"></span>
<span class="source-line-no">4496</span><span id="line-4496"> private CompletableFuture&lt;List&lt;LogEntry&gt;&gt; getBalancerRejections(final int limit) {</span>
<span class="source-line-no">4497</span><span id="line-4497"> return this.&lt;List&lt;LogEntry&gt;&gt; newMasterCaller()</span>
<span class="source-line-no">4498</span><span id="line-4498"> .action((controller, stub) -&gt; this.call(controller, stub,</span>
<span class="source-line-no">4499</span><span id="line-4499"> ProtobufUtil.toBalancerRejectionRequest(limit), MasterService.Interface::getLogEntries,</span>
<span class="source-line-no">4500</span><span id="line-4500"> ProtobufUtil::toBalancerRejectionResponse))</span>
<span class="source-line-no">4501</span><span id="line-4501"> .call();</span>
<span class="source-line-no">4502</span><span id="line-4502"> }</span>
<span class="source-line-no">4503</span><span id="line-4503"></span>
<span class="source-line-no">4504</span><span id="line-4504"> @Override</span>
<span class="source-line-no">4505</span><span id="line-4505"> public CompletableFuture&lt;List&lt;LogEntry&gt;&gt; getLogEntries(Set&lt;ServerName&gt; serverNames,</span>
<span class="source-line-no">4506</span><span id="line-4506"> String logType, ServerType serverType, int limit, Map&lt;String, Object&gt; filterParams) {</span>
<span class="source-line-no">4507</span><span id="line-4507"> if (logType == null || serverType == null) {</span>
<span class="source-line-no">4508</span><span id="line-4508"> throw new IllegalArgumentException("logType and/or serverType cannot be empty");</span>
<span class="source-line-no">4509</span><span id="line-4509"> }</span>
<span class="source-line-no">4510</span><span id="line-4510"> switch (logType) {</span>
<span class="source-line-no">4511</span><span id="line-4511"> case "SLOW_LOG":</span>
<span class="source-line-no">4512</span><span id="line-4512"> case "LARGE_LOG":</span>
<span class="source-line-no">4513</span><span id="line-4513"> if (ServerType.MASTER.equals(serverType)) {</span>
<span class="source-line-no">4514</span><span id="line-4514"> throw new IllegalArgumentException("Slow/Large logs are not maintained by HMaster");</span>
<span class="source-line-no">4515</span><span id="line-4515"> }</span>
<span class="source-line-no">4516</span><span id="line-4516"> return getSlowLogResponses(filterParams, serverNames, limit, logType);</span>
<span class="source-line-no">4517</span><span id="line-4517"> case "BALANCER_DECISION":</span>
<span class="source-line-no">4518</span><span id="line-4518"> if (ServerType.REGION_SERVER.equals(serverType)) {</span>
<span class="source-line-no">4519</span><span id="line-4519"> throw new IllegalArgumentException(</span>
<span class="source-line-no">4520</span><span id="line-4520"> "Balancer Decision logs are not maintained by HRegionServer");</span>
<span class="source-line-no">4521</span><span id="line-4521"> }</span>
<span class="source-line-no">4522</span><span id="line-4522"> return getBalancerDecisions(limit);</span>
<span class="source-line-no">4523</span><span id="line-4523"> case "BALANCER_REJECTION":</span>
<span class="source-line-no">4524</span><span id="line-4524"> if (ServerType.REGION_SERVER.equals(serverType)) {</span>
<span class="source-line-no">4525</span><span id="line-4525"> throw new IllegalArgumentException(</span>
<span class="source-line-no">4526</span><span id="line-4526"> "Balancer Rejection logs are not maintained by HRegionServer");</span>
<span class="source-line-no">4527</span><span id="line-4527"> }</span>
<span class="source-line-no">4528</span><span id="line-4528"> return getBalancerRejections(limit);</span>
<span class="source-line-no">4529</span><span id="line-4529"> default:</span>
<span class="source-line-no">4530</span><span id="line-4530"> return CompletableFuture.completedFuture(Collections.emptyList());</span>
<span class="source-line-no">4531</span><span id="line-4531"> }</span>
<span class="source-line-no">4532</span><span id="line-4532"> }</span>
<span class="source-line-no">4533</span><span id="line-4533"></span>
<span class="source-line-no">4534</span><span id="line-4534"> @Override</span>
<span class="source-line-no">4535</span><span id="line-4535"> public CompletableFuture&lt;Void&gt; flushMasterStore() {</span>
<span class="source-line-no">4536</span><span id="line-4536"> FlushMasterStoreRequest.Builder request = FlushMasterStoreRequest.newBuilder();</span>
<span class="source-line-no">4537</span><span id="line-4537"> return this.&lt;Void&gt; newMasterCaller()</span>
<span class="source-line-no">4538</span><span id="line-4538"> .action((controller, stub) -&gt; this.&lt;FlushMasterStoreRequest, FlushMasterStoreResponse,</span>
<span class="source-line-no">4539</span><span id="line-4539"> Void&gt; call(controller, stub, request.build(),</span>
<span class="source-line-no">4540</span><span id="line-4540"> (s, c, req, done) -&gt; s.flushMasterStore(c, req, done), resp -&gt; null))</span>
<span class="source-line-no">4541</span><span id="line-4541"> .call();</span>
<span class="source-line-no">4542</span><span id="line-4542"> }</span>
<span class="source-line-no">4543</span><span id="line-4543"></span>
<span class="source-line-no">4544</span><span id="line-4544"> @Override</span>
<span class="source-line-no">4545</span><span id="line-4545"> public CompletableFuture&lt;List&lt;String&gt;&gt; getCachedFilesList(ServerName serverName) {</span>
<span class="source-line-no">4546</span><span id="line-4546"> GetCachedFilesListRequest.Builder request = GetCachedFilesListRequest.newBuilder();</span>
<span class="source-line-no">4547</span><span id="line-4547"> return this.&lt;List&lt;String&gt;&gt; newAdminCaller()</span>
<span class="source-line-no">4548</span><span id="line-4548"> .action((controller, stub) -&gt; this.&lt;GetCachedFilesListRequest, GetCachedFilesListResponse,</span>
<span class="source-line-no">4549</span><span id="line-4549"> List&lt;String&gt;&gt; adminCall(controller, stub, request.build(),</span>
<span class="source-line-no">4550</span><span id="line-4550"> (s, c, req, done) -&gt; s.getCachedFilesList(c, req, done),</span>
<span class="source-line-no">4551</span><span id="line-4551"> resp -&gt; resp.getCachedFilesList()))</span>
<span class="source-line-no">4552</span><span id="line-4552"> .serverName(serverName).call();</span>
<span class="source-line-no">4553</span><span id="line-4553"> }</span>
<span class="source-line-no">4554</span><span id="line-4554">}</span>
</pre>
</div>
</main>
</body>
</html>