|
@@ -40,6 +40,7 @@ import java.util.Set;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.Executor;
|
|
import java.util.concurrent.Executor;
|
|
import java.util.concurrent.locks.Condition;
|
|
import java.util.concurrent.locks.Condition;
|
|
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
import javax.management.NotCompliantMBeanException;
|
|
import javax.management.NotCompliantMBeanException;
|
|
@@ -111,7 +112,7 @@ import org.apache.hadoop.util.Daemon;
|
|
import org.apache.hadoop.util.DataChecksum;
|
|
import org.apache.hadoop.util.DataChecksum;
|
|
import org.apache.hadoop.util.DiskChecker.DiskErrorException;
|
|
import org.apache.hadoop.util.DiskChecker.DiskErrorException;
|
|
import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
|
|
import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
|
|
-import org.apache.hadoop.util.InstrumentedReadWriteLock;
|
|
|
|
|
|
+import org.apache.hadoop.util.InstrumentedLock;
|
|
import org.apache.hadoop.util.ReflectionUtils;
|
|
import org.apache.hadoop.util.ReflectionUtils;
|
|
import org.apache.hadoop.util.Time;
|
|
import org.apache.hadoop.util.Time;
|
|
import org.apache.hadoop.util.Timer;
|
|
import org.apache.hadoop.util.Timer;
|
|
@@ -178,7 +179,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public FsVolumeImpl getVolume(final ExtendedBlock b) {
|
|
public FsVolumeImpl getVolume(final ExtendedBlock b) {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final ReplicaInfo r =
|
|
final ReplicaInfo r =
|
|
volumeMap.get(b.getBlockPoolId(), b.getLocalBlock());
|
|
volumeMap.get(b.getBlockPoolId(), b.getLocalBlock());
|
|
return r != null ? (FsVolumeImpl) r.getVolume() : null;
|
|
return r != null ? (FsVolumeImpl) r.getVolume() : null;
|
|
@@ -188,7 +189,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public Block getStoredBlock(String bpid, long blkid)
|
|
public Block getStoredBlock(String bpid, long blkid)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo r = volumeMap.get(bpid, blkid);
|
|
ReplicaInfo r = volumeMap.get(bpid, blkid);
|
|
if (r == null) {
|
|
if (r == null) {
|
|
return null;
|
|
return null;
|
|
@@ -201,16 +202,12 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
* The deepCopyReplica call doesn't use the datasetock since it will lead the
|
|
* The deepCopyReplica call doesn't use the datasetock since it will lead the
|
|
* potential deadlock with the {@link FsVolumeList#addBlockPool} call.
|
|
* potential deadlock with the {@link FsVolumeList#addBlockPool} call.
|
|
*/
|
|
*/
|
|
- @SuppressWarnings("unchecked")
|
|
|
|
@Override
|
|
@Override
|
|
public Set<? extends Replica> deepCopyReplica(String bpid)
|
|
public Set<? extends Replica> deepCopyReplica(String bpid)
|
|
throws IOException {
|
|
throws IOException {
|
|
- Set<? extends Replica> replicas;
|
|
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
- replicas =
|
|
|
|
- new HashSet<>(volumeMap.replicas(bpid) == null ? Collections.EMPTY_SET
|
|
|
|
- : volumeMap.replicas(bpid));
|
|
|
|
- }
|
|
|
|
|
|
+ Set<? extends Replica> replicas =
|
|
|
|
+ new HashSet<>(volumeMap.replicas(bpid) == null ? Collections.EMPTY_SET
|
|
|
|
+ : volumeMap.replicas(bpid));
|
|
return Collections.unmodifiableSet(replicas);
|
|
return Collections.unmodifiableSet(replicas);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -271,12 +268,8 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
private final int maxDataLength;
|
|
private final int maxDataLength;
|
|
|
|
|
|
@VisibleForTesting
|
|
@VisibleForTesting
|
|
- final AutoCloseableLock datasetWriteLock;
|
|
|
|
- @VisibleForTesting
|
|
|
|
- final AutoCloseableLock datasetReadLock;
|
|
|
|
- @VisibleForTesting
|
|
|
|
- final InstrumentedReadWriteLock datasetRWLock;
|
|
|
|
- private final Condition datasetWriteLockCondition;
|
|
|
|
|
|
+ final AutoCloseableLock datasetLock;
|
|
|
|
+ private final Condition datasetLockCondition;
|
|
private static String blockPoolId = "";
|
|
private static String blockPoolId = "";
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -289,33 +282,15 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
this.dataStorage = storage;
|
|
this.dataStorage = storage;
|
|
this.conf = conf;
|
|
this.conf = conf;
|
|
this.smallBufferSize = DFSUtilClient.getSmallBufferSize(conf);
|
|
this.smallBufferSize = DFSUtilClient.getSmallBufferSize(conf);
|
|
- this.datasetRWLock = new InstrumentedReadWriteLock(
|
|
|
|
- conf.getBoolean(DFSConfigKeys.DFS_DATANODE_LOCK_FAIR_KEY,
|
|
|
|
- DFSConfigKeys.DFS_DATANODE_LOCK_FAIR_DEFAULT),
|
|
|
|
- "FsDatasetRWLock", LOG, conf.getTimeDuration(
|
|
|
|
- DFSConfigKeys.DFS_LOCK_SUPPRESS_WARNING_INTERVAL_KEY,
|
|
|
|
- DFSConfigKeys.DFS_LOCK_SUPPRESS_WARNING_INTERVAL_DEFAULT,
|
|
|
|
- TimeUnit.MILLISECONDS),
|
|
|
|
- conf.getTimeDuration(
|
|
|
|
- DFSConfigKeys.DFS_DATANODE_LOCK_REPORTING_THRESHOLD_MS_KEY,
|
|
|
|
- DFSConfigKeys.DFS_DATANODE_LOCK_REPORTING_THRESHOLD_MS_DEFAULT,
|
|
|
|
- TimeUnit.MILLISECONDS));
|
|
|
|
- this.datasetWriteLock = new AutoCloseableLock(datasetRWLock.writeLock());
|
|
|
|
- boolean enableRL = conf.getBoolean(
|
|
|
|
- DFSConfigKeys.DFS_DATANODE_LOCK_READ_WRITE_ENABLED_KEY,
|
|
|
|
- DFSConfigKeys.DFS_DATANODE_LOCK_READ_WRITE_ENABLED_DEFAULT);
|
|
|
|
- // The read lock can be disabled by the above config key. If it is disabled
|
|
|
|
- // then we simply make the both the read and write lock variables hold
|
|
|
|
- // the write lock. All accesses to the lock are via these variables, so that
|
|
|
|
- // effectively disables the read lock.
|
|
|
|
- if (enableRL) {
|
|
|
|
- LOG.info("The datanode lock is a read write lock");
|
|
|
|
- this.datasetReadLock = new AutoCloseableLock(datasetRWLock.readLock());
|
|
|
|
- } else {
|
|
|
|
- LOG.info("The datanode lock is an exclusive write lock");
|
|
|
|
- this.datasetReadLock = this.datasetWriteLock;
|
|
|
|
- }
|
|
|
|
- this.datasetWriteLockCondition = datasetWriteLock.newCondition();
|
|
|
|
|
|
+ this.datasetLock = new AutoCloseableLock(
|
|
|
|
+ new InstrumentedLock(getClass().getName(), LOG,
|
|
|
|
+ new ReentrantLock(true),
|
|
|
|
+ conf.getTimeDuration(
|
|
|
|
+ DFSConfigKeys.DFS_LOCK_SUPPRESS_WARNING_INTERVAL_KEY,
|
|
|
|
+ DFSConfigKeys.DFS_LOCK_SUPPRESS_WARNING_INTERVAL_DEFAULT,
|
|
|
|
+ TimeUnit.MILLISECONDS),
|
|
|
|
+ 300));
|
|
|
|
+ this.datasetLockCondition = datasetLock.newCondition();
|
|
|
|
|
|
// The number of volumes required for operation is the total number
|
|
// The number of volumes required for operation is the total number
|
|
// of volumes minus the number of failed volumes we can tolerate.
|
|
// of volumes minus the number of failed volumes we can tolerate.
|
|
@@ -354,7 +329,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
}
|
|
}
|
|
|
|
|
|
storageMap = new ConcurrentHashMap<String, DatanodeStorage>();
|
|
storageMap = new ConcurrentHashMap<String, DatanodeStorage>();
|
|
- volumeMap = new ReplicaMap(datasetReadLock, datasetWriteLock);
|
|
|
|
|
|
+ volumeMap = new ReplicaMap(datasetLock);
|
|
ramDiskReplicaTracker = RamDiskReplicaTracker.getInstance(conf, this);
|
|
ramDiskReplicaTracker = RamDiskReplicaTracker.getInstance(conf, this);
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@SuppressWarnings("unchecked")
|
|
@@ -408,12 +383,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public AutoCloseableLock acquireDatasetLock() {
|
|
public AutoCloseableLock acquireDatasetLock() {
|
|
- return datasetWriteLock.acquire();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- @Override
|
|
|
|
- public AutoCloseableLock acquireDatasetReadLock() {
|
|
|
|
- return datasetReadLock.acquire();
|
|
|
|
|
|
+ return datasetLock.acquire();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -454,7 +424,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
ReplicaMap replicaMap,
|
|
ReplicaMap replicaMap,
|
|
Storage.StorageDirectory sd, StorageType storageType,
|
|
Storage.StorageDirectory sd, StorageType storageType,
|
|
FsVolumeReference ref) throws IOException {
|
|
FsVolumeReference ref) throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
DatanodeStorage dnStorage = storageMap.get(sd.getStorageUuid());
|
|
DatanodeStorage dnStorage = storageMap.get(sd.getStorageUuid());
|
|
if (dnStorage != null) {
|
|
if (dnStorage != null) {
|
|
final String errorMsg = String.format(
|
|
final String errorMsg = String.format(
|
|
@@ -487,8 +457,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
.setConf(this.conf)
|
|
.setConf(this.conf)
|
|
.build();
|
|
.build();
|
|
FsVolumeReference ref = fsVolume.obtainReference();
|
|
FsVolumeReference ref = fsVolume.obtainReference();
|
|
- ReplicaMap tempVolumeMap =
|
|
|
|
- new ReplicaMap(datasetReadLock, datasetWriteLock);
|
|
|
|
|
|
+ ReplicaMap tempVolumeMap = new ReplicaMap(datasetLock);
|
|
fsVolume.getVolumeMap(tempVolumeMap, ramDiskReplicaTracker);
|
|
fsVolume.getVolumeMap(tempVolumeMap, ramDiskReplicaTracker);
|
|
|
|
|
|
activateVolume(tempVolumeMap, sd, storageLocation.getStorageType(), ref);
|
|
activateVolume(tempVolumeMap, sd, storageLocation.getStorageType(), ref);
|
|
@@ -527,8 +496,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
StorageType storageType = location.getStorageType();
|
|
StorageType storageType = location.getStorageType();
|
|
final FsVolumeImpl fsVolume =
|
|
final FsVolumeImpl fsVolume =
|
|
createFsVolume(sd.getStorageUuid(), sd, location);
|
|
createFsVolume(sd.getStorageUuid(), sd, location);
|
|
- final ReplicaMap tempVolumeMap =
|
|
|
|
- new ReplicaMap(datasetReadLock, datasetWriteLock);
|
|
|
|
|
|
+ final ReplicaMap tempVolumeMap = new ReplicaMap(new AutoCloseableLock());
|
|
ArrayList<IOException> exceptions = Lists.newArrayList();
|
|
ArrayList<IOException> exceptions = Lists.newArrayList();
|
|
|
|
|
|
for (final NamespaceInfo nsInfo : nsInfos) {
|
|
for (final NamespaceInfo nsInfo : nsInfos) {
|
|
@@ -573,7 +541,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
new ArrayList<>(storageLocsToRemove);
|
|
new ArrayList<>(storageLocsToRemove);
|
|
Map<String, List<ReplicaInfo>> blkToInvalidate = new HashMap<>();
|
|
Map<String, List<ReplicaInfo>> blkToInvalidate = new HashMap<>();
|
|
List<String> storageToRemove = new ArrayList<>();
|
|
List<String> storageToRemove = new ArrayList<>();
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
for (int idx = 0; idx < dataStorage.getNumStorageDirs(); idx++) {
|
|
for (int idx = 0; idx < dataStorage.getNumStorageDirs(); idx++) {
|
|
Storage.StorageDirectory sd = dataStorage.getStorageDir(idx);
|
|
Storage.StorageDirectory sd = dataStorage.getStorageDir(idx);
|
|
final StorageLocation sdLocation = sd.getStorageLocation();
|
|
final StorageLocation sdLocation = sd.getStorageLocation();
|
|
@@ -585,7 +553,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
// Disable the volume from the service.
|
|
// Disable the volume from the service.
|
|
asyncDiskService.removeVolume(sd.getStorageUuid());
|
|
asyncDiskService.removeVolume(sd.getStorageUuid());
|
|
volumes.removeVolume(sdLocation, clearFailure);
|
|
volumes.removeVolume(sdLocation, clearFailure);
|
|
- volumes.waitVolumeRemoved(5000, datasetWriteLockCondition);
|
|
|
|
|
|
+ volumes.waitVolumeRemoved(5000, datasetLockCondition);
|
|
|
|
|
|
// Removed all replica information for the blocks on the volume.
|
|
// Removed all replica information for the blocks on the volume.
|
|
// Unlike updating the volumeMap in addVolume(), this operation does
|
|
// Unlike updating the volumeMap in addVolume(), this operation does
|
|
@@ -632,7 +600,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
for(String storageUuid : storageToRemove) {
|
|
for(String storageUuid : storageToRemove) {
|
|
storageMap.remove(storageUuid);
|
|
storageMap.remove(storageUuid);
|
|
}
|
|
}
|
|
@@ -823,7 +791,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
long seekOffset) throws IOException {
|
|
long seekOffset) throws IOException {
|
|
|
|
|
|
ReplicaInfo info;
|
|
ReplicaInfo info;
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
info = volumeMap.get(b.getBlockPoolId(), b.getLocalBlock());
|
|
info = volumeMap.get(b.getBlockPoolId(), b.getLocalBlock());
|
|
}
|
|
}
|
|
|
|
|
|
@@ -911,7 +879,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public ReplicaInputStreams getTmpInputStreams(ExtendedBlock b,
|
|
public ReplicaInputStreams getTmpInputStreams(ExtendedBlock b,
|
|
long blkOffset, long metaOffset) throws IOException {
|
|
long blkOffset, long metaOffset) throws IOException {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo info = getReplicaInfo(b);
|
|
ReplicaInfo info = getReplicaInfo(b);
|
|
FsVolumeReference ref = info.getVolume().obtainReference();
|
|
FsVolumeReference ref = info.getVolume().obtainReference();
|
|
try {
|
|
try {
|
|
@@ -1036,7 +1004,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
}
|
|
}
|
|
|
|
|
|
FsVolumeReference volumeRef = null;
|
|
FsVolumeReference volumeRef = null;
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
volumeRef = volumes.getNextVolume(targetStorageType, targetStorageId,
|
|
volumeRef = volumes.getNextVolume(targetStorageType, targetStorageId,
|
|
block.getNumBytes());
|
|
block.getNumBytes());
|
|
}
|
|
}
|
|
@@ -1150,7 +1118,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
FsVolumeReference volumeRef = null;
|
|
FsVolumeReference volumeRef = null;
|
|
|
|
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
volumeRef = destination.obtainReference();
|
|
volumeRef = destination.obtainReference();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1238,7 +1206,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public ReplicaHandler append(ExtendedBlock b,
|
|
public ReplicaHandler append(ExtendedBlock b,
|
|
long newGS, long expectedBlockLen) throws IOException {
|
|
long newGS, long expectedBlockLen) throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
// If the block was successfully finalized because all packets
|
|
// If the block was successfully finalized because all packets
|
|
// were successfully processed at the Datanode but the ack for
|
|
// were successfully processed at the Datanode but the ack for
|
|
// some of the packets were not received by the client. The client
|
|
// some of the packets were not received by the client. The client
|
|
@@ -1290,7 +1258,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
private ReplicaInPipeline append(String bpid,
|
|
private ReplicaInPipeline append(String bpid,
|
|
ReplicaInfo replicaInfo, long newGS, long estimateBlockLen)
|
|
ReplicaInfo replicaInfo, long newGS, long estimateBlockLen)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
// If the block is cached, start uncaching it.
|
|
// If the block is cached, start uncaching it.
|
|
if (replicaInfo.getState() != ReplicaState.FINALIZED) {
|
|
if (replicaInfo.getState() != ReplicaState.FINALIZED) {
|
|
throw new IOException("Only a Finalized replica can be appended to; "
|
|
throw new IOException("Only a Finalized replica can be appended to; "
|
|
@@ -1386,7 +1354,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
while (true) {
|
|
while (true) {
|
|
try {
|
|
try {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo replicaInfo = recoverCheck(b, newGS, expectedBlockLen);
|
|
ReplicaInfo replicaInfo = recoverCheck(b, newGS, expectedBlockLen);
|
|
FsVolumeReference ref = replicaInfo.getVolume().obtainReference();
|
|
FsVolumeReference ref = replicaInfo.getVolume().obtainReference();
|
|
ReplicaInPipeline replica;
|
|
ReplicaInPipeline replica;
|
|
@@ -1418,7 +1386,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
LOG.info("Recover failed close " + b);
|
|
LOG.info("Recover failed close " + b);
|
|
while (true) {
|
|
while (true) {
|
|
try {
|
|
try {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
// check replica's state
|
|
// check replica's state
|
|
ReplicaInfo replicaInfo = recoverCheck(b, newGS, expectedBlockLen);
|
|
ReplicaInfo replicaInfo = recoverCheck(b, newGS, expectedBlockLen);
|
|
// bump the replica's GS
|
|
// bump the replica's GS
|
|
@@ -1440,7 +1408,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
public ReplicaHandler createRbw(
|
|
public ReplicaHandler createRbw(
|
|
StorageType storageType, String storageId, ExtendedBlock b,
|
|
StorageType storageType, String storageId, ExtendedBlock b,
|
|
boolean allowLazyPersist) throws IOException {
|
|
boolean allowLazyPersist) throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo replicaInfo = volumeMap.get(b.getBlockPoolId(),
|
|
ReplicaInfo replicaInfo = volumeMap.get(b.getBlockPoolId(),
|
|
b.getBlockId());
|
|
b.getBlockId());
|
|
if (replicaInfo != null) {
|
|
if (replicaInfo != null) {
|
|
@@ -1511,7 +1479,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
while (true) {
|
|
while (true) {
|
|
try {
|
|
try {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo replicaInfo =
|
|
ReplicaInfo replicaInfo =
|
|
getReplicaInfo(b.getBlockPoolId(), b.getBlockId());
|
|
getReplicaInfo(b.getBlockPoolId(), b.getBlockId());
|
|
// check the replica's state
|
|
// check the replica's state
|
|
@@ -1536,7 +1504,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
private ReplicaHandler recoverRbwImpl(ReplicaInPipeline rbw,
|
|
private ReplicaHandler recoverRbwImpl(ReplicaInPipeline rbw,
|
|
ExtendedBlock b, long newGS, long minBytesRcvd, long maxBytesRcvd)
|
|
ExtendedBlock b, long newGS, long minBytesRcvd, long maxBytesRcvd)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
// check generation stamp
|
|
// check generation stamp
|
|
long replicaGenerationStamp = rbw.getGenerationStamp();
|
|
long replicaGenerationStamp = rbw.getGenerationStamp();
|
|
if (replicaGenerationStamp < b.getGenerationStamp() ||
|
|
if (replicaGenerationStamp < b.getGenerationStamp() ||
|
|
@@ -1597,7 +1565,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
public ReplicaInPipeline convertTemporaryToRbw(
|
|
public ReplicaInPipeline convertTemporaryToRbw(
|
|
final ExtendedBlock b) throws IOException {
|
|
final ExtendedBlock b) throws IOException {
|
|
|
|
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final long blockId = b.getBlockId();
|
|
final long blockId = b.getBlockId();
|
|
final long expectedGs = b.getGenerationStamp();
|
|
final long expectedGs = b.getGenerationStamp();
|
|
final long visible = b.getNumBytes();
|
|
final long visible = b.getNumBytes();
|
|
@@ -1671,7 +1639,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
ReplicaInfo lastFoundReplicaInfo = null;
|
|
ReplicaInfo lastFoundReplicaInfo = null;
|
|
boolean isInPipeline = false;
|
|
boolean isInPipeline = false;
|
|
do {
|
|
do {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo currentReplicaInfo =
|
|
ReplicaInfo currentReplicaInfo =
|
|
volumeMap.get(b.getBlockPoolId(), b.getBlockId());
|
|
volumeMap.get(b.getBlockPoolId(), b.getBlockId());
|
|
if (currentReplicaInfo == lastFoundReplicaInfo) {
|
|
if (currentReplicaInfo == lastFoundReplicaInfo) {
|
|
@@ -1724,7 +1692,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
invalidate(b.getBlockPoolId(), new Block[] { lastFoundReplicaInfo },
|
|
invalidate(b.getBlockPoolId(), new Block[] { lastFoundReplicaInfo },
|
|
false);
|
|
false);
|
|
}
|
|
}
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
FsVolumeReference ref = volumes.getNextVolume(storageType, storageId, b
|
|
FsVolumeReference ref = volumes.getNextVolume(storageType, storageId, b
|
|
.getNumBytes());
|
|
.getNumBytes());
|
|
FsVolumeImpl v = (FsVolumeImpl) ref.getVolume();
|
|
FsVolumeImpl v = (FsVolumeImpl) ref.getVolume();
|
|
@@ -1775,7 +1743,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
throws IOException {
|
|
throws IOException {
|
|
ReplicaInfo replicaInfo = null;
|
|
ReplicaInfo replicaInfo = null;
|
|
ReplicaInfo finalizedReplicaInfo = null;
|
|
ReplicaInfo finalizedReplicaInfo = null;
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
if (Thread.interrupted()) {
|
|
if (Thread.interrupted()) {
|
|
// Don't allow data modifications from interrupted threads
|
|
// Don't allow data modifications from interrupted threads
|
|
throw new IOException("Cannot finalize block from Interrupted Thread");
|
|
throw new IOException("Cannot finalize block from Interrupted Thread");
|
|
@@ -1806,7 +1774,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
private ReplicaInfo finalizeReplica(String bpid, ReplicaInfo replicaInfo)
|
|
private ReplicaInfo finalizeReplica(String bpid, ReplicaInfo replicaInfo)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
// Compare generation stamp of old and new replica before finalizing
|
|
// Compare generation stamp of old and new replica before finalizing
|
|
if (volumeMap.get(bpid, replicaInfo.getBlockId()).getGenerationStamp()
|
|
if (volumeMap.get(bpid, replicaInfo.getBlockId()).getGenerationStamp()
|
|
> replicaInfo.getGenerationStamp()) {
|
|
> replicaInfo.getGenerationStamp()) {
|
|
@@ -1851,7 +1819,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
*/
|
|
*/
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public void unfinalizeBlock(ExtendedBlock b) throws IOException {
|
|
public void unfinalizeBlock(ExtendedBlock b) throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo replicaInfo = volumeMap.get(b.getBlockPoolId(),
|
|
ReplicaInfo replicaInfo = volumeMap.get(b.getBlockPoolId(),
|
|
b.getLocalBlock());
|
|
b.getLocalBlock());
|
|
if (replicaInfo != null &&
|
|
if (replicaInfo != null &&
|
|
@@ -1904,7 +1872,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
new HashMap<String, BlockListAsLongs.Builder>();
|
|
new HashMap<String, BlockListAsLongs.Builder>();
|
|
|
|
|
|
List<FsVolumeImpl> curVolumes = null;
|
|
List<FsVolumeImpl> curVolumes = null;
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
curVolumes = volumes.getVolumes();
|
|
curVolumes = volumes.getVolumes();
|
|
for (FsVolumeSpi v : curVolumes) {
|
|
for (FsVolumeSpi v : curVolumes) {
|
|
builders.put(v.getStorageID(), BlockListAsLongs.builder(maxDataLength));
|
|
builders.put(v.getStorageID(), BlockListAsLongs.builder(maxDataLength));
|
|
@@ -1959,7 +1927,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
* Gets a list of references to the finalized blocks for the given block pool.
|
|
* Gets a list of references to the finalized blocks for the given block pool.
|
|
* <p>
|
|
* <p>
|
|
* Callers of this function should call
|
|
* Callers of this function should call
|
|
- * {@link FsDatasetSpi#acquireDatasetLock()} to avoid blocks' status being
|
|
|
|
|
|
+ * {@link FsDatasetSpi#acquireDatasetLock} to avoid blocks' status being
|
|
* changed during list iteration.
|
|
* changed during list iteration.
|
|
* </p>
|
|
* </p>
|
|
* @return a list of references to the finalized blocks for the given block
|
|
* @return a list of references to the finalized blocks for the given block
|
|
@@ -1967,7 +1935,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public List<ReplicaInfo> getFinalizedBlocks(String bpid) {
|
|
public List<ReplicaInfo> getFinalizedBlocks(String bpid) {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final List<ReplicaInfo> finalized = new ArrayList<ReplicaInfo>(
|
|
final List<ReplicaInfo> finalized = new ArrayList<ReplicaInfo>(
|
|
volumeMap.size(bpid));
|
|
volumeMap.size(bpid));
|
|
for (ReplicaInfo b : volumeMap.replicas(bpid)) {
|
|
for (ReplicaInfo b : volumeMap.replicas(bpid)) {
|
|
@@ -2060,7 +2028,9 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
ReplicaInfo validateBlockFile(String bpid, long blockId) {
|
|
ReplicaInfo validateBlockFile(String bpid, long blockId) {
|
|
//Should we check for metadata file too?
|
|
//Should we check for metadata file too?
|
|
final ReplicaInfo r;
|
|
final ReplicaInfo r;
|
|
- r = volumeMap.get(bpid, blockId);
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
|
|
+ r = volumeMap.get(bpid, blockId);
|
|
|
|
+ }
|
|
if (r != null) {
|
|
if (r != null) {
|
|
if (r.blockDataExists()) {
|
|
if (r.blockDataExists()) {
|
|
return r;
|
|
return r;
|
|
@@ -2109,7 +2079,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
for (int i = 0; i < invalidBlks.length; i++) {
|
|
for (int i = 0; i < invalidBlks.length; i++) {
|
|
final ReplicaInfo removing;
|
|
final ReplicaInfo removing;
|
|
final FsVolumeImpl v;
|
|
final FsVolumeImpl v;
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final ReplicaInfo info = volumeMap.get(bpid, invalidBlks[i]);
|
|
final ReplicaInfo info = volumeMap.get(bpid, invalidBlks[i]);
|
|
if (info == null) {
|
|
if (info == null) {
|
|
ReplicaInfo infoByBlockId =
|
|
ReplicaInfo infoByBlockId =
|
|
@@ -2235,7 +2205,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
long length, genstamp;
|
|
long length, genstamp;
|
|
Executor volumeExecutor;
|
|
Executor volumeExecutor;
|
|
|
|
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ReplicaInfo info = volumeMap.get(bpid, blockId);
|
|
ReplicaInfo info = volumeMap.get(bpid, blockId);
|
|
boolean success = false;
|
|
boolean success = false;
|
|
try {
|
|
try {
|
|
@@ -2303,7 +2273,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public boolean contains(final ExtendedBlock block) {
|
|
public boolean contains(final ExtendedBlock block) {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final long blockId = block.getLocalBlock().getBlockId();
|
|
final long blockId = block.getLocalBlock().getBlockId();
|
|
final String bpid = block.getBlockPoolId();
|
|
final String bpid = block.getBlockPoolId();
|
|
final ReplicaInfo r = volumeMap.get(bpid, blockId);
|
|
final ReplicaInfo r = volumeMap.get(bpid, blockId);
|
|
@@ -2423,7 +2393,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
Block corruptBlock = null;
|
|
Block corruptBlock = null;
|
|
ReplicaInfo memBlockInfo;
|
|
ReplicaInfo memBlockInfo;
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
memBlockInfo = volumeMap.get(bpid, blockId);
|
|
memBlockInfo = volumeMap.get(bpid, blockId);
|
|
if (memBlockInfo != null &&
|
|
if (memBlockInfo != null &&
|
|
memBlockInfo.getState() != ReplicaState.FINALIZED) {
|
|
memBlockInfo.getState() != ReplicaState.FINALIZED) {
|
|
@@ -2624,7 +2594,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public String getReplicaString(String bpid, long blockId) {
|
|
public String getReplicaString(String bpid, long blockId) {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final Replica r = volumeMap.get(bpid, blockId);
|
|
final Replica r = volumeMap.get(bpid, blockId);
|
|
return r == null ? "null" : r.toString();
|
|
return r == null ? "null" : r.toString();
|
|
}
|
|
}
|
|
@@ -2731,7 +2701,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
final long recoveryId,
|
|
final long recoveryId,
|
|
final long newBlockId,
|
|
final long newBlockId,
|
|
final long newlength) throws IOException {
|
|
final long newlength) throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
//get replica
|
|
//get replica
|
|
final String bpid = oldBlock.getBlockPoolId();
|
|
final String bpid = oldBlock.getBlockPoolId();
|
|
final ReplicaInfo replica = volumeMap.get(bpid, oldBlock.getBlockId());
|
|
final ReplicaInfo replica = volumeMap.get(bpid, oldBlock.getBlockId());
|
|
@@ -2844,7 +2814,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public long getReplicaVisibleLength(final ExtendedBlock block)
|
|
public long getReplicaVisibleLength(final ExtendedBlock block)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final Replica replica = getReplicaInfo(block.getBlockPoolId(),
|
|
final Replica replica = getReplicaInfo(block.getBlockPoolId(),
|
|
block.getBlockId());
|
|
block.getBlockId());
|
|
if (replica.getGenerationStamp() < block.getGenerationStamp()) {
|
|
if (replica.getGenerationStamp() < block.getGenerationStamp()) {
|
|
@@ -2861,7 +2831,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
throws IOException {
|
|
throws IOException {
|
|
LOG.info("Adding block pool " + bpid);
|
|
LOG.info("Adding block pool " + bpid);
|
|
AddBlockPoolException volumeExceptions = new AddBlockPoolException();
|
|
AddBlockPoolException volumeExceptions = new AddBlockPoolException();
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
try {
|
|
try {
|
|
volumes.addBlockPool(bpid, conf);
|
|
volumes.addBlockPool(bpid, conf);
|
|
} catch (AddBlockPoolException e) {
|
|
} catch (AddBlockPoolException e) {
|
|
@@ -2891,7 +2861,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void shutdownBlockPool(String bpid) {
|
|
public void shutdownBlockPool(String bpid) {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
LOG.info("Removing block pool " + bpid);
|
|
LOG.info("Removing block pool " + bpid);
|
|
Map<DatanodeStorage, BlockListAsLongs> blocksPerVolume
|
|
Map<DatanodeStorage, BlockListAsLongs> blocksPerVolume
|
|
= getBlockReports(bpid);
|
|
= getBlockReports(bpid);
|
|
@@ -2965,7 +2935,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override //FsDatasetSpi
|
|
@Override //FsDatasetSpi
|
|
public void deleteBlockPool(String bpid, boolean force)
|
|
public void deleteBlockPool(String bpid, boolean force)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
List<FsVolumeImpl> curVolumes = volumes.getVolumes();
|
|
List<FsVolumeImpl> curVolumes = volumes.getVolumes();
|
|
if (!force) {
|
|
if (!force) {
|
|
for (FsVolumeImpl volume : curVolumes) {
|
|
for (FsVolumeImpl volume : curVolumes) {
|
|
@@ -2994,20 +2964,18 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override // FsDatasetSpi
|
|
@Override // FsDatasetSpi
|
|
public BlockLocalPathInfo getBlockLocalPathInfo(ExtendedBlock block)
|
|
public BlockLocalPathInfo getBlockLocalPathInfo(ExtendedBlock block)
|
|
throws IOException {
|
|
throws IOException {
|
|
- try (AutoCloseableLock lock = datasetReadLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
final Replica replica = volumeMap.get(block.getBlockPoolId(),
|
|
final Replica replica = volumeMap.get(block.getBlockPoolId(),
|
|
block.getBlockId());
|
|
block.getBlockId());
|
|
if (replica == null) {
|
|
if (replica == null) {
|
|
throw new ReplicaNotFoundException(block);
|
|
throw new ReplicaNotFoundException(block);
|
|
}
|
|
}
|
|
- synchronized(replica) {
|
|
|
|
- if (replica.getGenerationStamp() < block.getGenerationStamp()) {
|
|
|
|
- throw new IOException(
|
|
|
|
- "Replica generation stamp < block generation stamp, block="
|
|
|
|
- + block + ", replica=" + replica);
|
|
|
|
- } else if (replica.getGenerationStamp() > block.getGenerationStamp()) {
|
|
|
|
- block.setGenerationStamp(replica.getGenerationStamp());
|
|
|
|
- }
|
|
|
|
|
|
+ if (replica.getGenerationStamp() < block.getGenerationStamp()) {
|
|
|
|
+ throw new IOException(
|
|
|
|
+ "Replica generation stamp < block generation stamp, block="
|
|
|
|
+ + block + ", replica=" + replica);
|
|
|
|
+ } else if (replica.getGenerationStamp() > block.getGenerationStamp()) {
|
|
|
|
+ block.setGenerationStamp(replica.getGenerationStamp());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3048,7 +3016,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
@Override
|
|
@Override
|
|
public void onCompleteLazyPersist(String bpId, long blockId,
|
|
public void onCompleteLazyPersist(String bpId, long blockId,
|
|
long creationTime, File[] savedFiles, FsVolumeImpl targetVolume) {
|
|
long creationTime, File[] savedFiles, FsVolumeImpl targetVolume) {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
ramDiskReplicaTracker.recordEndLazyPersist(bpId, blockId, savedFiles);
|
|
ramDiskReplicaTracker.recordEndLazyPersist(bpId, blockId, savedFiles);
|
|
|
|
|
|
targetVolume.incDfsUsedAndNumBlocks(bpId, savedFiles[0].length()
|
|
targetVolume.incDfsUsedAndNumBlocks(bpId, savedFiles[0].length()
|
|
@@ -3182,7 +3150,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
try {
|
|
try {
|
|
block = ramDiskReplicaTracker.dequeueNextReplicaToPersist();
|
|
block = ramDiskReplicaTracker.dequeueNextReplicaToPersist();
|
|
if (block != null) {
|
|
if (block != null) {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
replicaInfo = volumeMap.get(block.getBlockPoolId(), block.getBlockId());
|
|
replicaInfo = volumeMap.get(block.getBlockPoolId(), block.getBlockId());
|
|
|
|
|
|
// If replicaInfo is null, the block was either deleted before
|
|
// If replicaInfo is null, the block was either deleted before
|
|
@@ -3249,7 +3217,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
ReplicaInfo replicaInfo, newReplicaInfo;
|
|
ReplicaInfo replicaInfo, newReplicaInfo;
|
|
final String bpid = replicaState.getBlockPoolId();
|
|
final String bpid = replicaState.getBlockPoolId();
|
|
|
|
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
replicaInfo = getReplicaInfo(replicaState.getBlockPoolId(),
|
|
replicaInfo = getReplicaInfo(replicaState.getBlockPoolId(),
|
|
replicaState.getBlockId());
|
|
replicaState.getBlockId());
|
|
Preconditions.checkState(replicaInfo.getVolume().isTransientStorage());
|
|
Preconditions.checkState(replicaInfo.getVolume().isTransientStorage());
|
|
@@ -3422,7 +3390,7 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
|
|
}
|
|
}
|
|
|
|
|
|
void stopAllDataxceiverThreads(FsVolumeImpl volume) {
|
|
void stopAllDataxceiverThreads(FsVolumeImpl volume) {
|
|
- try (AutoCloseableLock lock = datasetWriteLock.acquire()) {
|
|
|
|
|
|
+ try (AutoCloseableLock lock = datasetLock.acquire()) {
|
|
for (String bpid : volumeMap.getBlockPoolList()) {
|
|
for (String bpid : volumeMap.getBlockPoolList()) {
|
|
Collection<ReplicaInfo> replicas = volumeMap.replicas(bpid);
|
|
Collection<ReplicaInfo> replicas = volumeMap.replicas(bpid);
|
|
for (ReplicaInfo replicaInfo : replicas) {
|
|
for (ReplicaInfo replicaInfo : replicas) {
|