- /**
- * 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.hdfs.server.common;
- import java.io.IOException;
- import java.util.SortedSet;
- import java.util.TreeSet;
- import org.apache.hadoop.hdfs.protocol.FSConstants;
- import org.apache.hadoop.util.StringUtils;
- /**
- * Collection of upgrade objects.
- *
- * Upgrade objects should be registered here before they can be used.
- */
- public class UpgradeObjectCollection {
- static {
- initialize();
- // Registered distributed upgrade objects here
- // registerUpgrade(new UpgradeObject());
- }
- static class UOSignature implements Comparable<UOSignature> {
- int version;
- HdfsConstants.NodeType type;
- String className;
- UOSignature(Upgradeable uo) {
- this.version = uo.getVersion();
- this.type = uo.getType();
- this.className = uo.getClass().getCanonicalName();
- }
- int getVersion() {
- return version;
- }
- HdfsConstants.NodeType getType() {
- return type;
- }
- String getClassName() {
- return className;
- }
- Upgradeable instantiate() throws IOException {
- try {
- return (Upgradeable)Class.forName(getClassName()).newInstance();
- } catch(ClassNotFoundException e) {
- throw new IOException(StringUtils.stringifyException(e));
- } catch(InstantiationException e) {
- throw new IOException(StringUtils.stringifyException(e));
- } catch(IllegalAccessException e) {
- throw new IOException(StringUtils.stringifyException(e));
- }
- }
- public int compareTo(UOSignature o) {
- if(this.version != o.version)
- return (version < o.version ? -1 : 1);
- int res = this.getType().toString().compareTo(o.getType().toString());
- if(res != 0)
- return res;
- return className.compareTo(o.className);
- }
- public boolean equals(Object o) {
- if (!(o instanceof UOSignature)) {
- return false;
- }
- return this.compareTo((UOSignature)o) == 0;
- }
- public int hashCode() {
- return version ^ ((type==null)?0:type.hashCode())
- ^ ((className==null)?0:className.hashCode());
- }
- }
- /**
- * Static collection of upgrade objects sorted by version.
- * Layout versions are negative therefore newer versions will go first.
- */
- static SortedSet<UOSignature> upgradeTable;
- static final void initialize() {
- upgradeTable = new TreeSet<UOSignature>();
- }
- static void registerUpgrade(Upgradeable uo) {
- // Registered distributed upgrade objects here
- upgradeTable.add(new UOSignature(uo));
- }
- public static SortedSet<Upgradeable> getDistributedUpgrades(int versionFrom,
- HdfsConstants.NodeType type
- ) throws IOException {
- assert FSConstants.LAYOUT_VERSION <= versionFrom : "Incorrect version "
- + versionFrom + ". Expected to be <= " + FSConstants.LAYOUT_VERSION;
- SortedSet<Upgradeable> upgradeObjects = new TreeSet<Upgradeable>();
- for(UOSignature sig : upgradeTable) {
- if(sig.getVersion() < FSConstants.LAYOUT_VERSION)
- continue;
- if(sig.getVersion() > versionFrom)
- break;
- if(sig.getType() != type )
- continue;
- upgradeObjects.add(sig.instantiate());
- }
- if(upgradeObjects.size() == 0)
- return null;
- return upgradeObjects;
- }
- }