Skip to content

Commit fde6437

Browse files
authored
HDFS-17395. [FGL] Use FSLock to protect ErasureCodingPolicy related operations (#6579)
1 parent ae19ede commit fde6437

File tree

2 files changed

+30
-27
lines changed

2 files changed

+30
-27
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirErasureCodingOp.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicyInfo;
2929
import org.apache.hadoop.hdfs.protocol.NoECPolicySetException;
3030
import org.apache.hadoop.hdfs.server.namenode.FSDirectory.DirOp;
31+
import org.apache.hadoop.hdfs.server.namenode.fgl.FSNamesystemLockMode;
3132
import org.apache.hadoop.io.IOUtils;
3233
import org.apache.hadoop.io.WritableUtils;
3334
import org.apache.hadoop.io.erasurecode.CodecRegistry;
@@ -71,7 +72,7 @@ private FSDirErasureCodingOp() {}
7172
*/
7273
static ErasureCodingPolicy getEnabledErasureCodingPolicyByName(
7374
final FSNamesystem fsn, final String ecPolicyName) throws IOException {
74-
assert fsn.hasReadLock();
75+
assert fsn.hasReadLock(FSNamesystemLockMode.FS);
7576
ErasureCodingPolicy ecPolicy = fsn.getErasureCodingPolicyManager()
7677
.getEnabledPolicyByName(ecPolicyName);
7778
if (ecPolicy == null) {
@@ -103,7 +104,7 @@ static ErasureCodingPolicy getEnabledErasureCodingPolicyByName(
103104
*/
104105
static ErasureCodingPolicy getErasureCodingPolicyByName(
105106
final FSNamesystem fsn, final String ecPolicyName) throws IOException {
106-
assert fsn.hasReadLock();
107+
assert fsn.hasReadLock(FSNamesystemLockMode.FS);
107108
ErasureCodingPolicy ecPolicy = fsn.getErasureCodingPolicyManager()
108109
.getErasureCodingPolicyByName(ecPolicyName);
109110
if (ecPolicy == null) {
@@ -132,7 +133,7 @@ static FileStatus setErasureCodingPolicy(final FSNamesystem fsn,
132133
final String srcArg, final String ecPolicyName,
133134
final FSPermissionChecker pc, final boolean logRetryCache)
134135
throws IOException, AccessControlException {
135-
assert fsn.hasWriteLock();
136+
assert fsn.hasWriteLock(FSNamesystemLockMode.FS);
136137

137138
String src = srcArg;
138139
FSDirectory fsd = fsn.getFSDirectory();
@@ -209,7 +210,7 @@ private static List<XAttr> setErasureCodingPolicyXAttr(final FSNamesystem fsn,
209210
static FileStatus unsetErasureCodingPolicy(final FSNamesystem fsn,
210211
final String srcArg, final FSPermissionChecker pc,
211212
final boolean logRetryCache) throws IOException {
212-
assert fsn.hasWriteLock();
213+
assert fsn.hasWriteLock(FSNamesystemLockMode.FS);
213214

214215
String src = srcArg;
215216
FSDirectory fsd = fsn.getFSDirectory();
@@ -353,7 +354,7 @@ private static List<XAttr> removeErasureCodingPolicyXAttr(
353354
static ErasureCodingPolicy getErasureCodingPolicy(final FSNamesystem fsn,
354355
final String src, FSPermissionChecker pc)
355356
throws IOException, AccessControlException {
356-
assert fsn.hasReadLock();
357+
assert fsn.hasReadLock(FSNamesystemLockMode.FS);
357358

358359
if (FSDirectory.isExactReservedName(src)) {
359360
return null;
@@ -416,7 +417,7 @@ static ErasureCodingPolicy getErasureCodingPolicy(FSNamesystem fsn,
416417
*/
417418
static ErasureCodingPolicy unprotectedGetErasureCodingPolicy(
418419
final FSNamesystem fsn, final INodesInPath iip) throws IOException {
419-
assert fsn.hasReadLock();
420+
assert fsn.hasReadLock(FSNamesystemLockMode.FS);
420421

421422
return getErasureCodingPolicyForPath(fsn.getFSDirectory(), iip);
422423
}
@@ -441,7 +442,7 @@ static ErasureCodingPolicyInfo[] getErasureCodingPolicies(
441442
*/
442443
static Map<String, String> getErasureCodingCodecs(final FSNamesystem fsn)
443444
throws IOException {
444-
assert fsn.hasReadLock();
445+
assert fsn.hasReadLock(FSNamesystemLockMode.FS);
445446
return CodecRegistry.getInstance().getCodec2CoderCompactMap();
446447
}
447448

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8319,7 +8319,7 @@ void setErasureCodingPolicy(final String srcArg, final String ecPolicyName,
83198319
FileStatus resultingStat = null;
83208320
final FSPermissionChecker pc = getPermissionChecker();
83218321
FSPermissionChecker.setOperationType(operationName);
8322-
writeLock();
8322+
writeLock(FSNamesystemLockMode.FS);
83238323
try {
83248324
checkOperation(OperationCategory.WRITE);
83258325
checkNameNodeSafeMode("Cannot set erasure coding policy on " + srcArg);
@@ -8329,7 +8329,7 @@ void setErasureCodingPolicy(final String srcArg, final String ecPolicyName,
83298329
logAuditEvent(false, operationName, srcArg);
83308330
throw ace;
83318331
} finally {
8332-
writeUnlock(operationName,
8332+
writeUnlock(FSNamesystemLockMode.FS, operationName,
83338333
getLockReportInfoSupplier(srcArg, null, resultingStat));
83348334
}
83358335
getEditLog().logSync();
@@ -8352,7 +8352,7 @@ AddErasureCodingPolicyResponse[] addErasureCodingPolicies(
83528352
checkErasureCodingSupported(operationName);
83538353
List<AddErasureCodingPolicyResponse> responses =
83548354
new ArrayList<>(policies.length);
8355-
writeLock();
8355+
writeLock(FSNamesystemLockMode.FS);
83568356
try {
83578357
checkOperation(OperationCategory.WRITE);
83588358
checkNameNodeSafeMode("Cannot add erasure coding policy");
@@ -8368,7 +8368,7 @@ AddErasureCodingPolicyResponse[] addErasureCodingPolicies(
83688368
}
83698369
}
83708370
} finally {
8371-
writeUnlock(operationName,
8371+
writeUnlock(FSNamesystemLockMode.FS, operationName,
83728372
getLockReportInfoSupplier(addECPolicyNames.toString()));
83738373
}
83748374
getEditLog().logSync();
@@ -8388,15 +8388,15 @@ void removeErasureCodingPolicy(String ecPolicyName,
83888388
final String operationName = "removeErasureCodingPolicy";
83898389
checkOperation(OperationCategory.WRITE);
83908390
checkErasureCodingSupported(operationName);
8391-
writeLock();
8391+
writeLock(FSNamesystemLockMode.FS);
83928392
try {
83938393
checkOperation(OperationCategory.WRITE);
83948394
checkNameNodeSafeMode("Cannot remove erasure coding policy "
83958395
+ ecPolicyName);
83968396
FSDirErasureCodingOp.removeErasureCodingPolicy(this, ecPolicyName,
83978397
logRetryCache);
83988398
} finally {
8399-
writeUnlock(operationName, getLockReportInfoSupplier(ecPolicyName));
8399+
writeUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(ecPolicyName));
84008400
}
84018401
getEditLog().logSync();
84028402
logAuditEvent(true, operationName, ecPolicyName, null, null);
@@ -8417,15 +8417,16 @@ boolean enableErasureCodingPolicy(String ecPolicyName,
84178417
checkErasureCodingSupported(operationName);
84188418
boolean success = false;
84198419
try {
8420-
writeLock();
8420+
writeLock(FSNamesystemLockMode.FS);
84218421
try {
84228422
checkOperation(OperationCategory.WRITE);
84238423
checkNameNodeSafeMode("Cannot enable erasure coding policy "
84248424
+ ecPolicyName);
84258425
success = FSDirErasureCodingOp.enableErasureCodingPolicy(this,
84268426
ecPolicyName, logRetryCache);
84278427
} finally {
8428-
writeUnlock(operationName, getLockReportInfoSupplier(ecPolicyName));
8428+
writeUnlock(FSNamesystemLockMode.FS, operationName,
8429+
getLockReportInfoSupplier(ecPolicyName));
84298430
}
84308431
} catch (AccessControlException ace) {
84318432
logAuditEvent(false, operationName, ecPolicyName);
@@ -8452,15 +8453,16 @@ boolean disableErasureCodingPolicy(String ecPolicyName,
84528453
checkErasureCodingSupported(operationName);
84538454
boolean success = false;
84548455
try {
8455-
writeLock();
8456+
writeLock(FSNamesystemLockMode.FS);
84568457
try {
84578458
checkOperation(OperationCategory.WRITE);
84588459
checkNameNodeSafeMode("Cannot disable erasure coding policy "
84598460
+ ecPolicyName);
84608461
success = FSDirErasureCodingOp.disableErasureCodingPolicy(this,
84618462
ecPolicyName, logRetryCache);
84628463
} finally {
8463-
writeUnlock(operationName, getLockReportInfoSupplier(ecPolicyName));
8464+
writeUnlock(FSNamesystemLockMode.FS, operationName,
8465+
getLockReportInfoSupplier(ecPolicyName));
84648466
}
84658467
} catch (AccessControlException ace) {
84668468
logAuditEvent(false, operationName, ecPolicyName);
@@ -8489,14 +8491,14 @@ void unsetErasureCodingPolicy(final String srcArg,
84898491
FileStatus resultingStat = null;
84908492
final FSPermissionChecker pc = getPermissionChecker();
84918493
FSPermissionChecker.setOperationType(operationName);
8492-
writeLock();
8494+
writeLock(FSNamesystemLockMode.FS);
84938495
try {
84948496
checkOperation(OperationCategory.WRITE);
84958497
checkNameNodeSafeMode("Cannot unset erasure coding policy on " + srcArg);
84968498
resultingStat = FSDirErasureCodingOp.unsetErasureCodingPolicy(this,
84978499
srcArg, pc, logRetryCache);
84988500
} finally {
8499-
writeUnlock(operationName,
8501+
writeUnlock(FSNamesystemLockMode.FS, operationName,
85008502
getLockReportInfoSupplier(srcArg, null, resultingStat));
85018503
}
85028504
getEditLog().logSync();
@@ -8516,7 +8518,7 @@ public ECTopologyVerifierResult getECTopologyResultForPolicies(
85168518
checkSuperuserPrivilege(operationName);
85178519
checkOperation(OperationCategory.UNCHECKED);
85188520
ECTopologyVerifierResult result;
8519-
readLock();
8521+
readLock(FSNamesystemLockMode.FS);
85208522
try {
85218523
checkOperation(OperationCategory.UNCHECKED);
85228524
// If no policy name is specified return the result
@@ -8539,7 +8541,7 @@ public ECTopologyVerifierResult getECTopologyResultForPolicies(
85398541
.getECTopologyVerifierResult(numOfRacks, numOfDataNodes, policies);
85408542
}
85418543
} finally {
8542-
readUnlock(operationName, getLockReportInfoSupplier(null));
8544+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(null));
85438545
}
85448546
logAuditEvent(true, operationName, null);
85458547
return result;
@@ -8556,15 +8558,15 @@ ErasureCodingPolicy getErasureCodingPolicy(String src)
85568558
checkErasureCodingSupported(operationName);
85578559
final FSPermissionChecker pc = getPermissionChecker();
85588560
FSPermissionChecker.setOperationType(operationName);
8559-
readLock();
8561+
readLock(FSNamesystemLockMode.FS);
85608562
try {
85618563
checkOperation(OperationCategory.READ);
85628564
final ErasureCodingPolicy ret =
85638565
FSDirErasureCodingOp.getErasureCodingPolicy(this, src, pc);
85648566
success = true;
85658567
return ret;
85668568
} finally {
8567-
readUnlock(operationName, getLockReportInfoSupplier(src));
8569+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(src));
85688570
logAuditEvent(success, operationName, src);
85698571
}
85708572
}
@@ -8577,15 +8579,15 @@ ErasureCodingPolicyInfo[] getErasureCodingPolicies() throws IOException {
85778579
boolean success = false;
85788580
checkOperation(OperationCategory.READ);
85798581
checkErasureCodingSupported(operationName);
8580-
readLock();
8582+
readLock(FSNamesystemLockMode.FS);
85818583
try {
85828584
checkOperation(OperationCategory.READ);
85838585
final ErasureCodingPolicyInfo[] ret =
85848586
FSDirErasureCodingOp.getErasureCodingPolicies(this);
85858587
success = true;
85868588
return ret;
85878589
} finally {
8588-
readUnlock(operationName, getLockReportInfoSupplier(null));
8590+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(null));
85898591
logAuditEvent(success, operationName, null);
85908592
}
85918593
}
@@ -8598,15 +8600,15 @@ Map<String, String> getErasureCodingCodecs() throws IOException {
85988600
boolean success = false;
85998601
checkOperation(OperationCategory.READ);
86008602
checkErasureCodingSupported(operationName);
8601-
readLock();
8603+
readLock(FSNamesystemLockMode.FS);
86028604
try {
86038605
checkOperation(OperationCategory.READ);
86048606
final Map<String, String> ret =
86058607
FSDirErasureCodingOp.getErasureCodingCodecs(this);
86068608
success = true;
86078609
return ret;
86088610
} finally {
8609-
readUnlock(operationName, getLockReportInfoSupplier(null));
8611+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(null));
86108612
logAuditEvent(success, operationName, null);
86118613
}
86128614
}

0 commit comments

Comments
 (0)