Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,8 @@ private Boolean checkInadequateReplica(Set<ContainerReplica> replicas,
private void addTxToTxSizeMap(DeletedBlocksTransaction tx) {
if (tx.hasTotalBlockReplicatedSize()) {
transactionStatusManager.getTxSizeMap().put(tx.getTxID(),
new SCMDeletedBlockTransactionStatusManager.TxBlockInfo(tx.getLocalIDCount(),
tx.getTotalBlockSize(), tx.getTotalBlockReplicatedSize()));
new SCMDeletedBlockTransactionStatusManager.TxBlockInfo(tx.getTxID(), tx.getContainerID(),
tx.getLocalIDCount(), tx.getTotalBlockSize(), tx.getTotalBlockReplicatedSize()));
}
}

Expand Down Expand Up @@ -507,6 +507,11 @@ public void onMessage(
return;
}

if (!scmContext.isLeaderReady()) {
LOG.warn("SCM is not ready to commit transactions.");
return;
}

DatanodeDetails details = deleteBlockStatus.getDatanodeDetails();
DatanodeID dnId = details.getID();
for (CommandStatus commandStatus : deleteBlockStatus.getCmdStatus()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -467,17 +467,50 @@ public void addTransactions(ArrayList<DeletedBlocksTransaction> txList) throws I
incrDeletedBlocksSummary(tx);
}
}
deletedBlockLogStateManager.addTransactionsToDB(txList, getSummary());
try {
deletedBlockLogStateManager.addTransactionsToDB(txList, getSummary());
} catch (IOException e) {
// Revert the in-memory changes if the DB update fails
for (DeletedBlocksTransaction tx: txList) {
if (tx.hasTotalBlockSize()) {
descDeletedBlocksSummary(tx);
LOG.warn("TxBlockInfo{txId={}, containerId={}, totalBlockCount={}, totalBlockSize={}, " +
"totalReplicatedBlocksSize: {}} is decreased from summary due to DB update failure",
tx.getTxID(), tx.getContainerID(), tx.getLocalIDCount(), tx.getTotalBlockSize(),
tx.getTotalBlockReplicatedSize());
}
}
throw e;
}
return;
}
deletedBlockLogStateManager.addTransactionsToDB(txList);
}

private void incrDeletedBlocksSummary(TxBlockInfo txBlockInfo) {
totalTxCount.addAndGet(1);
totalBlockCount.addAndGet(txBlockInfo.getTotalBlockCount());
totalBlocksSize.addAndGet(txBlockInfo.getTotalBlockSize());
totalReplicatedBlocksSize.addAndGet(txBlockInfo.getTotalReplicatedBlockSize());
if (LOG.isDebugEnabled()) {
LOG.debug("Increase summary for tx {}, to totalTxCount: {}, totalBlockCount: {}, totalBlocksSize: {}, " +
"totalReplicatedBlocksSize: {}", txBlockInfo, totalTxCount.get(), totalBlockCount.get(),
totalBlocksSize.get(), totalReplicatedBlocksSize.get());
}
}

private void incrDeletedBlocksSummary(DeletedBlocksTransaction tx) {
totalTxCount.addAndGet(1);
totalBlockCount.addAndGet(tx.getLocalIDCount());
totalBlocksSize.addAndGet(tx.getTotalBlockSize());
totalReplicatedBlocksSize.addAndGet(tx.getTotalBlockReplicatedSize());
if (LOG.isDebugEnabled()) {
LOG.debug("Increase summary for TxBlockInfo{txId={}, containerId={}, totalBlockCount={}, totalBlockSize={}, " +
"totalReplicatedBlockSize={}}' to totalTxCount: {}, totalBlockCount: {}, totalBlocksSize: {}, " +
"totalReplicatedBlocksSize: {}", tx.getTxID(), tx.getContainerID(), tx.getLocalIDCount(),
tx.getTotalBlockSize(), tx.getTotalBlockReplicatedSize(),
totalTxCount.get(), totalBlockCount.get(), totalBlocksSize.get(), totalReplicatedBlocksSize.get());
}
}

@VisibleForTesting
Expand All @@ -487,13 +520,25 @@ public void removeTransactions(ArrayList<Long> txIDs) throws IOException {
}
if (VersionedDatanodeFeatures.isFinalized(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION) &&
!disableDataDistributionForTest) {
List<TxBlockInfo> removedTxBlockInfos = new ArrayList<>();
for (Long txID: txIDs) {
TxBlockInfo txBlockInfo = txSizeMap.remove(txID);
if (txBlockInfo != null) {
descDeletedBlocksSummary(txBlockInfo);
removedTxBlockInfos.add(txBlockInfo);
}
}
try {
deletedBlockLogStateManager.removeTransactionsFromDB(txIDs, getSummary());
} catch (IOException e) {
// Revert the in-memory changes if the DB update fails
for (TxBlockInfo txBlockInfo : removedTxBlockInfos) {
txSizeMap.put(txBlockInfo.getTxId(), txBlockInfo);
incrDeletedBlocksSummary(txBlockInfo);
LOG.warn("{} is added back to txSizeMap and increased to summary due to DB update failure", txBlockInfo);
}
throw e;
}
deletedBlockLogStateManager.removeTransactionsFromDB(txIDs, getSummary());
return;
}

Expand Down Expand Up @@ -590,6 +635,25 @@ private void descDeletedBlocksSummary(TxBlockInfo txBlockInfo) {
totalBlockCount.addAndGet(-txBlockInfo.getTotalBlockCount());
totalBlocksSize.addAndGet(-txBlockInfo.getTotalBlockSize());
totalReplicatedBlocksSize.addAndGet(-txBlockInfo.getTotalReplicatedBlockSize());
if (LOG.isDebugEnabled()) {
LOG.debug("Decrease summary for tx {}, to totalTxCount: {}, totalBlockCount: {}, totalBlocksSize: {}, " +
"totalReplicatedBlocksSize: {}", txBlockInfo, totalTxCount.get(), totalBlockCount.get(),
totalBlocksSize.get(), totalReplicatedBlocksSize.get());
}
}

private void descDeletedBlocksSummary(DeletedBlocksTransaction tx) {
totalTxCount.addAndGet(-1);
totalBlockCount.addAndGet(-tx.getLocalIDCount());
totalBlocksSize.addAndGet(-tx.getTotalBlockSize());
totalReplicatedBlocksSize.addAndGet(-tx.getTotalBlockReplicatedSize());
if (LOG.isDebugEnabled()) {
LOG.debug("Decrease summary for TxBlockInfo{txId={}, containerId={}, totalBlockCount={}, totalBlockSize={}, " +
"totalReplicatedBlockSize={}} to totalTxCount: {}, totalBlockCount: {}, totalBlocksSize: {}, " +
" totalReplicatedBlocksSize: {}", tx.getTxID(), tx.getContainerID(), tx.getLocalIDCount(),
tx.getTotalBlockSize(), tx.getTotalBlockReplicatedSize(),
totalTxCount.get(), totalBlockCount.get(), totalBlocksSize.get(), totalReplicatedBlocksSize.get());
}
}

@VisibleForTesting
Expand Down Expand Up @@ -674,15 +738,29 @@ public DeletedBlocksTransactionSummary getTransactionSummary() {
}

private void initDataDistributionData() throws IOException {
DeletedBlocksTransactionSummary summary = loadDeletedBlocksSummary();
if (summary != null) {
totalTxCount.set(summary.getTotalTransactionCount());
totalBlockCount.set(summary.getTotalBlockCount());
totalBlocksSize.set(summary.getTotalBlockSize());
totalReplicatedBlocksSize.set(summary.getTotalBlockReplicatedSize());
DeletedBlocksTransactionSummary newSummary = loadDeletedBlocksSummary();
if (newSummary != null) {
DeletedBlocksTransactionSummary currentSummary = getSummary();
if (currentSummary.getTotalTransactionCount() != newSummary.getTotalTransactionCount() ||
currentSummary.getTotalBlockCount() != newSummary.getTotalBlockCount() ||
currentSummary.getTotalBlockSize() != newSummary.getTotalBlockSize() ||
currentSummary.getTotalBlockReplicatedSize() != newSummary.getTotalBlockReplicatedSize()) {
LOG.warn("Replace old summary {} {} {} {} with new summary {} {} {} {}",
currentSummary.getTotalTransactionCount(), currentSummary.getTotalBlockCount(),
currentSummary.getTotalBlockSize(), currentSummary.getTotalBlockReplicatedSize(),
newSummary.getTotalTransactionCount(), newSummary.getTotalBlockCount(),
newSummary.getTotalBlockSize(), newSummary.getTotalBlockReplicatedSize());
}
totalTxCount.set(newSummary.getTotalTransactionCount());
totalBlockCount.set(newSummary.getTotalBlockCount());
totalBlocksSize.set(newSummary.getTotalBlockSize());
totalReplicatedBlocksSize.set(newSummary.getTotalBlockReplicatedSize());
LOG.info("Storage space distribution is initialized with totalTxCount {}, totalBlockCount {}, " +
"totalBlocksSize {} and totalReplicatedBlocksSize {}", totalTxCount.get(),
totalBlockCount.get(), totalBlocksSize.get(), totalReplicatedBlocksSize.get());
} else {
LOG.info("Storage space distribution is initialized with totalTxCount 0, totalBlockCount 0, " +
"totalBlocksSize 0 and totalReplicatedBlocksSize 0");
}
}

Expand All @@ -706,11 +784,15 @@ private DeletedBlocksTransactionSummary loadDeletedBlocksSummary() throws IOExce
* Block size information of a transaction.
*/
public static class TxBlockInfo {
private long totalBlockCount;
private long totalBlockSize;
private long totalReplicatedBlockSize;

public TxBlockInfo(long blockCount, long blockSize, long replicatedSize) {
private final long txId;
private final long containerId;
private final long totalBlockCount;
private final long totalBlockSize;
private final long totalReplicatedBlockSize;

public TxBlockInfo(long txId, long containerId, long blockCount, long blockSize, long replicatedSize) {
this.txId = txId;
this.containerId = containerId;
this.totalBlockCount = blockCount;
this.totalBlockSize = blockSize;
this.totalReplicatedBlockSize = replicatedSize;
Expand All @@ -727,5 +809,24 @@ public long getTotalBlockSize() {
public long getTotalReplicatedBlockSize() {
return totalReplicatedBlockSize;
}

public long getTxId() {
return txId;
}

public long getContainerId() {
return containerId;
}

@Override
public String toString() {
return "TxBlockInfo{" +
"txId=" + txId +
", containerId=" + containerId +
", totalBlockCount=" + totalBlockCount +
", totalBlockSize=" + totalBlockSize +
", totalReplicatedBlockSize=" + totalReplicatedBlockSize +
'}';
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -899,7 +899,7 @@ public void testAddRemoveTransactionPerformance(int txCount, boolean dataDistrib
Map<Long, TxBlockInfo> txSizeMap = statusManager.getTxSizeMap();
for (Map.Entry<Long, List<DeletedBlock>> entry : data.entrySet()) {
List<DeletedBlock> deletedBlockList = entry.getValue();
TxBlockInfo txBlockInfo = new TxBlockInfo(deletedBlockList.size(),
TxBlockInfo txBlockInfo = new TxBlockInfo(entry.getKey(), 0, deletedBlockList.size(),
deletedBlockList.stream().map(DeletedBlock::getSize).reduce(0L, Long::sum),
deletedBlockList.stream().map(DeletedBlock::getReplicatedSize).reduce(0L, Long::sum));
txSizeMap.put(entry.getKey(), txBlockInfo);
Expand Down
Loading