Repository: hadoop Updated Branches: refs/heads/branch-2 7baa6dac5 -> 05ed48b75
HADOOP-14044. Synchronization issue in delegation token cancel functionality. Contributed by Hrishikesh Gadre. (cherry picked from commit ba75bc759334c8987e5f7dd4b21d025f0cccbde7) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/05ed48b7 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/05ed48b7 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/05ed48b7 Branch: refs/heads/branch-2 Commit: 05ed48b75a53df9ad4456ecddc981250006540ae Parents: 7baa6da Author: Xiao Chen <x...@apache.org> Authored: Fri Feb 3 17:13:53 2017 -0800 Committer: Xiao Chen <x...@apache.org> Committed: Fri Feb 3 17:27:35 2017 -0800 ---------------------------------------------------------------------- .../ZKDelegationTokenSecretManager.java | 33 ++++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/05ed48b7/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/delegation/ZKDelegationTokenSecretManager.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/delegation/ZKDelegationTokenSecretManager.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/delegation/ZKDelegationTokenSecretManager.java index 6c66e98..4a7ddb2 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/delegation/ZKDelegationTokenSecretManager.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/delegation/ZKDelegationTokenSecretManager.java @@ -670,6 +670,26 @@ public abstract class ZKDelegationTokenSecretManager<TokenIdent extends Abstract return tokenInfo; } + /** + * This method synchronizes the state of a delegation token information in + * local cache with its actual value in Zookeeper. + * + * @param ident Identifier of the token + */ + private synchronized void syncLocalCacheWithZk(TokenIdent ident) { + try { + DelegationTokenInformation tokenInfo = getTokenInfoFromZK(ident); + if (tokenInfo != null && !currentTokens.containsKey(ident)) { + currentTokens.put(ident, tokenInfo); + } else if (tokenInfo == null && currentTokens.containsKey(ident)) { + currentTokens.remove(ident); + } + } catch (IOException e) { + LOG.error("Error retrieving tokenInfo [" + ident.getSequenceNumber() + + "] from ZK", e); + } + } + private DelegationTokenInformation getTokenInfoFromZK(TokenIdent ident) throws IOException { return getTokenInfoFromZK(ident, false); @@ -851,16 +871,9 @@ public abstract class ZKDelegationTokenSecretManager<TokenIdent extends Abstract DataInputStream in = new DataInputStream(buf); TokenIdent id = createIdentifier(); id.readFields(in); - try { - if (!currentTokens.containsKey(id)) { - // See if token can be retrieved and placed in currentTokens - getTokenInfo(id); - } - return super.cancelToken(token, canceller); - } catch (Exception e) { - LOG.error("Exception while checking if token exist !!", e); - return id; - } + + syncLocalCacheWithZk(id); + return super.cancelToken(token, canceller); } private void addOrUpdateToken(TokenIdent ident, --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org