001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.client;
019
020import java.io.IOException;
021import java.util.concurrent.CompletableFuture;
022import org.apache.hadoop.hbase.CellScanner;
023import org.apache.hadoop.hbase.ServerName;
024import org.apache.hadoop.hbase.ipc.HBaseRpcController;
025import org.apache.yetus.audience.InterfaceAudience;
026
027import org.apache.hbase.thirdparty.com.google.protobuf.RpcCallback;
028import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;
029
030import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
031import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest;
032import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesResponse;
033import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest;
034import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheResponse;
035import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest;
036import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse;
037import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest;
038import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse;
039import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactionSwitchRequest;
040import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactionSwitchResponse;
041import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest;
042import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse;
043import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest;
044import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionResponse;
045import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
046import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
047import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
048import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse;
049import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionLoadRequest;
050import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionLoadResponse;
051import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoRequest;
052import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoResponse;
053import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileRequest;
054import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileResponse;
055import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest;
056import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse;
057import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryRequest;
058import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;
059import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterRequest;
060import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterResponse;
061import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest;
062import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerResponse;
063import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationRequest;
064import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationResponse;
065import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest;
066import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesResponse;
067import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionRequest;
068import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionResponse;
069import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsRequest;
070import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsResponse;
071
072/**
073 * A simple wrapper of the {@link AdminService} for a region server, which returns a
074 * {@link CompletableFuture}. This is easier to use, as if you use the raw protobuf interface, you
075 * need to get the result from the {@link RpcCallback}, and if there is an exception, you need to
076 * get it from the {@link RpcController} passed in.
077 * <p/>
078 * Notice that there is no retry, and this is intentional. We have different retry for different
079 * usage for now, if later we want to unify them, we can move the retry logic into this class.
080 */
081@InterfaceAudience.Private
082public class AsyncRegionServerAdmin {
083
084  private final ServerName server;
085
086  private final AsyncConnectionImpl conn;
087
088  AsyncRegionServerAdmin(ServerName server, AsyncConnectionImpl conn) {
089    this.server = server;
090    this.conn = conn;
091  }
092
093  @FunctionalInterface
094  private interface RpcCall<RESP> {
095    void call(AdminService.Interface stub, HBaseRpcController controller, RpcCallback<RESP> done);
096  }
097
098  private <RESP> CompletableFuture<RESP> call(RpcCall<RESP> rpcCall, CellScanner cellScanner) {
099    CompletableFuture<RESP> future = new CompletableFuture<>();
100    HBaseRpcController controller = conn.rpcControllerFactory.newController(null, cellScanner);
101    try {
102      rpcCall.call(conn.getAdminStub(server), controller, new RpcCallback<RESP>() {
103
104        @Override
105        public void run(RESP resp) {
106          if (controller.failed()) {
107            future.completeExceptionally(controller.getFailed());
108          } else {
109            future.complete(resp);
110          }
111        }
112      });
113    } catch (IOException e) {
114      future.completeExceptionally(e);
115    }
116    return future;
117  }
118
119  private <RESP> CompletableFuture<RESP> call(RpcCall<RESP> rpcCall) {
120    return call(rpcCall, null);
121  }
122
123  public CompletableFuture<GetRegionInfoResponse> getRegionInfo(GetRegionInfoRequest request) {
124    return call((stub, controller, done) -> stub.getRegionInfo(controller, request, done));
125  }
126
127  public CompletableFuture<GetStoreFileResponse> getStoreFile(GetStoreFileRequest request) {
128    return call((stub, controller, done) -> stub.getStoreFile(controller, request, done));
129  }
130
131  public CompletableFuture<GetOnlineRegionResponse>
132    getOnlineRegion(GetOnlineRegionRequest request) {
133    return call((stub, controller, done) -> stub.getOnlineRegion(controller, request, done));
134  }
135
136  public CompletableFuture<OpenRegionResponse> openRegion(OpenRegionRequest request) {
137    return call((stub, controller, done) -> stub.openRegion(controller, request, done));
138  }
139
140  public CompletableFuture<WarmupRegionResponse> warmupRegion(WarmupRegionRequest request) {
141    return call((stub, controller, done) -> stub.warmupRegion(controller, request, done));
142  }
143
144  public CompletableFuture<CloseRegionResponse> closeRegion(CloseRegionRequest request) {
145    return call((stub, controller, done) -> stub.closeRegion(controller, request, done));
146  }
147
148  public CompletableFuture<FlushRegionResponse> flushRegion(FlushRegionRequest request) {
149    return call((stub, controller, done) -> stub.flushRegion(controller, request, done));
150  }
151
152  public CompletableFuture<CompactionSwitchResponse>
153    compactionSwitch(CompactionSwitchRequest request) {
154    return call((stub, controller, done) -> stub.compactionSwitch(controller, request, done));
155  }
156
157  public CompletableFuture<CompactRegionResponse> compactRegion(CompactRegionRequest request) {
158    return call((stub, controller, done) -> stub.compactRegion(controller, request, done));
159  }
160
161  public CompletableFuture<ReplicateWALEntryResponse>
162    replicateWALEntry(ReplicateWALEntryRequest request, CellScanner cellScanner, int timeout) {
163    return call((stub, controller, done) -> {
164      controller.setCallTimeout(timeout);
165      stub.replicateWALEntry(controller, request, done);
166    }, cellScanner);
167  }
168
169  public CompletableFuture<ReplicateWALEntryResponse> replay(ReplicateWALEntryRequest request,
170    CellScanner cellScanner) {
171    return call((stub, controller, done) -> stub.replay(controller, request, done), cellScanner);
172  }
173
174  public CompletableFuture<RollWALWriterResponse> rollWALWriter(RollWALWriterRequest request) {
175    return call((stub, controller, done) -> stub.rollWALWriter(controller, request, done));
176  }
177
178  public CompletableFuture<GetServerInfoResponse> getServerInfo(GetServerInfoRequest request) {
179    return call((stub, controller, done) -> stub.getServerInfo(controller, request, done));
180  }
181
182  public CompletableFuture<StopServerResponse> stopServer(StopServerRequest request) {
183    return call((stub, controller, done) -> stub.stopServer(controller, request, done));
184  }
185
186  public CompletableFuture<UpdateFavoredNodesResponse>
187    updateFavoredNodes(UpdateFavoredNodesRequest request) {
188    return call((stub, controller, done) -> stub.updateFavoredNodes(controller, request, done));
189  }
190
191  public CompletableFuture<UpdateConfigurationResponse>
192    updateConfiguration(UpdateConfigurationRequest request) {
193    return call((stub, controller, done) -> stub.updateConfiguration(controller, request, done));
194  }
195
196  public CompletableFuture<GetRegionLoadResponse> getRegionLoad(GetRegionLoadRequest request) {
197    return call((stub, controller, done) -> stub.getRegionLoad(controller, request, done));
198  }
199
200  public CompletableFuture<ClearCompactionQueuesResponse>
201    clearCompactionQueues(ClearCompactionQueuesRequest request) {
202    return call((stub, controller, done) -> stub.clearCompactionQueues(controller, request, done));
203  }
204
205  public CompletableFuture<ClearRegionBlockCacheResponse>
206    clearRegionBlockCache(ClearRegionBlockCacheRequest request) {
207    return call((stub, controller, done) -> stub.clearRegionBlockCache(controller, request, done));
208  }
209
210  public CompletableFuture<GetSpaceQuotaSnapshotsResponse>
211    getSpaceQuotaSnapshots(GetSpaceQuotaSnapshotsRequest request) {
212    return call((stub, controller, done) -> stub.getSpaceQuotaSnapshots(controller, request, done));
213  }
214
215  public CompletableFuture<ExecuteProceduresResponse>
216    executeProcedures(ExecuteProceduresRequest request) {
217    return call((stub, controller, done) -> stub.executeProcedures(controller, request, done));
218  }
219}