/** * Delete the specified snapshot * @param snapshot * @throws SnapshotDoesNotExistException If the specified snapshot does not exist. * @throws IOException For filesystem IOExceptions */ public void deleteSnapshot(SnapshotDescription snapshot) throws SnapshotDoesNotExistException, IOException { // check to see if it is completed if (!isSnapshotCompleted(snapshot)) { throw new SnapshotDoesNotExistException(snapshot); } String snapshotName = snapshot.getName(); // first create the snapshot description and check to see if it exists FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir); // Get snapshot info from file system. The one passed as parameter is a "fake" snapshotInfo with // just the "name" and it does not contains the "real" snapshot information snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); // call coproc pre hook MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost(); if (cpHost != null) { cpHost.preDeleteSnapshot(snapshot); } LOG.debug("Deleting snapshot: " + snapshotName); // delete the existing snapshot if (!fs.delete(snapshotDir, true)) { throw new HBaseSnapshotException("Failed to delete snapshot directory: " + snapshotDir); } // call coproc post hook if (cpHost != null) { cpHost.postDeleteSnapshot(snapshot); } }
/** * Delete the specified snapshot * @param snapshot * @throws SnapshotDoesNotExistException If the specified snapshot does not exist. * @throws IOException For filesystem IOExceptions */ public void deleteSnapshot(SnapshotDescription snapshot) throws SnapshotDoesNotExistException, IOException { // call coproc pre hook MasterCoprocessorHost cpHost = master.getCoprocessorHost(); if (cpHost != null) { cpHost.preDeleteSnapshot(snapshot); } // check to see if it is completed if (!isSnapshotCompleted(snapshot)) { throw new SnapshotDoesNotExistException(snapshot); } String snapshotName = snapshot.getName(); LOG.debug("Deleting snapshot: " + snapshotName); // first create the snapshot description and check to see if it exists MasterFileSystem fs = master.getMasterFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir); // delete the existing snapshot if (!fs.getFileSystem().delete(snapshotDir, true)) { throw new HBaseSnapshotException("Failed to delete snapshot directory: " + snapshotDir); } // call coproc post hook if (cpHost != null) { cpHost.postDeleteSnapshot(snapshot); } }
/** * Delete the specified snapshot * @param snapshot * @throws SnapshotDoesNotExistException If the specified snapshot does not exist. * @throws IOException For filesystem IOExceptions */ public void deleteSnapshot(SnapshotDescription snapshot) throws SnapshotDoesNotExistException, IOException { // call coproc pre hook MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost(); if (cpHost != null) { cpHost.preDeleteSnapshot(snapshot); } // check to see if it is completed if (!isSnapshotCompleted(snapshot)) { throw new SnapshotDoesNotExistException(snapshot); } String snapshotName = snapshot.getName(); LOG.debug("Deleting snapshot: " + snapshotName); // first create the snapshot description and check to see if it exists MasterFileSystem fs = master.getMasterFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir); // delete the existing snapshot if (!fs.getFileSystem().delete(snapshotDir, true)) { throw new HBaseSnapshotException("Failed to delete snapshot directory: " + snapshotDir); } // call coproc post hook if (cpHost != null) { cpHost.postDeleteSnapshot(snapshot); } }
/** * Delete the specified snapshot * @param snapshot * @throws SnapshotDoesNotExistException If the specified snapshot does not exist. * @throws IOException For filesystem IOExceptions */ public void deleteSnapshot(SnapshotDescription snapshot) throws SnapshotDoesNotExistException, IOException { // check to see if it is completed if (!isSnapshotCompleted(snapshot)) { throw new SnapshotDoesNotExistException(ProtobufUtil.createSnapshotDesc(snapshot)); } String snapshotName = snapshot.getName(); // first create the snapshot description and check to see if it exists FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir); // Get snapshot info from file system. The one passed as parameter is a "fake" snapshotInfo with // just the "name" and it does not contains the "real" snapshot information snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); // call coproc pre hook MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost(); org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null; if (cpHost != null) { snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot); cpHost.preDeleteSnapshot(snapshotPOJO); } LOG.debug("Deleting snapshot: " + snapshotName); // delete the existing snapshot if (!fs.delete(snapshotDir, true)) { throw new HBaseSnapshotException("Failed to delete snapshot directory: " + snapshotDir); } // call coproc post hook if (cpHost != null) { cpHost.postDeleteSnapshot(snapshotPOJO); } }
/** * Restore or Clone the specified snapshot * @param reqSnapshot * @param nonceKey unique identifier to prevent duplicated RPC * @throws IOException */ public long restoreOrCloneSnapshot(final SnapshotDescription reqSnapshot, final NonceKey nonceKey, final boolean restoreAcl) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException( ProtobufUtil.createSnapshotDesc(reqSnapshot)); } // Get snapshot info from file system. The reqSnapshot is a "fake" snapshotInfo with // just the snapshot "name" and table name to restore. It does not contains the "real" snapshot // information. SnapshotDescription snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); SnapshotManifest manifest = SnapshotManifest.open(master.getConfiguration(), fs, snapshotDir, snapshot); TableDescriptor snapshotTableDesc = manifest.getTableDescriptor(); TableName tableName = TableName.valueOf(reqSnapshot.getTable()); // stop tracking "abandoned" handlers cleanupSentinels(); // Verify snapshot validity SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, manifest); // Execute the restore/clone operation long procId; if (MetaTableAccessor.tableExists(master.getConnection(), tableName)) { procId = restoreSnapshot(reqSnapshot, tableName, snapshot, snapshotTableDesc, nonceKey, restoreAcl); } else { procId = cloneSnapshot(reqSnapshot, tableName, snapshot, snapshotTableDesc, nonceKey, restoreAcl); } return procId; }
@Test(timeout = 300000) public void testListTableSnapshotsWithRegex() throws Exception { Admin admin = null; try { admin = UTIL.getAdmin(); String table1Snapshot1 = "Table1Snapshot1"; admin.snapshot(table1Snapshot1, TABLE_NAME); LOG.debug("Snapshot1 completed."); String table1Snapshot2 = "Table1Snapshot2"; admin.snapshot(table1Snapshot2, TABLE_NAME); LOG.debug("Snapshot2 completed."); String table2Snapshot1 = "Table2Snapshot1"; admin.snapshot(Bytes.toBytes(table2Snapshot1), TABLE_NAME); LOG.debug(table2Snapshot1 + " completed."); List<SnapshotDescription> listTableSnapshots = admin.listTableSnapshots(Pattern.compile("test.*"), Pattern.compile("Table1.*")); List<String> listTableSnapshotNames = new ArrayList<>(); assertEquals(2, listTableSnapshots.size()); for (SnapshotDescription s : listTableSnapshots) { listTableSnapshotNames.add(s.getName()); } assertTrue(listTableSnapshotNames.contains(table1Snapshot1)); assertTrue(listTableSnapshotNames.contains(table1Snapshot2)); assertFalse(listTableSnapshotNames.contains(table2Snapshot1)); } finally { if (admin != null) { try { admin.deleteSnapshots(Pattern.compile("Table.*")); } catch (SnapshotDoesNotExistException ignore) { } admin.close(); } } }
@Test(timeout = 300000) public void testDeleteTableSnapshotsWithRegex() throws Exception { Admin admin = null; Pattern tableNamePattern = Pattern.compile("test.*"); try { admin = UTIL.getAdmin(); String table1Snapshot1 = "Table1Snapshot1"; admin.snapshot(table1Snapshot1, TABLE_NAME); LOG.debug("Snapshot1 completed."); String table1Snapshot2 = "Table1Snapshot2"; admin.snapshot(table1Snapshot2, TABLE_NAME); LOG.debug("Snapshot2 completed."); String table2Snapshot1 = "Table2Snapshot1"; admin.snapshot(Bytes.toBytes(table2Snapshot1), TABLE_NAME); LOG.debug(table2Snapshot1 + " completed."); admin.deleteTableSnapshots(tableNamePattern, Pattern.compile("Table1.*")); assertEquals(1, admin.listTableSnapshots(tableNamePattern, MATCH_ALL).size()); } finally { if (admin != null) { try { admin.deleteTableSnapshots(tableNamePattern, MATCH_ALL); } catch (SnapshotDoesNotExistException ignore) { } admin.close(); } } }
@Test(expected=SnapshotDoesNotExistException.class) public void testCloneNonExistentSnapshot() throws IOException, InterruptedException { String snapshotName = "random-snapshot-" + System.currentTimeMillis(); TableName tableName = TableName.valueOf("random-table-" + System.currentTimeMillis()); admin.cloneSnapshot(snapshotName, tableName); }
/** * Restore the specified snapshot * @param reqSnapshot * @throws IOException */ public void restoreSnapshot(SnapshotDescription reqSnapshot) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); MasterCoprocessorHost cpHost = master.getCoprocessorHost(); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException(reqSnapshot); } // read snapshot information SnapshotDescription fsSnapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); HTableDescriptor snapshotTableDesc = FSTableDescriptors.getTableDescriptor(fs, snapshotDir); String tableName = reqSnapshot.getTable(); // stop tracking "abandoned" handlers cleanupSentinels(); // Verify snapshot validity SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, snapshotDir, fsSnapshot); // Execute the restore/clone operation if (MetaReader.tableExists(master.getCatalogTracker(), tableName)) { if (master.getAssignmentManager().getZKTable().isEnabledTable(fsSnapshot.getTable())) { throw new UnsupportedOperationException("Table '" + fsSnapshot.getTable() + "' must be disabled in order to perform a restore operation."); } // call coproc pre hook if (cpHost != null) { cpHost.preRestoreSnapshot(reqSnapshot, snapshotTableDesc); } restoreSnapshot(fsSnapshot, snapshotTableDesc); LOG.info("Restore snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postRestoreSnapshot(reqSnapshot, snapshotTableDesc); } } else { HTableDescriptor htd = RestoreSnapshotHelper.cloneTableSchema(snapshotTableDesc, Bytes.toBytes(tableName)); if (cpHost != null) { cpHost.preCloneSnapshot(reqSnapshot, htd); } cloneSnapshot(fsSnapshot, htd); LOG.info("Clone snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postCloneSnapshot(reqSnapshot, htd); } } }
@Test(expected=SnapshotDoesNotExistException.class) public void testCloneNonExistentSnapshot() throws IOException, InterruptedException { String snapshotName = "random-snapshot-" + System.currentTimeMillis(); String tableName = "random-table-" + System.currentTimeMillis(); admin.cloneSnapshot(snapshotName, tableName); }
/** * Restore the specified snapshot * @param reqSnapshot * @throws IOException */ public void restoreSnapshot(SnapshotDescription reqSnapshot) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost(); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException(reqSnapshot); } // read snapshot information SnapshotDescription fsSnapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); SnapshotManifest manifest = SnapshotManifest.open(master.getConfiguration(), fs, snapshotDir, fsSnapshot); HTableDescriptor snapshotTableDesc = manifest.getTableDescriptor(); TableName tableName = TableName.valueOf(reqSnapshot.getTable()); // stop tracking "abandoned" handlers cleanupSentinels(); // Verify snapshot validity SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, manifest); // Execute the restore/clone operation if (MetaTableAccessor.tableExists(master.getConnection(), tableName)) { if (master.getAssignmentManager().getTableStateManager().isTableState( TableName.valueOf(fsSnapshot.getTable()), ZooKeeperProtos.Table.State.ENABLED)) { throw new UnsupportedOperationException("Table '" + TableName.valueOf(fsSnapshot.getTable()) + "' must be disabled in order to " + "perform a restore operation" + "."); } // call coproc pre hook if (cpHost != null) { cpHost.preRestoreSnapshot(reqSnapshot, snapshotTableDesc); } restoreSnapshot(fsSnapshot, snapshotTableDesc); LOG.info("Restore snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postRestoreSnapshot(reqSnapshot, snapshotTableDesc); } } else { HTableDescriptor htd = RestoreSnapshotHelper.cloneTableSchema(snapshotTableDesc, tableName); if (cpHost != null) { cpHost.preCloneSnapshot(reqSnapshot, htd); } cloneSnapshot(fsSnapshot, htd); LOG.info("Clone snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postCloneSnapshot(reqSnapshot, htd); } } }
/** * Restore the specified snapshot * @param reqSnapshot * @throws IOException */ public void restoreSnapshot(SnapshotDescription reqSnapshot) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); MasterCoprocessorHost cpHost = master.getCoprocessorHost(); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException(reqSnapshot); } // read snapshot information SnapshotDescription fsSnapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); HTableDescriptor snapshotTableDesc = FSTableDescriptors.getTableDescriptorFromFs(fs, snapshotDir); TableName tableName = TableName.valueOf(reqSnapshot.getTable()); // stop tracking "abandoned" handlers cleanupSentinels(); // Verify snapshot validity SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, snapshotDir, fsSnapshot); // Execute the restore/clone operation if (MetaReader.tableExists(master.getCatalogTracker(), tableName)) { if (master.getAssignmentManager().getZKTable().isEnabledTable( TableName.valueOf(fsSnapshot.getTable()))) { throw new UnsupportedOperationException("Table '" + TableName.valueOf(fsSnapshot.getTable()) + "' must be disabled in order to " + "perform a restore operation" + "."); } // call coproc pre hook if (cpHost != null) { cpHost.preRestoreSnapshot(reqSnapshot, snapshotTableDesc); } restoreSnapshot(fsSnapshot, snapshotTableDesc); LOG.info("Restore snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postRestoreSnapshot(reqSnapshot, snapshotTableDesc); } } else { HTableDescriptor htd = RestoreSnapshotHelper.cloneTableSchema(snapshotTableDesc, tableName); if (cpHost != null) { cpHost.preCloneSnapshot(reqSnapshot, htd); } cloneSnapshot(fsSnapshot, htd); LOG.info("Clone snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postCloneSnapshot(reqSnapshot, htd); } } }
@Test(expected=SnapshotDoesNotExistException.class) public void testCloneNonExistentSnapshot() throws IOException, InterruptedException { String snapshotName = "random-snapshot-" + System.currentTimeMillis(); final TableName tableName = TableName.valueOf(name.getMethodName() + "-" + System.currentTimeMillis()); admin.cloneSnapshot(snapshotName, tableName); }
@Test(timeout = 300000) public void testListTableSnapshots() throws Exception { Admin admin = null; final TableName tableName = TableName.valueOf(name.getMethodName()); try { admin = UTIL.getAdmin(); HTableDescriptor htd = new HTableDescriptor(tableName); UTIL.createTable(htd, new byte[][] { TEST_FAM }, UTIL.getConfiguration()); String table1Snapshot1 = "Table1Snapshot1"; admin.snapshot(table1Snapshot1, TABLE_NAME); LOG.debug("Snapshot1 completed."); String table1Snapshot2 = "Table1Snapshot2"; admin.snapshot(table1Snapshot2, TABLE_NAME); LOG.debug("Snapshot2 completed."); String table2Snapshot1 = "Table2Snapshot1"; admin.snapshot(Bytes.toBytes(table2Snapshot1), tableName); LOG.debug(table2Snapshot1 + " completed."); List<SnapshotDescription> listTableSnapshots = admin.listTableSnapshots(Pattern.compile("test.*"), MATCH_ALL); List<String> listTableSnapshotNames = new ArrayList<>(); assertEquals(3, listTableSnapshots.size()); for (SnapshotDescription s : listTableSnapshots) { listTableSnapshotNames.add(s.getName()); } assertTrue(listTableSnapshotNames.contains(table1Snapshot1)); assertTrue(listTableSnapshotNames.contains(table1Snapshot2)); assertTrue(listTableSnapshotNames.contains(table2Snapshot1)); } finally { if (admin != null) { try { admin.deleteSnapshots(Pattern.compile("Table.*")); } catch (SnapshotDoesNotExistException ignore) { } if (admin.tableExists(tableName)) { UTIL.deleteTable(tableName); } admin.close(); } } }
/** * Restore the specified snapshot * @param reqSnapshot * @throws IOException */ public void restoreSnapshot(SnapshotDescription reqSnapshot) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost(); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException(reqSnapshot); } // read snapshot information SnapshotDescription fsSnapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); SnapshotManifest manifest = SnapshotManifest.open(master.getConfiguration(), fs, snapshotDir, fsSnapshot); HTableDescriptor snapshotTableDesc = manifest.getTableDescriptor(); TableName tableName = TableName.valueOf(reqSnapshot.getTable()); // stop tracking "abandoned" handlers cleanupSentinels(); // Verify snapshot validity SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, manifest); // Execute the restore/clone operation if (MetaReader.tableExists(master.getCatalogTracker(), tableName)) { if (master.getAssignmentManager().getTableStateManager().isTableState( TableName.valueOf(fsSnapshot.getTable()), ZooKeeperProtos.Table.State.ENABLED)) { throw new UnsupportedOperationException("Table '" + TableName.valueOf(fsSnapshot.getTable()) + "' must be disabled in order to " + "perform a restore operation" + "."); } // call coproc pre hook if (cpHost != null) { cpHost.preRestoreSnapshot(reqSnapshot, snapshotTableDesc); } restoreSnapshot(fsSnapshot, snapshotTableDesc); LOG.info("Restore snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postRestoreSnapshot(reqSnapshot, snapshotTableDesc); } } else { HTableDescriptor htd = RestoreSnapshotHelper.cloneTableSchema(snapshotTableDesc, tableName); if (cpHost != null) { cpHost.preCloneSnapshot(reqSnapshot, htd); } cloneSnapshot(fsSnapshot, htd); LOG.info("Clone snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postCloneSnapshot(reqSnapshot, htd); } } }
/** * Restore the specified snapshot * @param reqSnapshot * @throws IOException */ public void restoreSnapshot(SnapshotDescription reqSnapshot) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); MasterCoprocessorHost cpHost = master.getCoprocessorHost(); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException(reqSnapshot); } // read snapshot information SnapshotDescription fsSnapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); HTableDescriptor snapshotTableDesc = FSTableDescriptors.getTableDescriptorFromFs(fs, snapshotDir); TableName tableName = TableName.valueOf(reqSnapshot.getTable()); // stop tracking "abandoned" handlers cleanupSentinels(); // Execute the restore/clone operation if (MetaReader.tableExists(master.getCatalogTracker(), tableName)) { if (master.getAssignmentManager().getZKTable().isEnabledTable( TableName.valueOf(fsSnapshot.getTable()))) { throw new UnsupportedOperationException("Table '" + TableName.valueOf(fsSnapshot.getTable()) + "' must be disabled in order to " + "perform a restore operation" + "."); } // call coproc pre hook if (cpHost != null) { cpHost.preRestoreSnapshot(reqSnapshot, snapshotTableDesc); } restoreSnapshot(fsSnapshot, snapshotTableDesc); LOG.info("Restore snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postRestoreSnapshot(reqSnapshot, snapshotTableDesc); } } else { HTableDescriptor htd = RestoreSnapshotHelper.cloneTableSchema(snapshotTableDesc, tableName); if (cpHost != null) { cpHost.preCloneSnapshot(reqSnapshot, htd); } cloneSnapshot(fsSnapshot, htd); LOG.info("Clone snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postCloneSnapshot(reqSnapshot, htd); } } }
/** * Restore the specified snapshot * @param reqSnapshot * @throws IOException */ public void restoreSnapshot(SnapshotDescription reqSnapshot) throws IOException { FileSystem fs = master.getMasterFileSystem().getFileSystem(); Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir); MasterCoprocessorHost cpHost = master.getCoprocessorHost(); // check if the snapshot exists if (!fs.exists(snapshotDir)) { LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist."); throw new SnapshotDoesNotExistException(reqSnapshot); } // read snapshot information SnapshotDescription fsSnapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir); HTableDescriptor snapshotTableDesc = FSTableDescriptors.getTableDescriptor(fs, snapshotDir); String tableName = reqSnapshot.getTable(); // stop tracking "abandoned" handlers cleanupSentinels(); // Execute the restore/clone operation if (MetaReader.tableExists(master.getCatalogTracker(), tableName)) { if (master.getAssignmentManager().getZKTable().isEnabledTable(fsSnapshot.getTable())) { throw new UnsupportedOperationException("Table '" + fsSnapshot.getTable() + "' must be disabled in order to perform a restore operation."); } // call coproc pre hook if (cpHost != null) { cpHost.preRestoreSnapshot(reqSnapshot, snapshotTableDesc); } restoreSnapshot(fsSnapshot, snapshotTableDesc); LOG.info("Restore snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postRestoreSnapshot(reqSnapshot, snapshotTableDesc); } } else { HTableDescriptor htd = RestoreSnapshotHelper.cloneTableSchema(snapshotTableDesc, Bytes.toBytes(tableName)); if (cpHost != null) { cpHost.preCloneSnapshot(reqSnapshot, htd); } cloneSnapshot(fsSnapshot, htd); LOG.info("Clone snapshot=" + fsSnapshot.getName() + " as table=" + tableName); if (cpHost != null) { cpHost.postCloneSnapshot(reqSnapshot, htd); } } }