/** * Rename a snapshot * * @param path The directory path where the snapshot was taken. Used for generating exception * message. * @param oldName Old name of the snapshot * @param newName New name the snapshot will be renamed to * @throws SnapshotException Throw SnapshotException when either the snapshot with the old name * does not exist or a snapshot with the new name already exists */ public void renameSnapshot(String path, String oldName, String newName) throws SnapshotException { if (newName.equals(oldName)) { return; } final int indexOfOld = searchSnapshot(DFSUtil.string2Bytes(oldName)); if (indexOfOld < 0) { throw new SnapshotException( "The snapshot " + oldName + " does not exist for directory " + path); } else { final byte[] newNameBytes = DFSUtil.string2Bytes(newName); int indexOfNew = searchSnapshot(newNameBytes); if (indexOfNew > 0) { throw new SnapshotException( "The snapshot " + newName + " already exists for directory " + path); } // remove the one with old name from snapshotsByNames Snapshot snapshot = snapshotsByNames.remove(indexOfOld); final INodeDirectory ssRoot = snapshot.getRoot(); ssRoot.setLocalName(newNameBytes); indexOfNew = -indexOfNew - 1; if (indexOfNew <= indexOfOld) { snapshotsByNames.add(indexOfNew, snapshot); } else { // indexOfNew > indexOfOld snapshotsByNames.add(indexOfNew - 1, snapshot); } } }