/** * @param level inode level; at least 1 * @param inode exclusive latched parent inode; always released by this method */ private void deleteMultilevelFragments(int level, _Node inode, long vlength) throws IOException { long page = inode.mPage; level--; long levelCap = levelCap(level); // Copy all child node ids and release parent latch early. int childNodeCount = (int) ((vlength + (levelCap - 1)) / levelCap); long[] childNodeIds = new long[childNodeCount]; for (int poffset = 0, i=0; i<childNodeCount; poffset += 6, i++) { childNodeIds[i] = p_uint48GetLE(page, poffset); } deleteNode(inode); if (level <= 0) for (long childNodeId : childNodeIds) { deleteFragment(childNodeId); } else for (long childNodeId : childNodeIds) { long len = Math.min(levelCap, vlength); if (childNodeId != 0) { _Node childNode = removeInode(childNodeId); deleteMultilevelFragments(level, childNode, len); } vlength -= len; } }
/** * @param level inode level; at least 1 * @param inode exclusive latched parent inode; always released by this method */ private void deleteMultilevelFragments(int level, _Node inode, long vlength) throws IOException { long page = inode.mPage; level--; long levelCap = levelCap(level); // Copy all child node ids and release parent latch early. int childNodeCount = (int) ((vlength + (levelCap - 1)) / levelCap); long[] childNodeIds = new long[childNodeCount]; for (int poffset = 0, i=0; i<childNodeCount; poffset += 6, i++) { childNodeIds[i] = p_uint48GetLE(page, poffset); } deleteNode(inode); if (level <= 0) for (long childNodeId : childNodeIds) { deleteFragment(childNodeId); } else for (long childNodeId : childNodeIds) { long len = Math.min(levelCap, vlength); if (childNodeId != 0) { _Node childNode = removeInode(childNodeId); deleteMultilevelFragments(level, childNode, len); } vlength -= len; } }
/** * @param level inode level; at least 1 * @param inode exclusive latched parent inode; always released by this method */ private void deleteMultilevelFragments(int level, _Node inode, long vlength) throws IOException { long page = inode.mPage; level--; long levelCap = levelCap(level); // Copy all child node ids and release parent latch early. int childNodeCount = childNodeCount(vlength, levelCap); long[] childNodeIds = new long[childNodeCount]; for (int poffset = 0, i=0; i<childNodeCount; poffset += 6, i++) { childNodeIds[i] = p_uint48GetLE(page, poffset); } deleteNode(inode); if (level <= 0) for (long childNodeId : childNodeIds) { deleteFragment(childNodeId); } else for (long childNodeId : childNodeIds) { long len = Math.min(levelCap, vlength); if (childNodeId != 0) { _Node childNode = removeInode(childNodeId); deleteMultilevelFragments(level, childNode, len); } vlength -= len; } }
off += 6; len -= 6; deleteFragment(nodeId);
off += 6; len -= 6; deleteFragment(nodeId);
off += 6; len -= 6; deleteFragment(nodeId);
if (level <= 0) { if (txn == null) { db.deleteFragment(childNodeId); break full;
deleteFragment(decodeUnsignedInt48LE(newValue, poffset)); deleteFragment(decodeUnsignedInt48LE(newValue, poffset));
deleteFragment(decodeUnsignedInt48LE(newValue, poffset)); deleteFragment(decodeUnsignedInt48LE(newValue, poffset));
deleteFragment(decodeUnsignedInt48LE(newValue, poffset)); deleteFragment(decodeUnsignedInt48LE(newValue, poffset));
db.deleteFragment(fNodeId); } else { _Node fNode = db.nodeMapLoadFragmentExclusive(fNodeId, true);