Skip to content

Commit bf64176

Browse files
committed
HIVE-29403: Move the truncate table out of HMSHandler
1 parent 6484ad3 commit bf64176

File tree

12 files changed

+463
-315
lines changed

12 files changed

+463
-315
lines changed

standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/utils/JavaUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,18 @@ public static <T> void setField(T req, String methodName, Class[] argsCls, Objec
128128
}
129129
}
130130

131+
public static <T> T getField(Object payload, String methodName) {
132+
try {
133+
Method method = payload.getClass().getDeclaredMethod(methodName);
134+
method.setAccessible(true);
135+
return (T) method.invoke(payload);
136+
} catch (Exception e) {
137+
LOG.error("Unable to invoke the method: {} of the instance: {}, message: {}",
138+
methodName, payload, e.getMessage());
139+
throw new RuntimeException(e);
140+
}
141+
}
142+
131143
/**
132144
* Utility method for ACID to normalize logging info. Matches
133145
* org.apache.hadoop.hive.metastore.api.LockRequest#toString

standalone-metastore/metastore-server/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<name>Hive Metastore Server</name>
2424
<properties>
2525
<standalone.metastore.path.to.root>..</standalone.metastore.path.to.root>
26+
<reflections.version>0.10.2</reflections.version>
2627
</properties>
2728
<dependencies>
2829
<dependency>
@@ -70,6 +71,17 @@
7071
</exclusion>
7172
</exclusions>
7273
</dependency>
74+
<dependency>
75+
<groupId>org.reflections</groupId>
76+
<artifactId>reflections</artifactId>
77+
<version>${reflections.version}</version>
78+
<exclusions>
79+
<exclusion>
80+
<groupId>com.google.code.findbugs</groupId>
81+
<artifactId>annotations</artifactId>
82+
</exclusion>
83+
</exclusions>
84+
</dependency>
7385
<dependency>
7486
<groupId>com.fasterxml.jackson.core</groupId>
7587
<artifactId>jackson-databind</artifactId>

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java

Lines changed: 20 additions & 225 deletions
Large diffs are not rendered by default.

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@
6868
import java.util.LinkedList;
6969
import java.util.Optional;
7070

71-
import static org.apache.hadoop.hive.metastore.HMSHandler.addTruncateBaseFile;
7271
import static org.apache.hadoop.hive.metastore.HiveMetaHook.ALTERLOCATION;
7372
import static org.apache.hadoop.hive.metastore.HiveMetaHook.ALTER_TABLE_OPERATION_TYPE;
7473
import static org.apache.hadoop.hive.metastore.HiveMetaStoreClient.RENAME_PARTITION_MAKE_COPY;
74+
import static org.apache.hadoop.hive.metastore.handler.TruncateTableHandler.addTruncateBaseFile;
7575
import static org.apache.hadoop.hive.metastore.utils.MetaStoreServerUtils.findStaleColumns;
7676
import static org.apache.hadoop.hive.metastore.utils.MetaStoreServerUtils.isDbReplicationTarget;
7777
import static org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.getDefaultCatalog;

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/handler/AbstractOperationHandler.java renamed to standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/handler/AbstractRequestHandler.java

Lines changed: 72 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import com.google.common.util.concurrent.MoreExecutors;
2424

2525
import java.io.IOException;
26+
import java.lang.reflect.Modifier;
2627
import java.util.Map;
28+
import java.util.Set;
2729
import java.util.UUID;
2830
import java.util.concurrent.CancellationException;
2931
import java.util.concurrent.ConcurrentHashMap;
@@ -35,29 +37,30 @@
3537
import java.util.concurrent.TimeUnit;
3638
import java.util.concurrent.TimeoutException;
3739
import java.util.concurrent.atomic.AtomicBoolean;
40+
import java.util.concurrent.atomic.AtomicLong;
3841

42+
import org.apache.commons.lang3.StringUtils;
3943
import org.apache.hadoop.hive.metastore.IHMSHandler;
40-
import org.apache.hadoop.hive.metastore.api.AddPartitionsRequest;
4144
import org.apache.hadoop.hive.metastore.api.AsyncOperationResp;
42-
import org.apache.hadoop.hive.metastore.api.DropDatabaseRequest;
43-
import org.apache.hadoop.hive.metastore.api.DropPartitionsRequest;
44-
import org.apache.hadoop.hive.metastore.api.DropTableRequest;
4545
import org.apache.hadoop.hive.metastore.api.MetaException;
4646
import org.apache.hadoop.hive.metastore.conf.MetastoreConf;
4747
import org.apache.hadoop.hive.metastore.metrics.Metrics;
4848
import org.apache.hadoop.hive.metastore.metrics.MetricsConstants;
4949
import org.apache.thrift.TBase;
5050
import org.apache.thrift.TException;
51+
import org.reflections.Reflections;
5152
import org.slf4j.Logger;
5253
import org.slf4j.LoggerFactory;
5354

5455
import static org.apache.hadoop.hive.metastore.ExceptionHandler.handleException;
5556
import static org.apache.hadoop.hive.metastore.conf.MetastoreConf.ConfVars.HIVE_IN_TEST;
57+
import static org.apache.hadoop.hive.metastore.utils.JavaUtils.getField;
58+
import static org.apache.hadoop.hive.metastore.utils.JavaUtils.newInstance;
5659

57-
public abstract class AbstractOperationHandler<T extends TBase, A extends AbstractOperationHandler.Result> {
58-
59-
private static final Logger LOG = LoggerFactory.getLogger(AbstractOperationHandler.class);
60-
private static final Map<String, AbstractOperationHandler> OPID_TO_HANDLER = new ConcurrentHashMap<>();
60+
public abstract class AbstractRequestHandler<T extends TBase, A extends AbstractRequestHandler.Result> {
61+
private static final Logger LOG = LoggerFactory.getLogger(AbstractRequestHandler.class);
62+
private static final Map<String, AbstractRequestHandler> OPID_TO_HANDLER = new ConcurrentHashMap<>();
63+
private static final AtomicLong ID = new AtomicLong(0);
6164
private static final ScheduledExecutorService OPID_CLEANER = Executors.newScheduledThreadPool(1, r -> {
6265
Thread thread = new Thread(r);
6366
thread.setDaemon(true);
@@ -67,33 +70,31 @@ public abstract class AbstractOperationHandler<T extends TBase, A extends Abstra
6770

6871
private static final Map<Class<? extends TBase>, HandlerFactory> REQ_FACTORIES = new ConcurrentHashMap<>();
6972
static {
70-
REQ_FACTORIES.put(DropTableRequest.class, (base, request) -> {
71-
DropTableRequest req = (DropTableRequest) request;
72-
AbstractOperationHandler opHandler = ofCache(req.getId(), req.isCancel());
73-
if (opHandler == null) {
74-
opHandler = new DropTableHandler(base, req);
73+
Set<Class<? extends AbstractRequestHandler>> handlerClasses =
74+
new Reflections("org.apache.hadoop.hive.metastore.handler").getSubTypesOf(AbstractRequestHandler.class);
75+
for (Class<? extends AbstractRequestHandler> clz : handlerClasses) {
76+
if (Modifier.isAbstract(clz.getModifiers())) {
77+
continue;
7578
}
76-
return opHandler;
77-
});
78-
79-
REQ_FACTORIES.put(DropDatabaseRequest.class, (base, request) -> {
80-
DropDatabaseRequest req = (DropDatabaseRequest) request;
81-
AbstractOperationHandler opHandler = ofCache(req.getId(), req.isCancel());
82-
if (opHandler == null) {
83-
opHandler = new DropDatabaseHandler(base, req);
79+
RequestHandler handler = clz.getAnnotation(RequestHandler.class);
80+
Class<? extends TBase> requestBody;
81+
if (handler == null || (requestBody = handler.requestBody()) == null) {
82+
continue;
8483
}
85-
return opHandler;
86-
});
87-
88-
REQ_FACTORIES.put(DropPartitionsRequest.class, (base, request) -> {
89-
DropPartitionsRequest req = (DropPartitionsRequest) request;
90-
return new DropPartitionsHandler(base, req);
91-
});
92-
93-
REQ_FACTORIES.put(AddPartitionsRequest.class, (base, request) -> {
94-
AddPartitionsRequest req = (AddPartitionsRequest) request;
95-
return new AddPartitionsHandler(base, req);
96-
});
84+
validateHandler(clz, handler);
85+
REQ_FACTORIES.put(requestBody, (base, request) -> {
86+
AbstractRequestHandler opHandler = null;
87+
if (handler.supportAsync()) {
88+
opHandler =
89+
ofCache(getField(request, handler.id()), getField(request, handler.cancel()));
90+
}
91+
if (opHandler == null) {
92+
opHandler =
93+
newInstance(clz, new Class[]{IHMSHandler.class, requestBody}, new Object[]{base, request});
94+
}
95+
return opHandler;
96+
});
97+
}
9798
}
9899

99100
private Result result;
@@ -107,19 +108,19 @@ public abstract class AbstractOperationHandler<T extends TBase, A extends Abstra
107108
protected final String id;
108109
private long timeout;
109110

110-
private AbstractOperationHandler(String id) {
111+
private AbstractRequestHandler(String id) {
111112
this.id = id;
112113
}
113114

114-
AbstractOperationHandler(IHMSHandler handler, boolean async, T request) {
115-
this.id = UUID.randomUUID().toString();
115+
AbstractRequestHandler(IHMSHandler handler, boolean async, T request) {
116+
this.id = UUID.randomUUID() + "-" + ID.incrementAndGet();
116117
this.handler = handler;
117118
this.request = request;
118119
this.async = async;
119120
this.timeout = MetastoreConf.getBoolVar(handler.getConf(), HIVE_IN_TEST) ? 10 : 5000;
120121
final Timer.Context timerContext;
121-
if (getHandlerAlias() != null) {
122-
Timer timer = Metrics.getOrCreateTimer(MetricsConstants.API_PREFIX + getHandlerAlias());
122+
if (StringUtils.isNotEmpty(getMetricAlias())) {
123+
Timer timer = Metrics.getOrCreateTimer(MetricsConstants.API_PREFIX + getMetricAlias());
123124
timerContext = timer != null ? timer.time() : null;
124125
} else {
125126
timerContext = null;
@@ -159,9 +160,9 @@ private AbstractOperationHandler(String id) {
159160
this.executor.shutdown();
160161
}
161162

162-
private static <T extends TBase, A extends Result> AbstractOperationHandler<T, A>
163+
private static <T extends TBase, A extends Result> AbstractRequestHandler<T, A>
163164
ofCache(String opId, boolean shouldCancel) throws TException {
164-
AbstractOperationHandler<T, A> opHandler = null;
165+
AbstractRequestHandler<T, A> opHandler = null;
165166
if (opId != null) {
166167
opHandler = OPID_TO_HANDLER.get(opId);
167168
if (opHandler == null && !shouldCancel) {
@@ -171,7 +172,7 @@ private AbstractOperationHandler(String id) {
171172
if (opHandler != null) {
172173
opHandler.cancelOperation();
173174
} else {
174-
opHandler = new AbstractOperationHandler<>(opId) {
175+
opHandler = new AbstractRequestHandler<>(opId) {
175176
@Override
176177
public OperationStatus getOperationStatus() throws TException {
177178
OperationStatus resp = new OperationStatus(opId);
@@ -198,7 +199,7 @@ public String getProgress() {
198199
return opHandler;
199200
}
200201

201-
public static <T extends AbstractOperationHandler> T offer(IHMSHandler handler, TBase req)
202+
public static <T extends AbstractRequestHandler> T offer(IHMSHandler handler, TBase req)
202203
throws TException, IOException {
203204
HandlerFactory factory = REQ_FACTORIES.get(req.getClass());
204205
if (factory != null) {
@@ -242,37 +243,22 @@ public OperationStatus getOperationStatus() throws TException {
242243
}
243244

244245
public static class OperationStatus {
245-
private final String id;
246-
private String message;
247-
private boolean finished;
246+
final String id;
247+
String message;
248+
boolean finished;
248249
OperationStatus(String id) {
249250
this.id = id;
250251
}
251-
252-
public String getMessage() {
253-
return message;
254-
}
255-
256252
public void setMessage(String message) {
257253
this.message = message;
258254
}
259-
260-
public String getId() {
261-
return id;
262-
}
263-
264-
public boolean isFinished() {
265-
return finished;
266-
}
267-
268255
public void setFinished(boolean finished) {
269256
this.finished = finished;
270257
}
271-
272258
public AsyncOperationResp toAsyncOperationResp() {
273-
AsyncOperationResp resp = new AsyncOperationResp(getId());
274-
resp.setFinished(isFinished());
275-
resp.setMessage(getMessage());
259+
AsyncOperationResp resp = new AsyncOperationResp(id);
260+
resp.setFinished(finished);
261+
resp.setMessage(message);
276262
return resp;
277263
}
278264
}
@@ -294,7 +280,7 @@ public void cancelOperation() {
294280
*/
295281
public final A getResult() throws TException {
296282
OperationStatus resp = getOperationStatus();
297-
if (!resp.isFinished()) {
283+
if (!resp.finished) {
298284
throw new IllegalStateException("Result is un-available as " +
299285
getMessagePrefix() + " is still running");
300286
}
@@ -335,15 +321,16 @@ protected void beforeExecute() throws TException, IOException {
335321

336322
public boolean success() throws TException {
337323
OperationStatus status = getOperationStatus();
338-
return status.isFinished() && result != null && result.success();
324+
return status.finished && result != null && result.success();
339325
}
340326

341327
/**
342328
* Get the alias of this handler for metrics.
343-
* @return the alias, null if no need to measure the operation.
329+
* @return the alias, null or empty if no need to measure the operation.
344330
*/
345-
protected String getHandlerAlias() {
346-
return null;
331+
private String getMetricAlias() {
332+
RequestHandler handler = getClass().getAnnotation(RequestHandler.class);
333+
return handler != null ? handler.metricAlias() : null;
347334
}
348335

349336
public void checkInterrupted() throws MetaException {
@@ -366,8 +353,8 @@ public static boolean containsOp(String opId) {
366353
return OPID_TO_HANDLER.containsKey(opId);
367354
}
368355

369-
public interface HandlerFactory {
370-
AbstractOperationHandler create(IHMSHandler base, TBase req) throws TException, IOException;
356+
interface HandlerFactory {
357+
AbstractRequestHandler create(IHMSHandler base, TBase req) throws TException, IOException;
371358
}
372359

373360
public interface Result {
@@ -386,4 +373,19 @@ default Result shrinkIfNecessary() {
386373
return this;
387374
}
388375
}
376+
377+
private static void validateHandler(Class<? extends AbstractRequestHandler> clz,
378+
RequestHandler handler) {
379+
try {
380+
Class<? extends TBase> requestBody = handler.requestBody();
381+
// Check the constructor
382+
clz.getDeclaredConstructor(IHMSHandler.class, requestBody);
383+
if (handler.supportAsync()) {
384+
requestBody.getMethod(handler.id());
385+
requestBody.getMethod(handler.cancel());
386+
}
387+
} catch (Exception e) {
388+
throw new RuntimeException(clz + " is not a satisfied handler as it's declared to be", e);
389+
}
390+
}
389391
}

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/handler/AddPartitionsHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@
7676
import static org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.getDefaultCatalog;
7777
import static org.apache.hadoop.hive.metastore.utils.StringUtils.normalizeIdentifier;
7878

79+
@RequestHandler(requestBody = AddPartitionsRequest.class)
7980
public class AddPartitionsHandler
80-
extends AbstractOperationHandler<AddPartitionsRequest, AddPartitionsHandler.AddPartitionsResult> {
81+
extends AbstractRequestHandler<AddPartitionsRequest, AddPartitionsHandler.AddPartitionsResult> {
8182
private TableName tableName;
8283
private Table table;
8384
private Database db;

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/handler/DropDatabaseHandler.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@
6767
import static org.apache.hadoop.hive.metastore.utils.MetaStoreServerUtils.isDbReplicationTarget;
6868
import static org.apache.hadoop.hive.metastore.utils.StringUtils.normalizeIdentifier;
6969

70+
@RequestHandler(requestBody = DropDatabaseRequest.class, supportAsync = true, metricAlias = "drop_database_req")
7071
public class DropDatabaseHandler
71-
extends AbstractOperationHandler<DropDatabaseRequest, DropDatabaseHandler.DropDatabaseResult> {
72+
extends AbstractRequestHandler<DropDatabaseRequest, DropDatabaseHandler.DropDatabaseResult> {
7273

7374
private static final Logger LOG = LoggerFactory.getLogger(DropDatabaseHandler.class);
7475
private String name;
@@ -143,7 +144,7 @@ public DropDatabaseResult execute() throws TException, IOException {
143144
dropRequest.setDeleteData(false);
144145
dropRequest.setDropPartitions(true);
145146
dropRequest.setAsyncDrop(false);
146-
DropTableHandler dropTable = AbstractOperationHandler.offer(handler, dropRequest);
147+
DropTableHandler dropTable = AbstractRequestHandler.offer(handler, dropRequest);
147148
if (tableDataShouldBeDeleted
148149
&& dropTable.success()) {
149150
DropTableHandler.DropTableResult dropTableResult = dropTable.getResult();
@@ -404,11 +405,6 @@ public Result shrinkIfNecessary() {
404405
}
405406
}
406407

407-
@Override
408-
protected String getHandlerAlias() {
409-
return "drop_database_req";
410-
}
411-
412408
@Override
413409
protected void afterExecute(DropDatabaseResult result) throws MetaException, IOException {
414410
try {

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/handler/DropPartitionsHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,16 @@
6060
import org.slf4j.Logger;
6161
import org.slf4j.LoggerFactory;
6262

63-
import static org.apache.hadoop.hive.metastore.HMSHandler.addTruncateBaseFile;
63+
import static org.apache.hadoop.hive.metastore.handler.TruncateTableHandler.addTruncateBaseFile;
6464
import static org.apache.hadoop.hive.metastore.utils.MetaStoreServerUtils.checkTableDataShouldBeDeleted;
6565
import static org.apache.hadoop.hive.metastore.utils.MetaStoreServerUtils.getWriteId;
6666
import static org.apache.hadoop.hive.metastore.utils.MetaStoreServerUtils.isMustPurge;
6767
import static org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.getDefaultCatalog;
6868
import static org.apache.hadoop.hive.metastore.utils.StringUtils.normalizeIdentifier;
6969

70+
@RequestHandler(requestBody = DropPartitionsRequest.class)
7071
public class DropPartitionsHandler
71-
extends AbstractOperationHandler<DropPartitionsRequest, DropPartitionsHandler.DropPartitionsResult> {
72+
extends AbstractRequestHandler<DropPartitionsRequest, DropPartitionsHandler.DropPartitionsResult> {
7273
private static final Logger LOG = LoggerFactory.getLogger(DropPartitionsHandler.class);
7374
private TableName tableName;
7475
private Table table;

0 commit comments

Comments
 (0)