Skip to content

Commit b3275ab

Browse files
committed
HDFS-14305. Fix serial number calculation in BlockTokenSecretManager to avoid token key ID overlap between NameNodes. Contributed by Konstantin V Shvachko.
1 parent e5bba59 commit b3275ab

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/security/token/block/BlockTokenSecretManager.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,6 @@ public BlockTokenSecretManager(long keyUpdateInterval,
122122
encryptionAlgorithm, nnIndex, numNNs, useProto, shouldWrapQOP);
123123
Preconditions.checkArgument(nnIndex >= 0);
124124
Preconditions.checkArgument(numNNs > 0);
125-
setSerialNo(new SecureRandom().nextInt());
126-
generateKeys();
127125
}
128126

129127
/**
@@ -152,13 +150,19 @@ private BlockTokenSecretManager(boolean isMaster, long keyUpdateInterval,
152150
this.useProto = useProto;
153151
this.shouldWrapQOP = shouldWrapQOP;
154152
this.timer = new Timer();
153+
setSerialNo(new SecureRandom().nextInt(Integer.MAX_VALUE));
154+
LOG.info("Block token key range: [{}, {})",
155+
nnRangeStart, nnRangeStart + intRange);
155156
generateKeys();
156157
}
157158

158159
@VisibleForTesting
159-
public synchronized void setSerialNo(int serialNo) {
160+
public synchronized void setSerialNo(int nextNo) {
160161
// we mod the serial number by the range and then add that times the index
161-
this.serialNo = (serialNo % intRange) + (nnRangeStart);
162+
this.serialNo = (nextNo % intRange) + (nnRangeStart);
163+
assert serialNo >= nnRangeStart && serialNo < (nnRangeStart + intRange) :
164+
"serialNo " + serialNo + " is not in the designated range: [" +
165+
nnRangeStart + ", " + (nnRangeStart + intRange) + ")";
162166
}
163167

164168
public void setBlockPoolId(String blockPoolId) {

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/security/token/block/TestBlockToken.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,4 +819,27 @@ public void testBadStorageIDCheckAccess() throws IOException {
819819
testBadStorageIDCheckAccess(true);
820820
}
821821

822+
/**
823+
* Verify that block token serialNo is always within the range designated to
824+
* to the NameNode.
825+
*/
826+
@Test
827+
public void testBlockTokenRanges() throws IOException {
828+
final int interval = 1024;
829+
final int numNNs = Integer.MAX_VALUE / interval;
830+
for(int nnIdx = 0; nnIdx < 64; nnIdx++) {
831+
BlockTokenSecretManager sm = new BlockTokenSecretManager(
832+
blockKeyUpdateInterval, blockTokenLifetime, nnIdx, numNNs,
833+
"fake-pool", null, false);
834+
int rangeStart = nnIdx * interval;
835+
for(int i = 0; i < interval * 3; i++) {
836+
int serialNo = sm.getSerialNoForTesting();
837+
assertTrue(
838+
"serialNo " + serialNo + " is not in the designated range: [" +
839+
rangeStart + ", " + (rangeStart + interval) + ")",
840+
serialNo >= rangeStart && serialNo < (rangeStart + interval));
841+
sm.updateKeys();
842+
}
843+
}
844+
}
822845
}

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestFailoverWithBlockTokensEnabled.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,10 @@ public void ensureSerialNumbersNeverOverlap() {
9292

9393
setAndCheckSerialNumber(0, btsm1, btsm2, btsm3);
9494
setAndCheckSerialNumber(Integer.MAX_VALUE, btsm1, btsm2, btsm3);
95-
setAndCheckSerialNumber(Integer.MIN_VALUE, btsm1, btsm2, btsm3);
9695
setAndCheckSerialNumber(Integer.MAX_VALUE / 2, btsm1, btsm2, btsm3);
97-
setAndCheckSerialNumber(Integer.MIN_VALUE / 2, btsm1, btsm2, btsm3);
9896
setAndCheckSerialNumber(Integer.MAX_VALUE / 3, btsm1, btsm2, btsm3);
99-
setAndCheckSerialNumber(Integer.MIN_VALUE / 3, btsm1, btsm2, btsm3);
97+
setAndCheckSerialNumber(Integer.MAX_VALUE / 171717,
98+
btsm1, btsm2, btsm3);
10099
}
101100

102101
private void setAndCheckSerialNumber(int serialNumber, BlockTokenSecretManager... btsms) {

0 commit comments

Comments
 (0)