HBASE-9875 NamespaceJanitor chore is not used

This commit is contained in:
stack 2014-08-27 09:56:16 -07:00
parent 57328e1121
commit e5123cc2ce
3 changed files with 0 additions and 174 deletions

View File

@ -169,7 +169,6 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
/** Namespace stuff */
private TableNamespaceManager tableNamespaceManager;
private NamespaceJanitor namespaceJanitorChore;
// Metrics for the HMaster
final MetricsMaster metricsMaster;
@ -617,22 +616,6 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
}
}
/**
* Useful for testing purpose also where we have
* master restart scenarios.
*/
protected void startCatalogJanitorChore() {
Threads.setDaemonThreadRunning(catalogJanitorChore.getThread());
}
/**
* Useful for testing purpose also where we have
* master restart scenarios.
*/
protected void startNamespaceJanitorChore() {
Threads.setDaemonThreadRunning(namespaceJanitorChore.getThread());
}
/**
* Create a {@link ServerManager} instance.
* @param master
@ -892,9 +875,6 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
if (this.clusterStatusPublisherChore != null){
clusterStatusPublisherChore.interrupt();
}
if (this.namespaceJanitorChore != null){
namespaceJanitorChore.interrupt();
}
}
/**

View File

@ -1,149 +0,0 @@
/**
*
* 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.hbase.master;
import com.google.common.collect.Sets;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.Chore;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.util.FSUtils;
import org.apache.hadoop.hbase.zookeeper.ZKUtil;
import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
import org.apache.zookeeper.KeeperException;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* A janitor for the namespace artifacts.
* Traverses hdfs and zk to remove orphaned directories/znodes
*/
@InterfaceAudience.Private
public class NamespaceJanitor extends Chore {
private static final Log LOG = LogFactory.getLog(NamespaceJanitor.class.getName());
private final MasterServices services;
private AtomicBoolean enabled = new AtomicBoolean(true);
public NamespaceJanitor(final MasterServices services) {
super("NamespaceJanitor-" + services.getServerName().toShortString(),
services.getConfiguration().getInt("hbase.namespacejanitor.interval", 300000),
services);
this.services = services;
}
@Override
protected boolean initialChore() {
try {
if (this.enabled.get()) removeOrphans();
} catch (IOException e) {
LOG.warn("Failed NamespaceJanitor chore", e);
return false;
} catch (KeeperException e) {
LOG.warn("Failed NamespaceJanitor chore", e);
return false;
}
return true;
}
/**
* @param enabled
*/
public boolean setEnabled(final boolean enabled) {
return this.enabled.getAndSet(enabled);
}
boolean getEnabled() {
return this.enabled.get();
}
@Override
protected void chore() {
try {
if (this.enabled.get()) {
removeOrphans();
} else {
LOG.warn("NamepsaceJanitor disabled! Not running scan.");
}
} catch (IOException e) {
LOG.warn("Failed NamespaceJanitor chore", e);
} catch (KeeperException e) {
LOG.warn("Failed NamespaceJanitor chore", e);
}
}
private void removeOrphans() throws IOException, KeeperException {
//cache the info so we don't need to keep the master nsLock for long
//and not be wasteful with rpc calls
FileSystem fs = services.getMasterFileSystem().getFileSystem();
Set<String> descs = Sets.newHashSet();
for(NamespaceDescriptor ns : services.listNamespaceDescriptors()) {
descs.add(ns.getName());
}
//cleanup hdfs orphans
for (FileStatus nsStatus : FSUtils.listStatus(fs,
new Path(FSUtils.getRootDir(services.getConfiguration()), HConstants.BASE_NAMESPACE_DIR))) {
if (!descs.contains(nsStatus.getPath().getName()) &&
!NamespaceDescriptor.RESERVED_NAMESPACES.contains(nsStatus.getPath().getName())) {
boolean isEmpty = true;
for(FileStatus status : fs.listStatus(nsStatus.getPath())) {
if (!HConstants.HBASE_NON_TABLE_DIRS.contains(status.getPath().getName())) {
isEmpty = false;
break;
}
}
if(isEmpty) {
try {
if (!fs.delete(nsStatus.getPath(), true)) {
LOG.error("Failed to remove namespace directory: " + nsStatus.getPath());
}
} catch (IOException ex) {
LOG.error("Failed to remove namespace directory: " + nsStatus.getPath(),
ex);
}
LOG.debug("Removed namespace directory: "+nsStatus.getPath());
} else {
LOG.debug("Skipping non-empty namespace directory: " + nsStatus.getPath());
}
}
}
String baseZnode = ZooKeeperWatcher.namespaceZNode;
for(String child : ZKUtil.listChildrenNoWatch(services.getZooKeeper(), baseZnode)) {
if (!descs.contains(child) &&
!NamespaceDescriptor.RESERVED_NAMESPACES.contains(child)) {
String znode = ZKUtil.joinZNode(baseZnode, child);
try {
ZKUtil.deleteNode(services.getZooKeeper(), znode);
LOG.debug("Removed namespace znode: " + znode);
} catch (KeeperException ex) {
LOG.debug("Failed to remove namespace znode: " + znode, ex);
}
}
}
}
}

View File

@ -1111,11 +1111,6 @@ public class TestSplitTransactionOnCluster {
InterruptedException {
super(conf, cp);
}
@Override
protected void startCatalogJanitorChore() {
LOG.debug("Customised master executed.");
}
}
private static class SplittingNodeCreationFailedException extends IOException {