Repository: hadoop Updated Branches: refs/heads/branch-2 7b8cc048c -> 7cd3770fe
HDFS-13068. RBF: Add router admin option to manage safe mode. Contributed by Yiqun Lin. (cherry picked from commit b0627c891b0e90e29dab2bec64a01c2c2ffe4ed0) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/7cd3770f Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/7cd3770f Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/7cd3770f Branch: refs/heads/branch-2 Commit: 7cd3770fee5f0c81bea6b12db7d5de22eb9fae7e Parents: 7b8cc04 Author: Yiqun Lin <yq...@apache.org> Authored: Fri Feb 2 11:25:41 2018 +0800 Committer: Yiqun Lin <yq...@apache.org> Committed: Fri Feb 2 17:38:32 2018 +0800 ---------------------------------------------------------------------- ...uterAdminProtocolServerSideTranslatorPB.java | 60 ++++++++++++++++ .../RouterAdminProtocolTranslatorPB.java | 60 +++++++++++++++- .../federation/router/RouterAdminServer.java | 46 +++++++++++- .../server/federation/router/RouterClient.java | 4 ++ .../federation/router/RouterStateManager.java | 50 +++++++++++++ .../store/protocol/EnterSafeModeRequest.java | 32 +++++++++ .../store/protocol/EnterSafeModeResponse.java | 50 +++++++++++++ .../store/protocol/GetSafeModeRequest.java | 31 ++++++++ .../store/protocol/GetSafeModeResponse.java | 49 +++++++++++++ .../store/protocol/LeaveSafeModeRequest.java | 32 +++++++++ .../store/protocol/LeaveSafeModeResponse.java | 50 +++++++++++++ .../impl/pb/EnterSafeModeRequestPBImpl.java | 62 ++++++++++++++++ .../impl/pb/EnterSafeModeResponsePBImpl.java | 73 +++++++++++++++++++ .../impl/pb/GetSafeModeRequestPBImpl.java | 62 ++++++++++++++++ .../impl/pb/GetSafeModeResponsePBImpl.java | 73 +++++++++++++++++++ .../impl/pb/LeaveSafeModeRequestPBImpl.java | 62 ++++++++++++++++ .../impl/pb/LeaveSafeModeResponsePBImpl.java | 73 +++++++++++++++++++ .../hdfs/tools/federation/RouterAdmin.java | 75 +++++++++++++++++++- .../src/main/proto/FederationProtocol.proto | 25 +++++++ .../src/main/proto/RouterProtocol.proto | 15 ++++ .../src/site/markdown/HDFSCommands.md | 2 + .../src/site/markdown/HDFSRouterFederation.md | 6 +- .../federation/router/TestRouterAdminCLI.java | 48 +++++++++++++ 23 files changed, 1036 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolServerSideTranslatorPB.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolServerSideTranslatorPB.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolServerSideTranslatorPB.java index 415bbd9..159d5c2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolServerSideTranslatorPB.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolServerSideTranslatorPB.java @@ -23,8 +23,14 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.AddMountTableEntryRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.AddMountTableEntryResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeResponseProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetMountTableEntriesRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetMountTableEntriesResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeResponseProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.RemoveMountTableEntryRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.RemoveMountTableEntryResponseProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateMountTableEntryRequestProto; @@ -32,16 +38,28 @@ import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProt import org.apache.hadoop.hdfs.server.federation.router.RouterAdminServer; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.AddMountTableEntryRequestPBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.AddMountTableEntryResponsePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.EnterSafeModeRequestPBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.EnterSafeModeResponsePBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetMountTableEntriesRequestPBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetMountTableEntriesResponsePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetSafeModeRequestPBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetSafeModeResponsePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.LeaveSafeModeRequestPBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.LeaveSafeModeResponsePBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.RemoveMountTableEntryRequestPBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.RemoveMountTableEntryResponsePBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.UpdateMountTableEntryRequestPBImpl; @@ -148,4 +166,46 @@ public class RouterAdminProtocolServerSideTranslatorPB implements throw new ServiceException(e); } } + + @Override + public EnterSafeModeResponseProto enterSafeMode(RpcController controller, + EnterSafeModeRequestProto request) throws ServiceException { + try { + EnterSafeModeRequest req = new EnterSafeModeRequestPBImpl(request); + EnterSafeModeResponse response = server.enterSafeMode(req); + EnterSafeModeResponsePBImpl responsePB = + (EnterSafeModeResponsePBImpl) response; + return responsePB.getProto(); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public LeaveSafeModeResponseProto leaveSafeMode(RpcController controller, + LeaveSafeModeRequestProto request) throws ServiceException { + try { + LeaveSafeModeRequest req = new LeaveSafeModeRequestPBImpl(request); + LeaveSafeModeResponse response = server.leaveSafeMode(req); + LeaveSafeModeResponsePBImpl responsePB = + (LeaveSafeModeResponsePBImpl) response; + return responsePB.getProto(); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public GetSafeModeResponseProto getSafeMode(RpcController controller, + GetSafeModeRequestProto request) throws ServiceException { + try { + GetSafeModeRequest req = new GetSafeModeRequestPBImpl(request); + GetSafeModeResponse response = server.getSafeMode(req); + GetSafeModeResponsePBImpl responsePB = + (GetSafeModeResponsePBImpl) response; + return responsePB.getProto(); + } catch (IOException e) { + throw new ServiceException(e); + } + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolTranslatorPB.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolTranslatorPB.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolTranslatorPB.java index 43663ac..d6210ce 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolTranslatorPB.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/RouterAdminProtocolTranslatorPB.java @@ -24,25 +24,41 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.AddMountTableEntryRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.AddMountTableEntryResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeResponseProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetMountTableEntriesRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetMountTableEntriesResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeResponseProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.RemoveMountTableEntryRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.RemoveMountTableEntryResponseProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateMountTableEntryRequestProto; import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.UpdateMountTableEntryResponseProto; import org.apache.hadoop.hdfs.server.federation.resolver.MountTableManager; +import org.apache.hadoop.hdfs.server.federation.router.RouterStateManager; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.AddMountTableEntryRequestPBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.AddMountTableEntryResponsePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.EnterSafeModeResponsePBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetMountTableEntriesRequestPBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetMountTableEntriesResponsePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetSafeModeResponsePBImpl; +import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.LeaveSafeModeResponsePBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.RemoveMountTableEntryRequestPBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.RemoveMountTableEntryResponsePBImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.UpdateMountTableEntryRequestPBImpl; @@ -64,7 +80,7 @@ import com.google.protobuf.ServiceException; @InterfaceStability.Stable public class RouterAdminProtocolTranslatorPB implements ProtocolMetaInterface, MountTableManager, - Closeable, ProtocolTranslator { + Closeable, ProtocolTranslator, RouterStateManager { final private RouterAdminProtocolPB rpcProxy; public RouterAdminProtocolTranslatorPB(RouterAdminProtocolPB proxy) { @@ -147,4 +163,46 @@ public class RouterAdminProtocolTranslatorPB throw new IOException(ProtobufHelper.getRemoteException(e).getMessage()); } } + + @Override + public EnterSafeModeResponse enterSafeMode(EnterSafeModeRequest request) + throws IOException { + EnterSafeModeRequestProto proto = + EnterSafeModeRequestProto.newBuilder().build(); + try { + EnterSafeModeResponseProto response = + rpcProxy.enterSafeMode(null, proto); + return new EnterSafeModeResponsePBImpl(response); + } catch (ServiceException e) { + throw new IOException(ProtobufHelper.getRemoteException(e).getMessage()); + } + } + + @Override + public LeaveSafeModeResponse leaveSafeMode(LeaveSafeModeRequest request) + throws IOException { + LeaveSafeModeRequestProto proto = + LeaveSafeModeRequestProto.newBuilder().build(); + try { + LeaveSafeModeResponseProto response = + rpcProxy.leaveSafeMode(null, proto); + return new LeaveSafeModeResponsePBImpl(response); + } catch (ServiceException e) { + throw new IOException(ProtobufHelper.getRemoteException(e).getMessage()); + } + } + + @Override + public GetSafeModeResponse getSafeMode(GetSafeModeRequest request) + throws IOException { + GetSafeModeRequestProto proto = + GetSafeModeRequestProto.newBuilder().build(); + try { + GetSafeModeResponseProto response = + rpcProxy.getSafeMode(null, proto); + return new GetSafeModeResponsePBImpl(response); + } catch (ServiceException e) { + throw new IOException(ProtobufHelper.getRemoteException(e).getMessage()); + } + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterAdminServer.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterAdminServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterAdminServer.java index 5fad0c0..0c0448c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterAdminServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterAdminServer.java @@ -32,8 +32,14 @@ import org.apache.hadoop.hdfs.server.federation.resolver.MountTableManager; import org.apache.hadoop.hdfs.server.federation.store.MountTableStore; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryRequest; @@ -56,7 +62,7 @@ import com.google.protobuf.BlockingService; * router. It is created, started, and stopped by {@link Router}. */ public class RouterAdminServer extends AbstractService - implements MountTableManager { + implements MountTableManager, RouterStateManager { private static final Logger LOG = LoggerFactory.getLogger(RouterAdminServer.class); @@ -212,6 +218,44 @@ public class RouterAdminServer extends AbstractService return getMountTableStore().getMountTableEntries(request); } + @Override + public EnterSafeModeResponse enterSafeMode(EnterSafeModeRequest request) + throws IOException { + this.router.updateRouterState(RouterServiceState.SAFEMODE); + this.router.getRpcServer().setSafeMode(true); + return EnterSafeModeResponse.newInstance(verifySafeMode(true)); + } + + @Override + public LeaveSafeModeResponse leaveSafeMode(LeaveSafeModeRequest request) + throws IOException { + this.router.updateRouterState(RouterServiceState.RUNNING); + this.router.getRpcServer().setSafeMode(false); + return LeaveSafeModeResponse.newInstance(verifySafeMode(false)); + } + + @Override + public GetSafeModeResponse getSafeMode(GetSafeModeRequest request) + throws IOException { + boolean isInSafeMode = this.router.getRpcServer().isInSafeMode(); + return GetSafeModeResponse.newInstance(isInSafeMode); + } + + /** + * Verify if Router set safe mode state correctly. + * @param isInSafeMode Expected state to be set. + * @return + */ + private boolean verifySafeMode(boolean isInSafeMode) { + boolean serverInSafeMode = this.router.getRpcServer().isInSafeMode(); + RouterServiceState currentState = this.router.getRouterState(); + + return (isInSafeMode && currentState == RouterServiceState.SAFEMODE + && serverInSafeMode) + || (!isInSafeMode && currentState != RouterServiceState.SAFEMODE + && !serverInSafeMode); + } + /** * Get a new permission checker used for making mount table access * control. This method will be invoked during each RPC call in router http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClient.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClient.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClient.java index 1f76b98..b36e459 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClient.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClient.java @@ -69,6 +69,10 @@ public class RouterClient implements Closeable { return proxy; } + public RouterStateManager getRouterStateManager() { + return proxy; + } + @Override public synchronized void close() throws IOException { RPC.stopProxy(proxy); http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterStateManager.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterStateManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterStateManager.java new file mode 100644 index 0000000..527600c --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterStateManager.java @@ -0,0 +1,50 @@ +/** + * 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.federation.router; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeResponse; + +/** + * Interface of managing the Router state. + */ +public interface RouterStateManager { + /** + * Enter safe mode and change Router state to RouterServiceState#SAFEMODE. + */ + EnterSafeModeResponse enterSafeMode(EnterSafeModeRequest request) + throws IOException; + + /** + * Leave safe mode and change Router state to RouterServiceState#RUNNING. + */ + LeaveSafeModeResponse leaveSafeMode(LeaveSafeModeRequest request) + throws IOException; + + /** + * Verify if current Router state is safe mode. + */ + GetSafeModeResponse getSafeMode(GetSafeModeRequest request) + throws IOException; +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeRequest.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeRequest.java new file mode 100644 index 0000000..89df1bb --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeRequest.java @@ -0,0 +1,32 @@ +/** + * 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.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API request for the Router entering safe mode state and updating + * its state in State Store. + */ +public abstract class EnterSafeModeRequest { + public static EnterSafeModeRequest newInstance() throws IOException { + return StateStoreSerializer.newRecord(EnterSafeModeRequest.class); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeResponse.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeResponse.java new file mode 100644 index 0000000..4c994f6 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/EnterSafeModeResponse.java @@ -0,0 +1,50 @@ +/** + * 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.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API response for the Router entering safe mode state and updating + * its state in State Store. + */ +public abstract class EnterSafeModeResponse { + + public static EnterSafeModeResponse newInstance() throws IOException { + return StateStoreSerializer.newRecord(EnterSafeModeResponse.class); + } + + public static EnterSafeModeResponse newInstance(boolean status) + throws IOException { + EnterSafeModeResponse response = newInstance(); + response.setStatus(status); + return response; + } + + @Public + @Unstable + public abstract boolean getStatus(); + + @Public + @Unstable + public abstract void setStatus(boolean result); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeRequest.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeRequest.java new file mode 100644 index 0000000..00a8986 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeRequest.java @@ -0,0 +1,31 @@ +/** + * 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.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API request for verifying if current Router state is safe mode. + */ +public abstract class GetSafeModeRequest { + public static GetSafeModeRequest newInstance() throws IOException { + return StateStoreSerializer.newRecord(GetSafeModeRequest.class); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeResponse.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeResponse.java new file mode 100644 index 0000000..0d7e229 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/GetSafeModeResponse.java @@ -0,0 +1,49 @@ +/** + * 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.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API response for verifying if current Router state is safe mode. + */ +public abstract class GetSafeModeResponse { + + public static GetSafeModeResponse newInstance() throws IOException { + return StateStoreSerializer.newRecord(GetSafeModeResponse.class); + } + + public static GetSafeModeResponse newInstance(boolean isInSafeMode) + throws IOException { + GetSafeModeResponse response = newInstance(); + response.setSafeMode(isInSafeMode); + return response; + } + + @Public + @Unstable + public abstract boolean isInSafeMode(); + + @Public + @Unstable + public abstract void setSafeMode(boolean isInSafeMode); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeRequest.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeRequest.java new file mode 100644 index 0000000..2d64a1e --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeRequest.java @@ -0,0 +1,32 @@ +/** + * 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.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API request for the Router leaving safe mode state and updating + * its state in State Store. + */ +public abstract class LeaveSafeModeRequest { + public static LeaveSafeModeRequest newInstance() throws IOException { + return StateStoreSerializer.newRecord(LeaveSafeModeRequest.class); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeResponse.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeResponse.java new file mode 100644 index 0000000..555f4fd --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/LeaveSafeModeResponse.java @@ -0,0 +1,50 @@ +/** + * 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.federation.store.protocol; + +import java.io.IOException; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.hdfs.server.federation.store.driver.StateStoreSerializer; + +/** + * API response for the Router leaving safe mode state and updating + * its state in State Store. + */ +public abstract class LeaveSafeModeResponse { + + public static LeaveSafeModeResponse newInstance() throws IOException { + return StateStoreSerializer.newRecord(LeaveSafeModeResponse.class); + } + + public static LeaveSafeModeResponse newInstance(boolean status) + throws IOException { + LeaveSafeModeResponse response = newInstance(); + response.setStatus(status); + return response; + } + + @Public + @Unstable + public abstract boolean getStatus(); + + @Public + @Unstable + public abstract void setStatus(boolean result); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeRequestPBImpl.java new file mode 100644 index 0000000..50e14af --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeRequestPBImpl.java @@ -0,0 +1,62 @@ +/** + * 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.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetRouterRegistrationResponseProto.Builder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * EnterSafeModeRequest. + */ +public class EnterSafeModeRequestPBImpl extends EnterSafeModeRequest + implements PBRecord { + + private FederationProtocolPBTranslator<EnterSafeModeRequestProto, + Builder, EnterSafeModeRequestProtoOrBuilder> translator = + new FederationProtocolPBTranslator<>(EnterSafeModeRequestProto.class); + + public EnterSafeModeRequestPBImpl() { + } + + public EnterSafeModeRequestPBImpl(EnterSafeModeRequestProto proto) { + this.translator.setProto(proto); + } + + @Override + public EnterSafeModeRequestProto getProto() { + return translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeResponsePBImpl.java new file mode 100644 index 0000000..9805821 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/EnterSafeModeResponsePBImpl.java @@ -0,0 +1,73 @@ +/** + * 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.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeResponseProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.EnterSafeModeResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * EnterSafeModeResponse. + */ +public class EnterSafeModeResponsePBImpl extends EnterSafeModeResponse + implements PBRecord { + + private FederationProtocolPBTranslator<EnterSafeModeResponseProto, + Builder, EnterSafeModeResponseProtoOrBuilder> translator = + new FederationProtocolPBTranslator<>( + EnterSafeModeResponseProto.class); + + public EnterSafeModeResponsePBImpl() { + } + + public EnterSafeModeResponsePBImpl(EnterSafeModeResponseProto proto) { + this.translator.setProto(proto); + } + + @Override + public EnterSafeModeResponseProto getProto() { + return translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public boolean getStatus() { + return this.translator.getProtoOrBuilder().getStatus(); + } + + @Override + public void setStatus(boolean result) { + this.translator.getBuilder().setStatus(result); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeRequestPBImpl.java new file mode 100644 index 0000000..1a4f63b --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeRequestPBImpl.java @@ -0,0 +1,62 @@ +/** + * 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.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeRequestProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * GetSafeModeRequest. + */ +public class GetSafeModeRequestPBImpl extends GetSafeModeRequest + implements PBRecord { + + private FederationProtocolPBTranslator<GetSafeModeRequestProto, + Builder, GetSafeModeRequestProtoOrBuilder> translator = + new FederationProtocolPBTranslator<>(GetSafeModeRequestProto.class); + + public GetSafeModeRequestPBImpl() { + } + + public GetSafeModeRequestPBImpl(GetSafeModeRequestProto proto) { + this.translator.setProto(proto); + } + + @Override + public GetSafeModeRequestProto getProto() { + return translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeResponsePBImpl.java new file mode 100644 index 0000000..77fbeca --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/GetSafeModeResponsePBImpl.java @@ -0,0 +1,73 @@ +/** + * 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.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeResponseProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.GetSafeModeResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * GetSafeModeResponse. + */ +public class GetSafeModeResponsePBImpl extends GetSafeModeResponse + implements PBRecord { + + private FederationProtocolPBTranslator<GetSafeModeResponseProto, + Builder, GetSafeModeResponseProtoOrBuilder> translator = + new FederationProtocolPBTranslator<>( + GetSafeModeResponseProto.class); + + public GetSafeModeResponsePBImpl() { + } + + public GetSafeModeResponsePBImpl(GetSafeModeResponseProto proto) { + this.translator.setProto(proto); + } + + @Override + public GetSafeModeResponseProto getProto() { + return translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public boolean isInSafeMode() { + return this.translator.getProtoOrBuilder().getIsInSafeMode(); + } + + @Override + public void setSafeMode(boolean isInSafeMode) { + this.translator.getBuilder().setIsInSafeMode(isInSafeMode); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeRequestPBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeRequestPBImpl.java new file mode 100644 index 0000000..075099b --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeRequestPBImpl.java @@ -0,0 +1,62 @@ +/** + * 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.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeRequestProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeRequestProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeRequestProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * LeaveSafeModeRequest. + */ +public class LeaveSafeModeRequestPBImpl extends LeaveSafeModeRequest + implements PBRecord { + + private FederationProtocolPBTranslator<LeaveSafeModeRequestProto, + Builder, LeaveSafeModeRequestProtoOrBuilder> translator = + new FederationProtocolPBTranslator<>(LeaveSafeModeRequestProto.class); + + public LeaveSafeModeRequestPBImpl() { + } + + public LeaveSafeModeRequestPBImpl(LeaveSafeModeRequestProto proto) { + this.translator.setProto(proto); + } + + @Override + public LeaveSafeModeRequestProto getProto() { + return translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeResponsePBImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeResponsePBImpl.java new file mode 100644 index 0000000..79f65fe --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/store/protocol/impl/pb/LeaveSafeModeResponsePBImpl.java @@ -0,0 +1,73 @@ +/** + * 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.federation.store.protocol.impl.pb; + +import java.io.IOException; + +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeResponseProto; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeResponseProto.Builder; +import org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos.LeaveSafeModeResponseProtoOrBuilder; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.records.impl.pb.PBRecord; + +import com.google.protobuf.Message; + +/** + * Protobuf implementation of the state store API object + * LeaveSafeModeResponse. + */ +public class LeaveSafeModeResponsePBImpl extends LeaveSafeModeResponse + implements PBRecord { + + private FederationProtocolPBTranslator<LeaveSafeModeResponseProto, + Builder, LeaveSafeModeResponseProtoOrBuilder> translator = + new FederationProtocolPBTranslator<>( + LeaveSafeModeResponseProto.class); + + public LeaveSafeModeResponsePBImpl() { + } + + public LeaveSafeModeResponsePBImpl(LeaveSafeModeResponseProto proto) { + this.translator.setProto(proto); + } + + @Override + public LeaveSafeModeResponseProto getProto() { + return translator.build(); + } + + @Override + public void setProto(Message proto) { + this.translator.setProto(proto); + } + + @Override + public void readInstance(String base64String) throws IOException { + this.translator.readInstance(base64String); + } + + @Override + public boolean getStatus() { + return this.translator.getProtoOrBuilder().getStatus(); + } + + @Override + public void setStatus(boolean result) { + this.translator.getBuilder().setStatus(result); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java index 398288d..8e9c7af 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java @@ -35,10 +35,17 @@ import org.apache.hadoop.hdfs.server.federation.resolver.RemoteLocation; import org.apache.hadoop.hdfs.server.federation.resolver.order.DestinationOrder; import org.apache.hadoop.hdfs.server.federation.router.RouterClient; import org.apache.hadoop.hdfs.server.federation.router.RouterQuotaUsage; +import org.apache.hadoop.hdfs.server.federation.router.RouterStateManager; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.AddMountTableEntryResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.EnterSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.GetSafeModeResponse; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeRequest; +import org.apache.hadoop.hdfs.server.federation.store.protocol.LeaveSafeModeResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryRequest; import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryResponse; import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryRequest; @@ -86,7 +93,9 @@ public class RouterAdmin extends Configured implements Tool { + "\t[-ls <path>]\n" + "\t[-setQuota <path> -nsQuota <nsQuota> -ssQuota " + "<quota in bytes or quota size string>]\n" - + "\t[-clrQuota <path>\n"; + + "\t[-clrQuota <path>]\n" + + "\t[-safemode enter | leave | get]\n"; + System.out.println(usage); } @@ -127,6 +136,12 @@ public class RouterAdmin extends Configured implements Tool { printUsage(); return exitCode; } + } else if ("-safemode".equalsIgnoreCase(cmd)) { + if (argv.length < 2) { + System.err.println("Not enough parameters specificed for cmd " + cmd); + printUsage(); + return exitCode; + } } // Initialize RouterClient @@ -172,6 +187,8 @@ public class RouterAdmin extends Configured implements Tool { System.out.println( "Successfully clear quota for mount point " + argv[i]); } + } else if ("-safemode".equals(cmd)) { + manageSafeMode(argv[i]); } else { printUsage(); return exitCode; @@ -525,6 +542,62 @@ public class RouterAdmin extends Configured implements Tool { } /** + * Manager the safe mode state. + * @param cmd Input command, enter or leave safe mode. + * @throws IOException + */ + private void manageSafeMode(String cmd) throws IOException { + if (cmd.equals("enter")) { + if (enterSafeMode()) { + System.out.println("Successfully enter safe mode."); + } + } else if (cmd.equals("leave")) { + if (leaveSafeMode()) { + System.out.println("Successfully leave safe mode."); + } + } else if (cmd.equals("get")) { + boolean result = getSafeMode(); + System.out.println("Safe Mode: " + result); + } + } + + /** + * Request the Router entering safemode state. + * @return Return true if entering safemode successfully. + * @throws IOException + */ + private boolean enterSafeMode() throws IOException { + RouterStateManager stateManager = client.getRouterStateManager(); + EnterSafeModeResponse response = stateManager.enterSafeMode( + EnterSafeModeRequest.newInstance()); + return response.getStatus(); + } + + /** + * Request the Router leaving safemode state. + * @return Return true if leaving safemode successfully. + * @throws IOException + */ + private boolean leaveSafeMode() throws IOException { + RouterStateManager stateManager = client.getRouterStateManager(); + LeaveSafeModeResponse response = stateManager.leaveSafeMode( + LeaveSafeModeRequest.newInstance()); + return response.getStatus(); + } + + /** + * Verify if current Router state is safe mode state. + * @return True if the Router is in safe mode. + * @throws IOException + */ + private boolean getSafeMode() throws IOException { + RouterStateManager stateManager = client.getRouterStateManager(); + GetSafeModeResponse response = stateManager.getSafeMode( + GetSafeModeRequest.newInstance()); + return response.isInSafeMode(); + } + + /** * Inner class that stores ACL info of mount table. */ static class ACLEntity { http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto index 97dd192..15985d2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/FederationProtocol.proto @@ -214,4 +214,29 @@ message RouterHeartbeatRequestProto { message RouterHeartbeatResponseProto { optional bool status = 1; +} + +///////////////////////////////////////////////// +// Route State +///////////////////////////////////////////////// + +message EnterSafeModeRequestProto { +} + +message EnterSafeModeResponseProto { + optional bool status = 1; +} + +message LeaveSafeModeRequestProto { +} + +message LeaveSafeModeResponseProto { + optional bool status = 1; +} + +message GetSafeModeRequestProto { +} + +message GetSafeModeResponseProto { + optional bool isInSafeMode = 1; } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/RouterProtocol.proto ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/RouterProtocol.proto b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/RouterProtocol.proto index 3f43040..a4e4d65 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/RouterProtocol.proto +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/RouterProtocol.proto @@ -44,4 +44,19 @@ service RouterAdminProtocolService { * Get matching mount entries */ rpc getMountTableEntries(GetMountTableEntriesRequestProto) returns(GetMountTableEntriesResponseProto); + + /** + * Transform Router state to safe mode state. + */ + rpc enterSafeMode(EnterSafeModeRequestProto) returns (EnterSafeModeResponseProto); + + /** + * Transform Router state from safe mode to running state. + */ + rpc leaveSafeMode(LeaveSafeModeRequestProto) returns (LeaveSafeModeResponseProto); + + /** + * Verify if current Router state is safe mode state. + */ + rpc getSafeMode(GetSafeModeRequestProto) returns (GetSafeModeResponseProto); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSCommands.md ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSCommands.md b/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSCommands.md index 1291ca7..0bada59 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSCommands.md +++ b/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSCommands.md @@ -414,6 +414,7 @@ Usage: [-ls <path>] [-setQuota <path> -nsQuota <nsQuota> -ssQuota <quota in bytes or quota size string>] [-clrQuota <path>] + [-safemode enter | leave | get] | COMMAND\_OPTION | Description | |:---- |:---- | @@ -422,6 +423,7 @@ Usage: | `-ls` *path* | List mount points under specified path. | | `-setQuota` *path* `-nsQuota` *nsQuota* `-ssQuota` *ssQuota* | Set quota for specified path. See [HDFS Quotas Guide](./HdfsQuotaAdminGuide.html) for the quota detail. | | `-clrQuota` *path* | Clear quota of given mount point. See [HDFS Quotas Guide](./HdfsQuotaAdminGuide.html) for the quota detail. | +| `-safemode` `enter` `leave` `get` | Manually set the Router entering or leaving safe mode. The option *get* will be used for verifying if the Router is in safe mode state. | The commands for managing Router-based federation. See [Mount table management](./HDFSRouterFederation.html#Mount_table_management) for more info. http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSRouterFederation.md ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSRouterFederation.md b/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSRouterFederation.md index b5fbcc4..5649755 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSRouterFederation.md +++ b/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/HDFSRouterFederation.md @@ -83,7 +83,11 @@ The clients configure their DFS HA client (e.g., ConfiguredFailoverProvider or R * **Unavailable State Store:** If a Router cannot contact the State Store, it will enter into a Safe Mode state which disallows it from serving requests. -Clients will treat Routers in Safe Mode as it was an Standby NameNode and try another Router. +Clients will treat Routers in Safe Mode as it was an Standby NameNode and try another Router. There is a manual way to manage the Safe Mode for the Router. + +The Safe Mode state can be managed by using the following command: + + [hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -safemode enter | leave | get * **NameNode heartbeat HA:** For high availability and flexibility, multiple Routers can monitor the same NameNode and heartbeat the information to the State Store. http://git-wip-us.apache.org/repos/asf/hadoop/blob/7cd3770f/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java index 265fcde..ce6e43a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java @@ -40,12 +40,15 @@ import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntr import org.apache.hadoop.hdfs.server.federation.store.records.MountTable; import org.apache.hadoop.hdfs.tools.federation.RouterAdmin; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.util.ToolRunner; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; + +import com.google.common.base.Supplier; /** * Tests Router admin commands. */ @@ -363,4 +366,49 @@ public class TestRouterAdminCLI { assertEquals(HdfsConstants.QUOTA_DONT_SET, quotaUsage.getQuota()); assertEquals(HdfsConstants.QUOTA_DONT_SET, quotaUsage.getSpaceQuota()); } + + @Test + public void testManageSafeMode() throws Exception { + // ensure the Router become RUNNING state + waitState(RouterServiceState.RUNNING); + assertFalse(routerContext.getRouter().getRpcServer().isInSafeMode()); + assertEquals(0, ToolRunner.run(admin, + new String[] {"-safemode", "enter"})); + // verify state + assertEquals(RouterServiceState.SAFEMODE, + routerContext.getRouter().getRouterState()); + assertTrue(routerContext.getRouter().getRpcServer().isInSafeMode()); + + System.setOut(new PrintStream(out)); + assertEquals(0, ToolRunner.run(admin, + new String[] {"-safemode", "get"})); + assertTrue(out.toString().contains("true")); + + assertEquals(0, ToolRunner.run(admin, + new String[] {"-safemode", "leave"})); + // verify state + assertEquals(RouterServiceState.RUNNING, + routerContext.getRouter().getRouterState()); + assertFalse(routerContext.getRouter().getRpcServer().isInSafeMode()); + + out.reset(); + assertEquals(0, ToolRunner.run(admin, + new String[] {"-safemode", "get"})); + assertTrue(out.toString().contains("false")); + } + + /** + * Wait for the Router transforming to expected state. + * @param expectedState Expected Router state. + * @throws Exception + */ + private void waitState(final RouterServiceState expectedState) + throws Exception { + GenericTestUtils.waitFor(new Supplier<Boolean>() { + @Override + public Boolean get() { + return expectedState == routerContext.getRouter().getRouterState(); + } + }, 1000, 30000); + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org