[ https://issues.apache.org/jira/browse/HIVE-27019?focusedWorklogId=845905&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-845905 ]
ASF GitHub Bot logged work on HIVE-27019: ----------------------------------------- Author: ASF GitHub Bot Created on: 16/Feb/23 15:12 Start Date: 16/Feb/23 15:12 Worklog Time Spent: 10m Work Description: deniskuzZ commented on code in PR #4032: URL: https://github.com/apache/hive/pull/4032#discussion_r1108561147 ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/Cleaner.java: ########## @@ -97,23 +47,31 @@ public class Cleaner extends MetaStoreCompactorThread { static final private Logger LOG = LoggerFactory.getLogger(CLASS_NAME); private boolean metricsEnabled = false; - private ReplChangeManager replChangeManager; private ExecutorService cleanerExecutor; + private List<CleaningRequestHandler> cleaningRequestHandlers; + private FSRemover fsRemover; + + public Cleaner() { + } + + public Cleaner(List<CleaningRequestHandler> cleaningRequestHandlers) { + this.cleaningRequestHandlers = cleaningRequestHandlers; + } @Override public void init(AtomicBoolean stop) throws Exception { super.init(stop); - replChangeManager = ReplChangeManager.getInstance(conf); checkInterval = conf.getTimeVar( HiveConf.ConfVars.HIVE_COMPACTOR_CLEANER_RUN_INTERVAL, TimeUnit.MILLISECONDS); cleanerExecutor = CompactorUtil.createExecutorWithThreadFactory( conf.getIntVar(HiveConf.ConfVars.HIVE_COMPACTOR_CLEANER_THREADS_NUM), COMPACTOR_CLEANER_THREAD_NAME_FORMAT); metricsEnabled = MetastoreConf.getBoolVar(conf, MetastoreConf.ConfVars.METRICS_ENABLED) && MetastoreConf.getBoolVar(conf, MetastoreConf.ConfVars.METASTORE_ACIDMETRICS_EXT_ON); - boolean tableCacheOn = MetastoreConf.getBoolVar(conf, - MetastoreConf.ConfVars.COMPACTOR_CLEANER_TABLECACHE_ON); - initializeCache(tableCacheOn); + if (cleaningRequestHandlers == null || cleaningRequestHandlers.isEmpty()) { Review Comment: could be replaced with CollectionUtils.isEmpty(cleaningRequestHandlers) ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CleaningRequest.java: ########## @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.txn.compactor; + +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; + +import java.util.List; + +/** + * A class which specifies the required information for cleanup. + * Objects from this class are passed to FSRemover for cleanup. + */ +public class CleaningRequest { + public enum RequestType { Review Comment: do we expect any other cleanup request types? maybe `dropPartition` could have it's own type? ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CleaningRequest.java: ########## @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.txn.compactor; + +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; + +import java.util.List; + +/** + * A class which specifies the required information for cleanup. + * Objects from this class are passed to FSRemover for cleanup. + */ +public class CleaningRequest { + public enum RequestType { + COMPACTION, + } + private final RequestType type; + private final String location; + private final List<Path> obsoleteDirs; + private final boolean purge; + private final FileSystem fs; + private final String runAs; + private final String cleanerMetric; + private final String dbName; + private final String tableName; + private final String partitionName; + private final boolean dropPartition; + private final String fullPartitionName; + + public CleaningRequest(CleaningRequestBuilder<? extends CleaningRequestBuilder<?>> builder) { + this.type = builder.type; + this.location = builder.location; + this.obsoleteDirs = builder.obsoleteDirs; + this.purge = builder.purge; + this.fs = builder.fs; + this.runAs = builder.runAs; + this.cleanerMetric = builder.cleanerMetric; + this.dbName = builder.dbName; Review Comment: can't we reuse the CI object? ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CleaningRequest.java: ########## @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.txn.compactor; + +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; + +import java.util.List; + +/** + * A class which specifies the required information for cleanup. + * Objects from this class are passed to FSRemover for cleanup. + */ +public class CleaningRequest { + public enum RequestType { + COMPACTION, + } + private final RequestType type; + private final String location; + private final List<Path> obsoleteDirs; + private final boolean purge; + private final FileSystem fs; + private final String runAs; + private final String cleanerMetric; Review Comment: isn't this a constant ```` MetricsConstants.COMPACTION_CLEANER_CYCLE + "_" ```` ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CompactionCleaningRequest.java: ########## @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.txn.compactor; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hive.metastore.metrics.MetricsConstants; +import org.apache.hadoop.hive.metastore.txn.CompactionInfo; +import org.apache.hadoop.hive.ql.io.AcidUtils; + +import java.util.Map; + +/** + * A cleaning request class specific to compaction based cleanup. + */ +public class CompactionCleaningRequest extends CleaningRequest { + + private final CompactionInfo compactionInfo; + private final Map<Path, AcidUtils.HdfsDirSnapshot> dirSnapshots; + + public CompactionCleaningRequest(CompactionCleaningRequestBuilder builder) { Review Comment: it's using the builder to construct itself? ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/FSRemover.java: ########## @@ -0,0 +1,218 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.txn.compactor; + +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.metastore.LockComponentBuilder; +import org.apache.hadoop.hive.metastore.LockRequestBuilder; +import org.apache.hadoop.hive.metastore.ReplChangeManager; +import org.apache.hadoop.hive.metastore.api.Database; +import org.apache.hadoop.hive.metastore.api.DataOperationType; +import org.apache.hadoop.hive.metastore.api.LockRequest; +import org.apache.hadoop.hive.metastore.api.LockResponse; +import org.apache.hadoop.hive.metastore.api.LockState; +import org.apache.hadoop.hive.metastore.api.LockType; +import org.apache.hadoop.hive.metastore.api.MetaException; +import org.apache.hadoop.hive.metastore.api.NoSuchLockException; +import org.apache.hadoop.hive.metastore.api.NoSuchObjectException; +import org.apache.hadoop.hive.metastore.api.NoSuchTxnException; +import org.apache.hadoop.hive.metastore.api.TxnOpenException; +import org.apache.hadoop.hive.metastore.api.TxnAbortedException; +import org.apache.hadoop.hive.metastore.api.UnlockRequest; +import org.apache.hadoop.hive.metastore.metrics.AcidMetricService; +import org.apache.hadoop.hive.metastore.metrics.PerfLogger; +import org.apache.hadoop.hive.metastore.utils.FileUtils; +import org.apache.hadoop.hive.ql.txn.compactor.handler.CleaningRequestHandler; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.util.StringUtils; +import org.apache.hive.common.util.Ref; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.security.PrivilegedExceptionAction; +import java.util.*; +import java.util.concurrent.Callable; + +import static org.apache.hadoop.hive.metastore.HMSHandler.getMSForConf; +import static org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.getDefaultCatalog; + +/** + * A runnable class which takes in cleaningRequestHandler and cleaning request and deletes the files + * according to the cleaning request. + */ +public class FSRemover { + private static final Logger LOG = LoggerFactory.getLogger(FSRemover.class); + private final Map<CleaningRequest.RequestType, CleaningRequestHandler> handlerMap; Review Comment: it doesn't need to know about the handlers, its job is to execute fs remove requests. use callback or something in clean method or refactor. ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/Cleaner.java: ########## @@ -97,23 +47,31 @@ public class Cleaner extends MetaStoreCompactorThread { static final private Logger LOG = LoggerFactory.getLogger(CLASS_NAME); private boolean metricsEnabled = false; - private ReplChangeManager replChangeManager; private ExecutorService cleanerExecutor; + private List<CleaningRequestHandler> cleaningRequestHandlers; + private FSRemover fsRemover; + + public Cleaner() { + } + + public Cleaner(List<CleaningRequestHandler> cleaningRequestHandlers) { Review Comment: use a setter instead of a constructor in the tests ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CleaningRequest.java: ########## @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.txn.compactor; + +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; + +import java.util.List; + +/** + * A class which specifies the required information for cleanup. + * Objects from this class are passed to FSRemover for cleanup. + */ +public class CleaningRequest { + public enum RequestType { + COMPACTION, + } + private final RequestType type; + private final String location; + private final List<Path> obsoleteDirs; + private final boolean purge; + private final FileSystem fs; Review Comment: why does it have to be part of the request object? ########## ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/Cleaner.java: ########## @@ -122,11 +80,8 @@ public void run() { try { do { TxnStore.MutexAPI.LockHandle handle = null; - invalidateMetaCache(); + cleaningRequestHandlers.forEach(CleaningRequestHandler::invalidateMetaCache); Review Comment: can't we reuse the cache between the handlers? Issue Time Tracking ------------------- Worklog Id: (was: 845905) Time Spent: 5h 40m (was: 5.5h) > Split Cleaner into separate manageable modular entities > ------------------------------------------------------- > > Key: HIVE-27019 > URL: https://issues.apache.org/jira/browse/HIVE-27019 > Project: Hive > Issue Type: Sub-task > Reporter: Sourabh Badhya > Assignee: Sourabh Badhya > Priority: Major > Labels: pull-request-available > Time Spent: 5h 40m > Remaining Estimate: 0h > > As described by the parent task - > Cleaner can be divided into separate entities like - > *1) Handler* - This entity fetches the data from the metastore DB from > relevant tables and converts it into a request entity called CleaningRequest. > It would also do SQL operations post cleanup (postprocess). Every type of > cleaning request is provided by a separate handler. > *2) Filesystem remover* - This entity fetches the cleaning requests from > various handlers and deletes them according to the cleaning request. -- This message was sent by Atlassian Jira (v8.20.10#820010)