diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java index 00e1dfc..07ace0c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java @@ -24,6 +24,9 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import javax.crypto.SecretKey; @@ -86,6 +89,8 @@ protected static final String VERSION_NODE = "RMVersionNode"; protected static final String EPOCH_NODE = "EpochNode"; private ResourceManager resourceManager; + private final ReadLock readLock; + private final WriteLock writeLock; public static final Log LOG = LogFactory.getLog(RMStateStore.class); @@ -113,6 +118,24 @@ RMStateStoreEventType.STORE_APP_ATTEMPT, new StoreAppAttemptTransition()) .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, RMStateStoreEventType.UPDATE_APP_ATTEMPT, new UpdateAppAttemptTransition()) + .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, + RMStateStoreEventType.STORE_MASTERKEY, + new StoreRMDTMasterKeyTransition()) + .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, + RMStateStoreEventType.REMOVE_MASTERKEY, + new RemoveRMDTMasterKeyTransition()) + .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, + RMStateStoreEventType.STORE_DELEGATION_TOKEN, + new StoreRMDTTransition()) + .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, + RMStateStoreEventType.REMOVE_DELEGATION_TOKEN, + new RemoveRMDTTransition()) + .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, + RMStateStoreEventType.UPDATE_DELEGATION_TOKEN, + new UpdateRMDTTransition()) + .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.ACTIVE, + RMStateStoreEventType.UPDATE_AMRM_TOKEN, + new StoreOrUpdateAMRMTokenTransition()) .addTransition(RMStateStoreState.ACTIVE, RMStateStoreState.FENCED, RMStateStoreEventType.FENCED) .addTransition(RMStateStoreState.FENCED, RMStateStoreState.FENCED, @@ -122,7 +145,13 @@ RMStateStoreEventType.REMOVE_APP, RMStateStoreEventType.STORE_APP_ATTEMPT, RMStateStoreEventType.UPDATE_APP_ATTEMPT, - RMStateStoreEventType.FENCED)); + RMStateStoreEventType.FENCED, + RMStateStoreEventType.STORE_MASTERKEY, + RMStateStoreEventType.REMOVE_MASTERKEY, + RMStateStoreEventType.STORE_DELEGATION_TOKEN, + RMStateStoreEventType.REMOVE_DELEGATION_TOKEN, + RMStateStoreEventType.UPDATE_DELEGATION_TOKEN, + RMStateStoreEventType.UPDATE_AMRM_TOKEN)); private final StateMachine { + @Override + public void transition(RMStateStore store, RMStateStoreEvent event) { + if (!(event instanceof RMStateStoreRMDTEvent)) { + // should never happen + LOG.error("Illegal event type: " + event.getClass()); + return; + } + RMStateStoreRMDTEvent dtEvent = (RMStateStoreRMDTEvent) event; + try { + LOG.info("Storing RMDelegationToken and SequenceNumber"); + store.storeRMDelegationTokenAndSequenceNumberState( + dtEvent.getRmDTIdentifier(), dtEvent.getRenewDate(), + dtEvent.getLatestSequenceNumber()); + } catch (Exception e) { + LOG.error("Error While Storing RMDelegationToken and SequenceNumber ", + e); + store.notifyStoreOperationFailed(e); + } + } + } + + private static class RemoveRMDTTransition implements + SingleArcTransition { + @Override + public void transition(RMStateStore store, RMStateStoreEvent event) { + if (!(event instanceof RMStateStoreRMDTEvent)) { + // should never happen + LOG.error("Illegal event type: " + event.getClass()); + return; + } + RMStateStoreRMDTEvent dtEvent = (RMStateStoreRMDTEvent) event; + try { + LOG.info("Removing RMDelegationToken and SequenceNumber"); + store.removeRMDelegationTokenState(dtEvent.getRmDTIdentifier()); + } catch (Exception e) { + LOG.error("Error While Removing RMDelegationToken and SequenceNumber ", + e); + store.notifyStoreOperationFailed(e); + } + } + } + + private static class UpdateRMDTTransition implements + SingleArcTransition { + @Override + public void transition(RMStateStore store, RMStateStoreEvent event) { + if (!(event instanceof RMStateStoreRMDTEvent)) { + // should never happen + LOG.error("Illegal event type: " + event.getClass()); + return; + } + + RMStateStoreRMDTEvent dtEvent = (RMStateStoreRMDTEvent) event; + try { + LOG.info("Updating RMDelegationToken and SequenceNumber"); + store.updateRMDelegationTokenAndSequenceNumberInternal( + dtEvent.getRmDTIdentifier(), dtEvent.getRenewDate(), + dtEvent.getLatestSequenceNumber()); + } catch (Exception e) { + LOG.error("Error While Updating RMDelegationToken and SequenceNumber ", + e); + store.notifyStoreOperationFailed(e); + } + } + } + + private static class StoreRMDTMasterKeyTransition implements + SingleArcTransition { + @Override + public void transition(RMStateStore store, RMStateStoreEvent event) { + if (!(event instanceof RMStateStoreRMDTMasterKeyEvent)) { + // should never happen + LOG.error("Illegal event type: " + event.getClass()); + return; + } + RMStateStoreRMDTMasterKeyEvent dtEvent = + (RMStateStoreRMDTMasterKeyEvent) event; + try { + LOG.info("Storing RMDTMasterKey."); + store.storeRMDTMasterKeyState(dtEvent.getDelegationKey()); + } catch (Exception e) { + LOG.error("Error While Storing RMDTMasterKey.", e); + store.notifyStoreOperationFailed(e); + } + } + } + + private static class RemoveRMDTMasterKeyTransition implements + SingleArcTransition { + @Override + public void transition(RMStateStore store, RMStateStoreEvent event) { + if (!(event instanceof RMStateStoreRMDTMasterKeyEvent)) { + // should never happen + LOG.error("Illegal event type: " + event.getClass()); + return; + } + RMStateStoreRMDTMasterKeyEvent dtEvent = + (RMStateStoreRMDTMasterKeyEvent) event; + try { + LOG.info("Removing RMDTMasterKey."); + store.removeRMDTMasterKeyState(dtEvent.getDelegationKey()); + } catch (Exception e) { + LOG.error("Error While Removing RMDTMasterKey.", e); + store.notifyStoreOperationFailed(e); + } + } + } + + private static class StoreOrUpdateAMRMTokenTransition implements + SingleArcTransition { + @Override + public void transition(RMStateStore store, RMStateStoreEvent event) { + if (!(event instanceof RMStateStoreAMRMTokenEvent)) { + // should never happen + LOG.error("Illegal event type: " + event.getClass()); + return; + } + RMStateStoreAMRMTokenEvent amrmEvent = (RMStateStoreAMRMTokenEvent) event; + + try { + LOG.info("Updating AMRMToken"); + store.storeOrUpdateAMRMTokenSecretManagerState( + amrmEvent.getAmrmTokenSecretManagerState(), amrmEvent.isUpdate()); + } catch (Exception e) { + LOG.error("Error While Updating AMRMToken.", e); + store.notifyStoreOperationFailed(e); + } + } + } + public RMStateStore() { super(RMStateStore.class.getName()); + ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + this.readLock = lock.readLock(); + this.writeLock = lock.writeLock(); stateMachine = stateMachineFactory.make(this); } @@ -445,9 +609,18 @@ public synchronized void updateApplicationState( dispatcher.getEventHandler().handle(new RMStateUpdateAppEvent(appState)); } - public synchronized void updateFencedState() { - this.stateMachine.doTransition(RMStateStoreEventType.FENCED, - new RMStateStoreEvent(RMStateStoreEventType.FENCED)); + public void updateFencedState() { + this.writeLock.lock(); + try { + if (isFencedState()) { + LOG.info("State store is already in Fenced state."); + return; + } + this.stateMachine.doTransition(RMStateStoreEventType.FENCED, + new RMStateStoreEvent(RMStateStoreEventType.FENCED)); + } finally { + this.writeLock.unlock(); + } } /** @@ -509,18 +682,22 @@ protected abstract void updateApplicationAttemptStateInternal( * RMDTSecretManager call this to store the state of a delegation token * and sequence number */ - public synchronized void storeRMDelegationTokenAndSequenceNumber( + public void storeRMDelegationTokenAndSequenceNumber( RMDelegationTokenIdentifier rmDTIdentifier, Long renewDate, int latestSequenceNumber) { - if(isFencedState()) { - LOG.info("State store is in Fenced state. Can't store RM Delegation Token."); - return; - } + this.writeLock.lock(); try { - storeRMDelegationTokenAndSequenceNumberState(rmDTIdentifier, renewDate, - latestSequenceNumber); - } catch (Exception e) { - notifyStoreOperationFailed(e); + if (isFencedState()) { + LOG.info("State store is in Fenced state. Can't store RM Delegation Token."); + return; + } + this.stateMachine.doTransition( + RMStateStoreEventType.STORE_DELEGATION_TOKEN, + new RMStateStoreRMDTEvent(rmDTIdentifier, renewDate, + latestSequenceNumber, + RMStateStoreEventType.STORE_DELEGATION_TOKEN)); + } finally { + this.writeLock.unlock(); } } @@ -536,16 +713,20 @@ protected abstract void storeRMDelegationTokenAndSequenceNumberState( /** * RMDTSecretManager call this to remove the state of a delegation token */ - public synchronized void removeRMDelegationToken( + public void removeRMDelegationToken( RMDelegationTokenIdentifier rmDTIdentifier, int sequenceNumber) { - if(isFencedState()) { - LOG.info("State store is in Fenced state. Can't remove RM Delegation Token."); - return; - } + this.writeLock.lock(); try { - removeRMDelegationTokenState(rmDTIdentifier); - } catch (Exception e) { - notifyStoreOperationFailed(e); + if (isFencedState()) { + LOG.info("State store is in Fenced state. Can't remove RM Delegation Token."); + return; + } + this.stateMachine.doTransition( + RMStateStoreEventType.REMOVE_DELEGATION_TOKEN, + new RMStateStoreRMDTEvent(rmDTIdentifier, null, sequenceNumber, + RMStateStoreEventType.REMOVE_DELEGATION_TOKEN)); + } finally { + this.writeLock.unlock(); } } @@ -560,18 +741,22 @@ protected abstract void removeRMDelegationTokenState( * RMDTSecretManager call this to update the state of a delegation token * and sequence number */ - public synchronized void updateRMDelegationTokenAndSequenceNumber( + public void updateRMDelegationTokenAndSequenceNumber( RMDelegationTokenIdentifier rmDTIdentifier, Long renewDate, int latestSequenceNumber) { - if(isFencedState()) { - LOG.info("State store is in Fenced state. Can't update RM Delegation Token."); - return; - } + this.writeLock.lock(); try { - updateRMDelegationTokenAndSequenceNumberInternal(rmDTIdentifier, renewDate, - latestSequenceNumber); - } catch (Exception e) { - notifyStoreOperationFailed(e); + if (isFencedState()) { + LOG.info("State store is in Fenced state. Can't update RM Delegation Token."); + return; + } + this.stateMachine.doTransition( + RMStateStoreEventType.UPDATE_DELEGATION_TOKEN, + new RMStateStoreRMDTEvent(rmDTIdentifier, renewDate, + latestSequenceNumber, + RMStateStoreEventType.UPDATE_DELEGATION_TOKEN)); + } finally { + this.writeLock.unlock(); } } @@ -587,16 +772,19 @@ protected abstract void updateRMDelegationTokenAndSequenceNumberInternal( /** * RMDTSecretManager call this to store the state of a master key */ - public synchronized void storeRMDTMasterKey(DelegationKey delegationKey) { - if(isFencedState()) { - LOG.info("State store is in Fenced state. Can't store RM Delegation " + - "Token Master key."); - return; - } + public void storeRMDTMasterKey(DelegationKey delegationKey) { + this.writeLock.lock(); try { - storeRMDTMasterKeyState(delegationKey); - } catch (Exception e) { - notifyStoreOperationFailed(e); + if (isFencedState()) { + LOG.info("State store is in Fenced state. Can't store RM Delegation " + + "Token Master key."); + return; + } + this.stateMachine.doTransition(RMStateStoreEventType.STORE_MASTERKEY, + new RMStateStoreRMDTMasterKeyEvent(delegationKey, + RMStateStoreEventType.STORE_MASTERKEY)); + } finally { + this.writeLock.unlock(); } } @@ -611,16 +799,19 @@ protected abstract void storeRMDTMasterKeyState(DelegationKey delegationKey) /** * RMDTSecretManager call this to remove the state of a master key */ - public synchronized void removeRMDTMasterKey(DelegationKey delegationKey) { - if(isFencedState()) { - LOG.info("State store is in Fenced state. Can't remove RM Delegation " + - "Token Master key."); - return; - } + public void removeRMDTMasterKey(DelegationKey delegationKey) { + this.writeLock.lock(); try { - removeRMDTMasterKeyState(delegationKey); - } catch (Exception e) { - notifyStoreOperationFailed(e); + if (isFencedState()) { + LOG.info("State store is in Fenced state. Can't remove RM Delegation " + + "Token Master key."); + return; + } + this.stateMachine.doTransition(RMStateStoreEventType.REMOVE_MASTERKEY, + new RMStateStoreRMDTMasterKeyEvent(delegationKey, + RMStateStoreEventType.REMOVE_MASTERKEY)); + } finally { + this.writeLock.unlock(); } } @@ -636,9 +827,29 @@ protected abstract void removeRMDTMasterKeyState(DelegationKey delegationKey) * Blocking API Derived classes must implement this method to store or update * the state of AMRMToken Master Key */ - public abstract void storeOrUpdateAMRMTokenSecretManagerState( - AMRMTokenSecretManagerState amrmTokenSecretManagerState, - boolean isUpdate); + protected abstract void storeOrUpdateAMRMTokenSecretManagerState( + AMRMTokenSecretManagerState amrmTokenSecretManagerState, boolean isUpdate) + throws Exception; + + /** + * Store or Update state of AMRMToken Master Key + */ + public void storeOrUpdateAMRMTokenSecretManager( + AMRMTokenSecretManagerState amrmTokenSecretManagerState, boolean isUpdate) { + this.writeLock.lock(); + try { + if (isFencedState()) { + LOG.info("State store is in Fenced state. Can't remove RM Delegation " + + "Token Master key."); + return; + } + this.stateMachine.doTransition(RMStateStoreEventType.UPDATE_AMRM_TOKEN, + new RMStateStoreAMRMTokenEvent(amrmTokenSecretManagerState, isUpdate, + RMStateStoreEventType.UPDATE_AMRM_TOKEN)); + } finally { + this.writeLock.unlock(); + } + } /** * Non-blocking API @@ -689,16 +900,19 @@ public Credentials getCredentialsFromAppAttempt(RMAppAttempt appAttempt) { } @VisibleForTesting - synchronized boolean isFencedState() { - return (RMStateStoreState.FENCED == this.stateMachine.getCurrentState()); + protected boolean isFencedState() { + return (RMStateStoreState.FENCED == getRMStateStoreState()); } // Dispatcher related code protected void handleStoreEvent(RMStateStoreEvent event) { + this.writeLock.lock(); try { this.stateMachine.doTransition(event.getType(), event); } catch (InvalidStateTransitonException e) { LOG.error("Can't handle this event at current state", e); + } finally { + this.writeLock.unlock(); } } @@ -772,4 +986,13 @@ public void run() { resourceManager.handleTransitionToStandBy(); } } + + public RMStateStoreState getRMStateStoreState() { + this.readLock.lock(); + try { + return this.stateMachine.getCurrentState(); + } finally { + this.readLock.unlock(); + } + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreAMRMTokenEvent.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreAMRMTokenEvent.java new file mode 100644 index 0000000..befec06 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreAMRMTokenEvent.java @@ -0,0 +1,46 @@ +/** + * 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.yarn.server.resourcemanager.recovery; + +import org.apache.hadoop.yarn.server.resourcemanager.recovery.records.AMRMTokenSecretManagerState; + +public class RMStateStoreAMRMTokenEvent extends RMStateStoreEvent { + private AMRMTokenSecretManagerState amrmTokenSecretManagerState; + private boolean isUpdate; + + public RMStateStoreAMRMTokenEvent(RMStateStoreEventType type) { + super(type); + } + + public RMStateStoreAMRMTokenEvent( + AMRMTokenSecretManagerState amrmTokenSecretManagerState, + boolean isUpdate, RMStateStoreEventType type) { + this(type); + this.amrmTokenSecretManagerState = amrmTokenSecretManagerState; + this.isUpdate = isUpdate; + } + + public AMRMTokenSecretManagerState getAmrmTokenSecretManagerState() { + return amrmTokenSecretManagerState; + } + + public boolean isUpdate() { + return isUpdate; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreEventType.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreEventType.java index 9301bf9..ff2d6fa 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreEventType.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreEventType.java @@ -24,5 +24,13 @@ UPDATE_APP, UPDATE_APP_ATTEMPT, REMOVE_APP, - FENCED + FENCED, + + // Below events should be called synchronously + STORE_MASTERKEY, + REMOVE_MASTERKEY, + STORE_DELEGATION_TOKEN, + REMOVE_DELEGATION_TOKEN, + UPDATE_DELEGATION_TOKEN, + UPDATE_AMRM_TOKEN, } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRMDTEvent.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRMDTEvent.java new file mode 100644 index 0000000..4cd4d2e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRMDTEvent.java @@ -0,0 +1,51 @@ +/** + * 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.yarn.server.resourcemanager.recovery; + +import org.apache.hadoop.yarn.security.client.RMDelegationTokenIdentifier; + +public class RMStateStoreRMDTEvent extends RMStateStoreEvent { + private RMDelegationTokenIdentifier rmDTIdentifier; + private Long renewDate; + private int latestSequenceNumber; + + public RMStateStoreRMDTEvent(RMStateStoreEventType type) { + super(type); + } + + public RMStateStoreRMDTEvent(RMDelegationTokenIdentifier rmDTIdentifier, + Long renewDate, int latestSequenceNumber, RMStateStoreEventType type) { + this(type); + this.rmDTIdentifier = rmDTIdentifier; + this.renewDate = renewDate; + this.latestSequenceNumber = latestSequenceNumber; + } + + public RMDelegationTokenIdentifier getRmDTIdentifier() { + return rmDTIdentifier; + } + + public Long getRenewDate() { + return renewDate; + } + + public int getLatestSequenceNumber() { + return latestSequenceNumber; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRMDTMasterKeyEvent.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRMDTMasterKeyEvent.java new file mode 100644 index 0000000..c10b197 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRMDTMasterKeyEvent.java @@ -0,0 +1,39 @@ +/** + * 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.yarn.server.resourcemanager.recovery; + +import org.apache.hadoop.security.token.delegation.DelegationKey; + +public class RMStateStoreRMDTMasterKeyEvent extends RMStateStoreEvent { + private DelegationKey delegationKey; + + public RMStateStoreRMDTMasterKeyEvent(RMStateStoreEventType type) { + super(type); + } + + public RMStateStoreRMDTMasterKeyEvent(DelegationKey delegationKey, + RMStateStoreEventType type) { + this(type); + this.delegationKey = delegationKey; + } + + public DelegationKey getDelegationKey() { + return delegationKey; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java index a718fb5..f157af9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java @@ -726,7 +726,7 @@ protected synchronized void removeRMDelegationTokenState( } @Override - protected void updateRMDelegationTokenAndSequenceNumberInternal( + protected synchronized void updateRMDelegationTokenAndSequenceNumberInternal( RMDelegationTokenIdentifier rmDTIdentifier, Long renewDate, int latestSequenceNumber) throws Exception { ArrayList opList = new ArrayList(); @@ -1135,13 +1135,8 @@ protected synchronized ZooKeeper getNewZooKeeper() @Override public synchronized void storeOrUpdateAMRMTokenSecretManagerState( - AMRMTokenSecretManagerState amrmTokenSecretManagerState, - boolean isUpdate) { - if(isFencedState()) { - LOG.info("State store is in Fenced state. Can't store/update " + - "AMRMToken Secret Manager state."); - return; - } + AMRMTokenSecretManagerState amrmTokenSecretManagerState, boolean isUpdate) + throws Exception { AMRMTokenSecretManagerState data = AMRMTokenSecretManagerState.newInstance(amrmTokenSecretManagerState); byte[] stateData = data.getProto().toByteArray(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/security/AMRMTokenSecretManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/security/AMRMTokenSecretManager.java index 5614338..c717ea9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/security/AMRMTokenSecretManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/security/AMRMTokenSecretManager.java @@ -107,8 +107,8 @@ public void start() { AMRMTokenSecretManagerState state = AMRMTokenSecretManagerState.newInstance( this.currentMasterKey.getMasterKey(), null); - rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManagerState(state, - false); + rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManager(state, + false); } this.timer.scheduleAtFixedRate(new MasterKeyRoller(), rollingInterval, rollingInterval); @@ -145,8 +145,8 @@ void rollMasterKey() { AMRMTokenSecretManagerState.newInstance( this.currentMasterKey.getMasterKey(), this.nextMasterKey.getMasterKey()); - rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManagerState(state, - true); + rmContext.getStateStore() + .storeOrUpdateAMRMTokenSecretManager(state, true); this.timer.schedule(new NextKeyActivator(), this.activationDelay); } finally { this.writeLock.unlock(); @@ -170,8 +170,8 @@ public void activateNextMasterKey() { AMRMTokenSecretManagerState state = AMRMTokenSecretManagerState.newInstance( this.currentMasterKey.getMasterKey(), null); - rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManagerState(state, - true); + rmContext.getStateStore() + .storeOrUpdateAMRMTokenSecretManager(state, true); } finally { this.writeLock.unlock(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java index 3d07b37..82ecac0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java @@ -616,7 +616,8 @@ public void testAMRMTokenSecretManagerStateStore( AMRMTokenSecretManagerState state1 = AMRMTokenSecretManagerState.newInstance( firstMasterKeyData.getMasterKey(), null); - rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManagerState(state1, + rmContext.getStateStore() + .storeOrUpdateAMRMTokenSecretManager(state1, false); // load state @@ -636,7 +637,7 @@ public void testAMRMTokenSecretManagerStateStore( AMRMTokenSecretManagerState .newInstance(firstMasterKeyData.getMasterKey(), secondMasterKeyData.getMasterKey()); - rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManagerState(state2, + rmContext.getStateStore().storeOrUpdateAMRMTokenSecretManager(state2, true); // load state -- 1.9.2.msysgit.0