/// <summary> /// If some blocks at the end of the block list no longer belongs to /// any inode, collect them and update the block list. /// </summary> public virtual void CollectBlocksAndClear(BlockStoragePolicySuite bsps, INodeFile file, INode.BlocksMapUpdateInfo info, IList <INode> removedINodes) { // check if everything is deleted. if (IsCurrentFileDeleted() && GetDiffs().AsList().IsEmpty()) { file.DestroyAndCollectBlocks(bsps, info, removedINodes); return; } // find max file size. long max; FileDiff diff = GetDiffs().GetLast(); if (IsCurrentFileDeleted()) { max = diff == null ? 0 : diff.GetFileSize(); } else { max = file.ComputeFileSize(); } // Collect blocks that should be deleted FileDiff last = diffs.GetLast(); BlockInfoContiguous[] snapshotBlocks = last == null ? null : last.GetBlocks(); if (snapshotBlocks == null) { file.CollectBlocksBeyondMax(max, info); } else { file.CollectBlocksBeyondSnapshot(snapshotBlocks, info); } }