HDFS-2120. on reconnect, DN can connect to NN even with different source versions. (John George via atm)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1146516 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Aaron Myers 2011-07-13 23:44:42 +00:00
parent 4796e1adcb
commit c54c117407
4 changed files with 90 additions and 1 deletions

View File

@ -828,6 +828,9 @@ Trunk (unreleased changes)
HDFS-2132. Potential resource leak in EditLogFileOutputStream.close. (atm)
HDFS-2120. on reconnect, DN can connect to NN even with different source
versions. (John George via atm)
Release 0.22.0 - Unreleased
INCOMPATIBLE CHANGES

View File

@ -45,4 +45,11 @@ public class IncorrectVersionException extends IOException {
+ versionReported + ". Expecting = " + versionExpected + ".");
}
public IncorrectVersionException(String versionReported,
String ofWhat,
String versionExpected) {
super("Unexpected version "
+ (ofWhat==null ? "" : "of " + ofWhat) + ". Reported: "
+ versionReported + ". Expecting = " + versionExpected + ".");
}
}

View File

@ -1143,7 +1143,26 @@ public class DataNode extends Configured
void register() throws IOException {
LOG.info("in register: sid=" + bpRegistration.getStorageID() + ";SI="
+ bpRegistration.storageInfo);
// build and layout versions should match
String nsBuildVer = bpNamenode.versionRequest().getBuildVersion();
String stBuildVer = Storage.getBuildVersion();
if (!nsBuildVer.equals(stBuildVer)) {
LOG.warn("Data-node and name-node Build versions must be " +
"the same. Namenode build version: " + nsBuildVer + "Datanode " +
"build version: " + stBuildVer);
throw new IncorrectVersionException(nsBuildVer, "namenode", stBuildVer);
}
if (FSConstants.LAYOUT_VERSION != bpNSInfo.getLayoutVersion()) {
LOG.warn("Data-node and name-node layout versions must be " +
"the same. Expected: "+ FSConstants.LAYOUT_VERSION +
" actual "+ bpNSInfo.getLayoutVersion());
throw new IncorrectVersionException
(bpNSInfo.getLayoutVersion(), "namenode");
}
while(shouldRun && shouldServiceRun) {
try {
// Use returned registration from namenode with updated machine name.

View File

@ -0,0 +1,60 @@
/**
* 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.datanode;
import java.io.File;
import java.io.IOException;
import java.util.AbstractList;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.server.common.IncorrectVersionException;
import org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol;
import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
import org.junit.Test;
public class TestDatanodeRegister {
public static final Log LOG = LogFactory.getLog(TestDatanodeRegister.class);
@Test
public void testDataNodeRegister() throws Exception {
DataNode.BPOfferService myMockBPOS = mock(DataNode.BPOfferService.class);
doCallRealMethod().when(myMockBPOS).register();
myMockBPOS.bpRegistration = mock(DatanodeRegistration.class);
when(myMockBPOS.bpRegistration.getStorageID()).thenReturn("myTestStorageID");
NamespaceInfo fakeNSInfo = mock(NamespaceInfo.class);
when(fakeNSInfo.getBuildVersion()).thenReturn("NSBuildVersion");
DatanodeProtocol fakeDNProt = mock(DatanodeProtocol.class);
when(fakeDNProt.versionRequest()).thenReturn(fakeNSInfo);
doCallRealMethod().when(myMockBPOS).setNameNode(fakeDNProt);
myMockBPOS.setNameNode( fakeDNProt );
try {
myMockBPOS.register();
fail("register() did not throw exception! " +
"Expected: IncorrectVersionException");
} catch (IncorrectVersionException ie) {
LOG.info("register() returned correct Exception: IncorrectVersionException");
}
}
}