Merge branch '1.5.2-SNAPSHOT' into 1.6.1-SNAPSHOT Conflicts: server/base/src/main/java/org/apache/accumulo/server/conf/ZooConfiguration.java
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/3d831155 Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/3d831155 Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/3d831155 Branch: refs/heads/ACCUMULO-378 Commit: 3d83115578ab75ad4b541680cdf966d62bb068ee Parents: b369585 8de4262 Author: Bill Havanki <bhava...@cloudera.com> Authored: Thu Jun 12 20:09:30 2014 -0400 Committer: Bill Havanki <bhava...@cloudera.com> Committed: Thu Jun 12 20:09:30 2014 -0400 ---------------------------------------------------------------------- .../org/apache/accumulo/server/client/HdfsZooInstance.java | 8 -------- .../org/apache/accumulo/server/conf/ZooConfiguration.java | 7 +------ 2 files changed, 1 insertion(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/3d831155/server/base/src/main/java/org/apache/accumulo/server/client/HdfsZooInstance.java ---------------------------------------------------------------------- diff --cc server/base/src/main/java/org/apache/accumulo/server/client/HdfsZooInstance.java index 27c289b,0000000..3508164 mode 100644,000000..100644 --- a/server/base/src/main/java/org/apache/accumulo/server/client/HdfsZooInstance.java +++ b/server/base/src/main/java/org/apache/accumulo/server/client/HdfsZooInstance.java @@@ -1,206 -1,0 +1,198 @@@ +/* + * 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.accumulo.server.client; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import org.apache.accumulo.core.Constants; +import org.apache.accumulo.core.client.AccumuloException; +import org.apache.accumulo.core.client.AccumuloSecurityException; +import org.apache.accumulo.core.client.Connector; +import org.apache.accumulo.core.client.Instance; +import org.apache.accumulo.core.client.ZooKeeperInstance; +import org.apache.accumulo.core.client.impl.ConnectorImpl; +import org.apache.accumulo.core.client.security.tokens.AuthenticationToken; +import org.apache.accumulo.core.client.security.tokens.PasswordToken; +import org.apache.accumulo.core.conf.AccumuloConfiguration; +import org.apache.accumulo.core.conf.Property; +import org.apache.accumulo.core.metadata.RootTable; +import org.apache.accumulo.core.security.Credentials; +import org.apache.accumulo.core.util.ByteBufferUtil; +import org.apache.accumulo.core.util.OpTimer; +import org.apache.accumulo.core.util.StringUtil; +import org.apache.accumulo.core.util.TextUtil; +import org.apache.accumulo.core.zookeeper.ZooUtil; +import org.apache.accumulo.fate.zookeeper.ZooCache; +import org.apache.accumulo.fate.zookeeper.ZooCacheFactory; +import org.apache.accumulo.server.Accumulo; +import org.apache.accumulo.server.conf.ServerConfiguration; +import org.apache.accumulo.server.fs.VolumeManager; +import org.apache.accumulo.server.fs.VolumeManagerImpl; +import org.apache.accumulo.server.zookeeper.ZooLock; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.io.Text; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +/** + * An implementation of Instance that looks in HDFS and ZooKeeper to find the master and root tablet location. + * + */ +public class HdfsZooInstance implements Instance { + - public static class AccumuloNotInitializedException extends RuntimeException { - private static final long serialVersionUID = 1L; - - public AccumuloNotInitializedException(String string) { - super(string); - } - } - + private HdfsZooInstance() { + AccumuloConfiguration acuConf = ServerConfiguration.getSiteConfiguration(); + zooCache = new ZooCacheFactory().getZooCache(acuConf.get(Property.INSTANCE_ZK_HOST), (int) acuConf.getTimeInMillis(Property.INSTANCE_ZK_TIMEOUT)); + } + + private static HdfsZooInstance cachedHdfsZooInstance = null; + + public static synchronized Instance getInstance() { + if (cachedHdfsZooInstance == null) + cachedHdfsZooInstance = new HdfsZooInstance(); + return cachedHdfsZooInstance; + } + + private static ZooCache zooCache; + private static String instanceId = null; + private static final Logger log = Logger.getLogger(HdfsZooInstance.class); + + @Override + public String getRootTabletLocation() { + String zRootLocPath = ZooUtil.getRoot(this) + RootTable.ZROOT_TABLET_LOCATION; + + OpTimer opTimer = new OpTimer(log, Level.TRACE).start("Looking up root tablet location in zoocache."); + + byte[] loc = zooCache.get(zRootLocPath); + + opTimer.stop("Found root tablet at " + (loc == null ? null : new String(loc, Constants.UTF8)) + " in %DURATION%"); + + if (loc == null) { + return null; + } + + return new String(loc, Constants.UTF8).split("\\|")[0]; + } + + @Override + public List<String> getMasterLocations() { + + String masterLocPath = ZooUtil.getRoot(this) + Constants.ZMASTER_LOCK; + + OpTimer opTimer = new OpTimer(log, Level.TRACE).start("Looking up master location in zoocache."); + + byte[] loc = ZooLock.getLockData(zooCache, masterLocPath, null); + + opTimer.stop("Found master at " + (loc == null ? null : new String(loc, Constants.UTF8)) + " in %DURATION%"); + + if (loc == null) { + return Collections.emptyList(); + } + + return Collections.singletonList(new String(loc, Constants.UTF8)); + } + + @Override + public String getInstanceID() { + if (instanceId == null) + _getInstanceID(); + return instanceId; + } + + private static synchronized void _getInstanceID() { + if (instanceId == null) { + AccumuloConfiguration acuConf = ServerConfiguration.getSiteConfiguration(); + // InstanceID should be the same across all volumes, so just choose one + VolumeManager fs; + try { + fs = VolumeManagerImpl.get(); + } catch (IOException e) { + throw new RuntimeException(e); + } + Path instanceIdPath = Accumulo.getAccumuloInstanceIdPath(fs); + log.trace("Looking for instanceId from " + instanceIdPath); + String instanceIdFromFile = ZooUtil.getInstanceIDFromHdfs(instanceIdPath, acuConf); + instanceId = instanceIdFromFile; + } + } + + @Override + public String getInstanceName() { + return ZooKeeperInstance.lookupInstanceName(zooCache, UUID.fromString(getInstanceID())); + } + + @Override + public String getZooKeepers() { + return ServerConfiguration.getSiteConfiguration().get(Property.INSTANCE_ZK_HOST); + } + + @Override + public int getZooKeepersSessionTimeOut() { + return (int) ServerConfiguration.getSiteConfiguration().getTimeInMillis(Property.INSTANCE_ZK_TIMEOUT); + } + + @Override + public Connector getConnector(String principal, AuthenticationToken token) throws AccumuloException, AccumuloSecurityException { + return new ConnectorImpl(this, new Credentials(principal, token)); + } + + @Deprecated + @Override + public Connector getConnector(String user, byte[] pass) throws AccumuloException, AccumuloSecurityException { + return getConnector(user, new PasswordToken(pass)); + } + + @Deprecated + @Override + public Connector getConnector(String user, ByteBuffer pass) throws AccumuloException, AccumuloSecurityException { + return getConnector(user, ByteBufferUtil.toBytes(pass)); + } + + @Deprecated + @Override + public Connector getConnector(String user, CharSequence pass) throws AccumuloException, AccumuloSecurityException { + return getConnector(user, TextUtil.getBytes(new Text(pass.toString()))); + } + + private AccumuloConfiguration conf = null; + + @Deprecated + @Override + public AccumuloConfiguration getConfiguration() { + if (conf == null) + conf = new ServerConfiguration(this).getConfiguration(); + return conf; + } + + @Override + @Deprecated + public void setConfiguration(AccumuloConfiguration conf) { + this.conf = conf; + } + + public static void main(String[] args) { + Instance instance = HdfsZooInstance.getInstance(); + System.out.println("Instance Name: " + instance.getInstanceName()); + System.out.println("Instance ID: " + instance.getInstanceID()); + System.out.println("ZooKeepers: " + instance.getZooKeepers()); + System.out.println("Masters: " + StringUtil.join(instance.getMasterLocations(), ", ")); + } +} http://git-wip-us.apache.org/repos/asf/accumulo/blob/3d831155/server/base/src/main/java/org/apache/accumulo/server/conf/ZooConfiguration.java ---------------------------------------------------------------------- diff --cc server/base/src/main/java/org/apache/accumulo/server/conf/ZooConfiguration.java index 2eafc50,0000000..696873b mode 100644,000000..100644 --- a/server/base/src/main/java/org/apache/accumulo/server/conf/ZooConfiguration.java +++ b/server/base/src/main/java/org/apache/accumulo/server/conf/ZooConfiguration.java @@@ -1,147 -1,0 +1,142 @@@ +/* + * 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.accumulo.server.conf; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.accumulo.core.Constants; +import org.apache.accumulo.core.client.Instance; +import org.apache.accumulo.core.conf.AccumuloConfiguration; +import org.apache.accumulo.core.conf.Property; +import org.apache.accumulo.core.zookeeper.ZooUtil; +import org.apache.accumulo.fate.zookeeper.ZooCache; +import org.apache.accumulo.fate.zookeeper.ZooCacheFactory; +import org.apache.accumulo.server.Accumulo; - import org.apache.accumulo.server.client.HdfsZooInstance.AccumuloNotInitializedException; +import org.apache.accumulo.server.fs.VolumeManager; +import org.apache.accumulo.server.fs.VolumeManagerImpl; +import org.apache.hadoop.fs.Path; +import org.apache.log4j.Logger; + +public class ZooConfiguration extends AccumuloConfiguration { + private static final Logger log = Logger.getLogger(ZooConfiguration.class); + + private final AccumuloConfiguration parent; + private static ZooConfiguration instance = null; + private static String instanceId = null; + private static ZooCache propCache = null; + private final Map<String,String> fixedProps = Collections.synchronizedMap(new HashMap<String,String>()); + + private ZooConfiguration(AccumuloConfiguration parent) { + this.parent = parent; + } + + synchronized public static ZooConfiguration getInstance(Instance inst, AccumuloConfiguration parent) { + if (instance == null) { + propCache = new ZooCacheFactory().getZooCache(inst.getZooKeepers(), inst.getZooKeepersSessionTimeOut()); + instance = new ZooConfiguration(parent); + instanceId = inst.getInstanceID(); + } + return instance; + } + + synchronized public static ZooConfiguration getInstance(AccumuloConfiguration parent) { + if (instance == null) { + propCache = new ZooCacheFactory().getZooCache(parent.get(Property.INSTANCE_ZK_HOST), (int) parent.getTimeInMillis(Property.INSTANCE_ZK_TIMEOUT)); + instance = new ZooConfiguration(parent); + // InstanceID should be the same across all volumes, so just choose one + VolumeManager fs; + try { + fs = VolumeManagerImpl.get(); + } catch (IOException e) { + throw new RuntimeException(e); + } + Path instanceIdPath = Accumulo.getAccumuloInstanceIdPath(fs); + String deprecatedInstanceIdFromHdfs = ZooUtil.getInstanceIDFromHdfs(instanceIdPath, parent); + instanceId = deprecatedInstanceIdFromHdfs; + } + return instance; + } + + @Override + public void invalidateCache() { + if (propCache != null) + propCache.clear(); + } + + private String _get(Property property) { + String key = property.getKey(); + String value = null; + + if (Property.isValidZooPropertyKey(key)) { - try { - value = get(key); - } catch (AccumuloNotInitializedException e) { - log.warn("failed to lookup property in zookeeper: " + key, e); - } ++ value = get(key); + } + + if (value == null || !property.getType().isValidFormat(value)) { + if (value != null) + log.error("Using parent value for " + key + " due to improperly formatted " + property.getType() + ": " + value); + value = parent.get(property); + } + return value; + } + + @Override + public String get(Property property) { + if (Property.isFixedZooPropertyKey(property)) { + if (fixedProps.containsKey(property.getKey())) { + return fixedProps.get(property.getKey()); + } else { + synchronized (fixedProps) { + String val = _get(property); + fixedProps.put(property.getKey(), val); + return val; + } + + } + } else { + return _get(property); + } + } + + private String get(String key) { + String zPath = ZooUtil.getRoot(instanceId) + Constants.ZCONFIG + "/" + key; + byte[] v = propCache.get(zPath); + String value = null; + if (v != null) + value = new String(v, Constants.UTF8); + return value; + } + + @Override + public void getProperties(Map<String,String> props, PropertyFilter filter) { + parent.getProperties(props, filter); + + List<String> children = propCache.getChildren(ZooUtil.getRoot(instanceId) + Constants.ZCONFIG); + if (children != null) { + for (String child : children) { + if (child != null && filter.accept(child)) { + String value = get(child); + if (value != null) + props.put(child, value); + } + } + } + } +}