blob: c22f0548dc6cd3c1145c9956353da8cbe45b319e [file] [log] [blame]
/*
* 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.tajo;
import java.util.Arrays;
import com.google.common.base.Preconditions;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.util.KeyValueSet;
import static org.apache.tajo.ConfigKey.ConfigType;
import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueSetProto;
/**
* OverridableConf provides a consolidated config system. Tajo basically uses TajoConf, which is a extended class of
* Hadoop's Configuration system, However, TajoConf is only used for sharing static system configs, such as binding
* address of master and workers, system directories, other system parameters.
*
* For modifiable or instant configs, we use OverridableConf, which is a set of key-value pairs.
* OverridableConf provides more strong-typed way to set configs and its behavior is more clear than Configuration
* system.
*
* By default, OverridableConf recognizes following config types.
*
* <ul>
* <li>System Config - it comes from Hadoop's Configuration class. by tajo-site, catalog-site,
* catalog-default and TajoConf.</li>
* <li>Session variables - they are instantly configured by users.
* Each client session has it own set of session variables.</li>
* </ul>
*
* System configs and session variables can set the same config in the same time. System configs are usually used to set
* default configs, and session variables is user-specified configs. So, session variables can override system configs.
*/
public class OverridableConf extends KeyValueSet {
private static final Log LOG = LogFactory.getLog(OverridableConf.class);
private ConfigType [] configTypes;
protected TajoConf conf;
public OverridableConf(final TajoConf conf, ConfigType...configTypes) {
this.conf = conf;
this.configTypes = configTypes;
}
public OverridableConf(final TajoConf conf, KeyValueSetProto proto, ConfigType...configTypes) {
super(proto);
this.conf = conf;
this.configTypes = configTypes;
}
public void setConf(TajoConf conf) {
this.conf = conf;
}
public TajoConf getConf() {
return conf;
}
public void setBool(ConfigKey key, boolean val) {
setBool(key.keyname(), val);
}
public boolean getBool(ConfigKey key, Boolean defaultVal) {
assertRegisteredEnum(key);
if (key.type() != ConfigType.SESSION && key.type() != ConfigType.SYSTEM) {
return getBool(key.keyname(), defaultVal);
} else {
switch (key.type()) {
case QUERY:
return getBool(key.keyname());
case SESSION:
return getBool(key.keyname(), conf.getBoolVar(((SessionVars) key).getConfVars()));
case SYSTEM:
return conf.getBoolVar((TajoConf.ConfVars) key);
default:
throw new IllegalStateException("key does not belong to Session and System config sets");
}
}
}
@Override
public boolean getBool(ConfigKey key) {
return getBool(key, null);
}
public void setInt(ConfigKey key, int val) {
setInt(key.keyname(), val);
}
public int getInt(ConfigKey key, Integer defaultVal) {
assertRegisteredEnum(key);
if (key.type() != ConfigType.SESSION && key.type() != ConfigType.SYSTEM) {
return getInt(key.keyname(), defaultVal);
} else {
switch (key.type()) {
case SESSION:
return getInt(key.keyname(), conf.getIntVar(((SessionVars) key).getConfVars()));
case SYSTEM:
return conf.getIntVar((TajoConf.ConfVars) key);
default:
throw new IllegalStateException("key does not belong to Session and System config sets");
}
}
}
@Override
public int getInt(ConfigKey key) {
return getInt(key, null);
}
public void setLong(ConfigKey key, long val) {
setLong(key.keyname(), val);
}
public long getLong(ConfigKey key, Long defaultVal) {
assertRegisteredEnum(key);
if (key.type() != ConfigType.SESSION && key.type() != ConfigType.SYSTEM) {
return getLong(key.keyname(), defaultVal);
} else {
switch (key.type()) {
case SESSION:
return getLong(key.keyname(), conf.getLongVar(((SessionVars) key).getConfVars()));
case SYSTEM:
return conf.getLongVar((TajoConf.ConfVars) key);
default:
throw new IllegalStateException("key does not belong to Session and System config sets");
}
}
}
@Override
public long getLong(ConfigKey key) {
return getLong(key, null);
}
public void setFloat(ConfigKey key, float val) {
setFloat(key.keyname(), val);
}
public float getFloat(ConfigKey key, Float defaultVal) {
assertRegisteredEnum(key);
if (key.type() != ConfigType.SESSION && key.type() != ConfigType.SYSTEM) {
return getFloat(key.keyname(), defaultVal);
} else {
switch (key.type()) {
case SESSION:
return getFloat(key.keyname(), conf.getFloatVar(((SessionVars) key).getConfVars()));
case SYSTEM:
return conf.getFloatVar((TajoConf.ConfVars) key);
default:
throw new IllegalStateException("key does not belong to Session and System config sets");
}
}
}
@Override
public float getFloat(ConfigKey key) {
return getLong(key, null);
}
public void put(ConfigKey key, String val) {
set(key.keyname(), val);
}
private void assertRegisteredEnum(ConfigKey key) {
boolean registered = false;
if (configTypes != null) {
for (ConfigType c : configTypes) {
registered = key.type() == c;
}
}
// default permitted keys
registered |= key.type() == ConfigType.SESSION || key.type() != ConfigType.SYSTEM;
Preconditions.checkArgument(registered, key.keyname() + " (" + key.type() + ") is not allowed in " +
getClass().getSimpleName());
}
public String get(ConfigKey key, String defaultVal) {
assertRegisteredEnum(key);
if (key.type() != ConfigType.SESSION && key.type() != ConfigType.SYSTEM) {
return get(key.keyname(), defaultVal);
} else {
switch (key.type()) {
case SESSION:
return get(key.keyname(), conf.getVar(((SessionVars) key).getConfVars()));
case SYSTEM:
return conf.getVar((TajoConf.ConfVars) key);
default:
throw new IllegalStateException("key does not belong to Session and System config sets");
}
}
}
public String get(ConfigKey key) {
return get(key, null);
}
public Class<?> getClass(ConfigKey key) {
assertRegisteredEnum(key);
String className = getTrimmed(key);
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public String getTrimmed(ConfigKey key) {
String value = get(key);
if (null == value) {
return null;
} else {
return value.trim();
}
}
public boolean containsKey(ConfigKey key) {
return containsKey(key.keyname());
}
public boolean equalKey(ConfigKey key, String another) {
if (containsKey(key)) {
return get(key).equals(another);
} else {
return false;
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((conf == null) ? 0 : conf.hashCode());
result = prime * result + Arrays.hashCode(configTypes);
return result;
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
}