Skip to content

Commit 1d5ffc8

Browse files
ZanderXuzengqiang.xu
authored andcommitted
HDFS-17395. [FGL] Use FSLock to protect ErasureCodingPolicy related operations (#6579)
1 parent 161ea04 commit 1d5ffc8

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
@@ -8354,7 +8354,7 @@ void setErasureCodingPolicy(final String srcArg, final String ecPolicyName,
83548354
FileStatus resultingStat = null;
83558355
final FSPermissionChecker pc = getPermissionChecker();
83568356
FSPermissionChecker.setOperationType(operationName);
8357-
writeLock();
8357+
writeLock(FSNamesystemLockMode.FS);
83588358
try {
83598359
checkOperation(OperationCategory.WRITE);
83608360
checkNameNodeSafeMode("Cannot set erasure coding policy on " + srcArg);
@@ -8364,7 +8364,7 @@ void setErasureCodingPolicy(final String srcArg, final String ecPolicyName,
83648364
logAuditEvent(false, operationName, srcArg);
83658365
throw ace;
83668366
} finally {
8367-
writeUnlock(operationName,
8367+
writeUnlock(FSNamesystemLockMode.FS, operationName,
83688368
getLockReportInfoSupplier(srcArg, null, resultingStat));
83698369
}
83708370
getEditLog().logSync();
@@ -8387,7 +8387,7 @@ AddErasureCodingPolicyResponse[] addErasureCodingPolicies(
83878387
checkErasureCodingSupported(operationName);
83888388
List<AddErasureCodingPolicyResponse> responses =
83898389
new ArrayList<>(policies.length);
8390-
writeLock();
8390+
writeLock(FSNamesystemLockMode.FS);
83918391
try {
83928392
checkOperation(OperationCategory.WRITE);
83938393
checkNameNodeSafeMode("Cannot add erasure coding policy");
@@ -8403,7 +8403,7 @@ AddErasureCodingPolicyResponse[] addErasureCodingPolicies(
84038403
}
84048404
}
84058405
} finally {
8406-
writeUnlock(operationName,
8406+
writeUnlock(FSNamesystemLockMode.FS, operationName,
84078407
getLockReportInfoSupplier(addECPolicyNames.toString()));
84088408
}
84098409
getEditLog().logSync();
@@ -8423,15 +8423,15 @@ void removeErasureCodingPolicy(String ecPolicyName,
84238423
final String operationName = "removeErasureCodingPolicy";
84248424
checkOperation(OperationCategory.WRITE);
84258425
checkErasureCodingSupported(operationName);
8426-
writeLock();
8426+
writeLock(FSNamesystemLockMode.FS);
84278427
try {
84288428
checkOperation(OperationCategory.WRITE);
84298429
checkNameNodeSafeMode("Cannot remove erasure coding policy "
84308430
+ ecPolicyName);
84318431
FSDirErasureCodingOp.removeErasureCodingPolicy(this, ecPolicyName,
84328432
logRetryCache);
84338433
} finally {
8434-
writeUnlock(operationName, getLockReportInfoSupplier(ecPolicyName));
8434+
writeUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(ecPolicyName));
84358435
}
84368436
getEditLog().logSync();
84378437
logAuditEvent(true, operationName, ecPolicyName, null, null);
@@ -8452,15 +8452,16 @@ boolean enableErasureCodingPolicy(String ecPolicyName,
84528452
checkErasureCodingSupported(operationName);
84538453
boolean success = false;
84548454
try {
8455-
writeLock();
8455+
writeLock(FSNamesystemLockMode.FS);
84568456
try {
84578457
checkOperation(OperationCategory.WRITE);
84588458
checkNameNodeSafeMode("Cannot enable erasure coding policy "
84598459
+ ecPolicyName);
84608460
success = FSDirErasureCodingOp.enableErasureCodingPolicy(this,
84618461
ecPolicyName, logRetryCache);
84628462
} finally {
8463-
writeUnlock(operationName, getLockReportInfoSupplier(ecPolicyName));
8463+
writeUnlock(FSNamesystemLockMode.FS, operationName,
8464+
getLockReportInfoSupplier(ecPolicyName));
84648465
}
84658466
} catch (AccessControlException ace) {
84668467
logAuditEvent(false, operationName, ecPolicyName);
@@ -8487,15 +8488,16 @@ boolean disableErasureCodingPolicy(String ecPolicyName,
84878488
checkErasureCodingSupported(operationName);
84888489
boolean success = false;
84898490
try {
8490-
writeLock();
8491+
writeLock(FSNamesystemLockMode.FS);
84918492
try {
84928493
checkOperation(OperationCategory.WRITE);
84938494
checkNameNodeSafeMode("Cannot disable erasure coding policy "
84948495
+ ecPolicyName);
84958496
success = FSDirErasureCodingOp.disableErasureCodingPolicy(this,
84968497
ecPolicyName, logRetryCache);
84978498
} finally {
8498-
writeUnlock(operationName, getLockReportInfoSupplier(ecPolicyName));
8499+
writeUnlock(FSNamesystemLockMode.FS, operationName,
8500+
getLockReportInfoSupplier(ecPolicyName));
84998501
}
85008502
} catch (AccessControlException ace) {
85018503
logAuditEvent(false, operationName, ecPolicyName);
@@ -8524,14 +8526,14 @@ void unsetErasureCodingPolicy(final String srcArg,
85248526
FileStatus resultingStat = null;
85258527
final FSPermissionChecker pc = getPermissionChecker();
85268528
FSPermissionChecker.setOperationType(operationName);
8527-
writeLock();
8529+
writeLock(FSNamesystemLockMode.FS);
85288530
try {
85298531
checkOperation(OperationCategory.WRITE);
85308532
checkNameNodeSafeMode("Cannot unset erasure coding policy on " + srcArg);
85318533
resultingStat = FSDirErasureCodingOp.unsetErasureCodingPolicy(this,
85328534
srcArg, pc, logRetryCache);
85338535
} finally {
8534-
writeUnlock(operationName,
8536+
writeUnlock(FSNamesystemLockMode.FS, operationName,
85358537
getLockReportInfoSupplier(srcArg, null, resultingStat));
85368538
}
85378539
getEditLog().logSync();
@@ -8551,7 +8553,7 @@ public ECTopologyVerifierResult getECTopologyResultForPolicies(
85518553
checkSuperuserPrivilege(operationName);
85528554
checkOperation(OperationCategory.UNCHECKED);
85538555
ECTopologyVerifierResult result;
8554-
readLock();
8556+
readLock(FSNamesystemLockMode.FS);
85558557
try {
85568558
checkOperation(OperationCategory.UNCHECKED);
85578559
// If no policy name is specified return the result
@@ -8574,7 +8576,7 @@ public ECTopologyVerifierResult getECTopologyResultForPolicies(
85748576
.getECTopologyVerifierResult(numOfRacks, numOfDataNodes, policies);
85758577
}
85768578
} finally {
8577-
readUnlock(operationName, getLockReportInfoSupplier(null));
8579+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(null));
85788580
}
85798581
logAuditEvent(true, operationName, null);
85808582
return result;
@@ -8591,15 +8593,15 @@ ErasureCodingPolicy getErasureCodingPolicy(String src)
85918593
checkErasureCodingSupported(operationName);
85928594
final FSPermissionChecker pc = getPermissionChecker();
85938595
FSPermissionChecker.setOperationType(operationName);
8594-
readLock();
8596+
readLock(FSNamesystemLockMode.FS);
85958597
try {
85968598
checkOperation(OperationCategory.READ);
85978599
final ErasureCodingPolicy ret =
85988600
FSDirErasureCodingOp.getErasureCodingPolicy(this, src, pc);
85998601
success = true;
86008602
return ret;
86018603
} finally {
8602-
readUnlock(operationName, getLockReportInfoSupplier(src));
8604+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(src));
86038605
logAuditEvent(success, operationName, src);
86048606
}
86058607
}
@@ -8612,15 +8614,15 @@ ErasureCodingPolicyInfo[] getErasureCodingPolicies() throws IOException {
86128614
boolean success = false;
86138615
checkOperation(OperationCategory.READ);
86148616
checkErasureCodingSupported(operationName);
8615-
readLock();
8617+
readLock(FSNamesystemLockMode.FS);
86168618
try {
86178619
checkOperation(OperationCategory.READ);
86188620
final ErasureCodingPolicyInfo[] ret =
86198621
FSDirErasureCodingOp.getErasureCodingPolicies(this);
86208622
success = true;
86218623
return ret;
86228624
} finally {
8623-
readUnlock(operationName, getLockReportInfoSupplier(null));
8625+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(null));
86248626
logAuditEvent(success, operationName, null);
86258627
}
86268628
}
@@ -8633,15 +8635,15 @@ Map<String, String> getErasureCodingCodecs() throws IOException {
86338635
boolean success = false;
86348636
checkOperation(OperationCategory.READ);
86358637
checkErasureCodingSupported(operationName);
8636-
readLock();
8638+
readLock(FSNamesystemLockMode.FS);
86378639
try {
86388640
checkOperation(OperationCategory.READ);
86398641
final Map<String, String> ret =
86408642
FSDirErasureCodingOp.getErasureCodingCodecs(this);
86418643
success = true;
86428644
return ret;
86438645
} finally {
8644-
readUnlock(operationName, getLockReportInfoSupplier(null));
8646+
readUnlock(FSNamesystemLockMode.FS, operationName, getLockReportInfoSupplier(null));
86458647
logAuditEvent(success, operationName, null);
86468648
}
86478649
}

0 commit comments

Comments
 (0)