Search in sources :

Example 1 with TableNotDisabledException

use of org.apache.hadoop.hbase.TableNotDisabledException in project hbase by apache.

the class TestAdmin1 method testOnlineChangeTableSchema.

/**
   * Verify schema modification takes.
   * @throws IOException
   * @throws InterruptedException
   */
@Test(timeout = 300000)
public void testOnlineChangeTableSchema() throws IOException, InterruptedException {
    final TableName tableName = TableName.valueOf(name.getMethodName());
    HTableDescriptor[] tables = admin.listTables();
    int numTables = tables.length;
    TEST_UTIL.createTable(tableName, HConstants.CATALOG_FAMILY).close();
    tables = this.admin.listTables();
    assertEquals(numTables + 1, tables.length);
    // FIRST, do htabledescriptor changes.
    HTableDescriptor htd = this.admin.getTableDescriptor(tableName);
    // Make a copy and assert copy is good.
    HTableDescriptor copy = new HTableDescriptor(htd);
    assertTrue(htd.equals(copy));
    // Now amend the copy. Introduce differences.
    long newFlushSize = htd.getMemStoreFlushSize() / 2;
    if (newFlushSize <= 0) {
        newFlushSize = HTableDescriptor.DEFAULT_MEMSTORE_FLUSH_SIZE / 2;
    }
    copy.setMemStoreFlushSize(newFlushSize);
    final String key = "anyoldkey";
    assertTrue(htd.getValue(key) == null);
    copy.setValue(key, key);
    boolean expectedException = false;
    try {
        admin.modifyTable(tableName, copy);
    } catch (TableNotDisabledException re) {
        expectedException = true;
    }
    assertFalse(expectedException);
    HTableDescriptor modifiedHtd = this.admin.getTableDescriptor(tableName);
    assertFalse(htd.equals(modifiedHtd));
    assertTrue(copy.equals(modifiedHtd));
    assertEquals(newFlushSize, modifiedHtd.getMemStoreFlushSize());
    assertEquals(key, modifiedHtd.getValue(key));
    // Now work on column family changes.
    int countOfFamilies = modifiedHtd.getFamilies().size();
    assertTrue(countOfFamilies > 0);
    HColumnDescriptor hcd = modifiedHtd.getFamilies().iterator().next();
    int maxversions = hcd.getMaxVersions();
    final int newMaxVersions = maxversions + 1;
    hcd.setMaxVersions(newMaxVersions);
    final byte[] hcdName = hcd.getName();
    expectedException = false;
    try {
        this.admin.modifyColumnFamily(tableName, hcd);
    } catch (TableNotDisabledException re) {
        expectedException = true;
    }
    assertFalse(expectedException);
    modifiedHtd = this.admin.getTableDescriptor(tableName);
    HColumnDescriptor modifiedHcd = modifiedHtd.getFamily(hcdName);
    assertEquals(newMaxVersions, modifiedHcd.getMaxVersions());
    // Try adding a column
    assertFalse(this.admin.isTableDisabled(tableName));
    final String xtracolName = "xtracol";
    HColumnDescriptor xtracol = new HColumnDescriptor(xtracolName);
    xtracol.setValue(xtracolName, xtracolName);
    expectedException = false;
    try {
        this.admin.addColumnFamily(tableName, xtracol);
    } catch (TableNotDisabledException re) {
        expectedException = true;
    }
    // Add column should work even if the table is enabled
    assertFalse(expectedException);
    modifiedHtd = this.admin.getTableDescriptor(tableName);
    hcd = modifiedHtd.getFamily(xtracol.getName());
    assertTrue(hcd != null);
    assertTrue(hcd.getValue(xtracolName).equals(xtracolName));
    // Delete the just-added column.
    this.admin.deleteColumnFamily(tableName, xtracol.getName());
    modifiedHtd = this.admin.getTableDescriptor(tableName);
    hcd = modifiedHtd.getFamily(xtracol.getName());
    assertTrue(hcd == null);
    // Delete the table
    this.admin.disableTable(tableName);
    this.admin.deleteTable(tableName);
    this.admin.listTables();
    assertFalse(this.admin.tableExists(tableName));
}
Also used : TableNotDisabledException(org.apache.hadoop.hbase.TableNotDisabledException) TableName(org.apache.hadoop.hbase.TableName) HColumnDescriptor(org.apache.hadoop.hbase.HColumnDescriptor) HTableDescriptor(org.apache.hadoop.hbase.HTableDescriptor) Test(org.junit.Test)

Example 2 with TableNotDisabledException

use of org.apache.hadoop.hbase.TableNotDisabledException in project hbase by apache.

the class EnableTableProcedure method prepareEnable.

/**
   * Action before any real action of enabling table. Set the exception in the procedure instead
   * of throwing it.  This approach is to deal with backward compatible with 1.0.
   * @param env MasterProcedureEnv
   * @return whether the table passes the necessary checks
   * @throws IOException
   */
private boolean prepareEnable(final MasterProcedureEnv env) throws IOException {
    boolean canTableBeEnabled = true;
    // Check whether table exists
    if (!MetaTableAccessor.tableExists(env.getMasterServices().getConnection(), tableName)) {
        setFailure("master-enable-table", new TableNotFoundException(tableName));
        canTableBeEnabled = false;
    } else if (!skipTableStateCheck) {
        // There could be multiple client requests trying to disable or enable
        // the table at the same time. Ensure only the first request is honored
        // After that, no other requests can be accepted until the table reaches
        // DISABLED or ENABLED.
        //
        // Note: in 1.0 release, we called TableStateManager.setTableStateIfInStates() to set
        // the state to ENABLING from DISABLED. The implementation was done before table lock
        // was implemented. With table lock, there is no need to set the state here (it will
        // set the state later on). A quick state check should be enough for us to move forward.
        TableStateManager tsm = env.getMasterServices().getTableStateManager();
        TableState.State state = tsm.getTableState(tableName);
        if (!state.equals(TableState.State.DISABLED)) {
            LOG.info("Table " + tableName + " isn't disabled;is " + state.name() + "; skipping enable");
            setFailure("master-enable-table", new TableNotDisabledException(this.tableName + " state is " + state.name()));
            canTableBeEnabled = false;
        }
    }
    // We are done the check. Future actions in this procedure could be done asynchronously.
    releaseSyncLatch();
    return canTableBeEnabled;
}
Also used : TableNotDisabledException(org.apache.hadoop.hbase.TableNotDisabledException) TableNotFoundException(org.apache.hadoop.hbase.TableNotFoundException) TableStateManager(org.apache.hadoop.hbase.master.TableStateManager) EnableTableState(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.EnableTableState) TableState(org.apache.hadoop.hbase.client.TableState)

Example 3 with TableNotDisabledException

use of org.apache.hadoop.hbase.TableNotDisabledException in project hbase by apache.

the class HBaseAdmin method restoreSnapshot.

@Override
public void restoreSnapshot(final String snapshotName, final boolean takeFailSafeSnapshot) throws IOException, RestoreSnapshotException {
    TableName tableName = getTableNameBeforeRestoreSnapshot(snapshotName);
    // The table does not exists, switch to clone.
    if (!tableExists(tableName)) {
        cloneSnapshot(snapshotName, tableName);
        return;
    }
    // Check if the table is disabled
    if (!isTableDisabled(tableName)) {
        throw new TableNotDisabledException(tableName);
    }
    // Take a snapshot of the current state
    String failSafeSnapshotSnapshotName = null;
    if (takeFailSafeSnapshot) {
        failSafeSnapshotSnapshotName = conf.get("hbase.snapshot.restore.failsafe.name", "hbase-failsafe-{snapshot.name}-{restore.timestamp}");
        failSafeSnapshotSnapshotName = failSafeSnapshotSnapshotName.replace("{snapshot.name}", snapshotName).replace("{table.name}", tableName.toString().replace(TableName.NAMESPACE_DELIM, '.')).replace("{restore.timestamp}", String.valueOf(EnvironmentEdgeManager.currentTime()));
        LOG.info("Taking restore-failsafe snapshot: " + failSafeSnapshotSnapshotName);
        snapshot(failSafeSnapshotSnapshotName, tableName);
    }
    try {
        // Restore snapshot
        get(internalRestoreSnapshotAsync(snapshotName, tableName), syncWaitTimeout, TimeUnit.MILLISECONDS);
    } catch (IOException e) {
        // if the pre-restore snapshot is available try to rollback
        if (takeFailSafeSnapshot) {
            try {
                get(internalRestoreSnapshotAsync(failSafeSnapshotSnapshotName, tableName), syncWaitTimeout, TimeUnit.MILLISECONDS);
                String msg = "Restore snapshot=" + snapshotName + " failed. Rollback to snapshot=" + failSafeSnapshotSnapshotName + " succeeded.";
                LOG.error(msg, e);
                throw new RestoreSnapshotException(msg, e);
            } catch (IOException ex) {
                String msg = "Failed to restore and rollback to snapshot=" + failSafeSnapshotSnapshotName;
                LOG.error(msg, ex);
                throw new RestoreSnapshotException(msg, e);
            }
        } else {
            throw new RestoreSnapshotException("Failed to restore snapshot=" + snapshotName, e);
        }
    }
    // If the restore is succeeded, delete the pre-restore snapshot
    if (takeFailSafeSnapshot) {
        try {
            LOG.info("Deleting restore-failsafe snapshot: " + failSafeSnapshotSnapshotName);
            deleteSnapshot(failSafeSnapshotSnapshotName);
        } catch (IOException e) {
            LOG.error("Unable to remove the failsafe snapshot: " + failSafeSnapshotSnapshotName, e);
        }
    }
}
Also used : TableNotDisabledException(org.apache.hadoop.hbase.TableNotDisabledException) TableName(org.apache.hadoop.hbase.TableName) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) DoNotRetryIOException(org.apache.hadoop.hbase.DoNotRetryIOException) TimeoutIOException(org.apache.hadoop.hbase.exceptions.TimeoutIOException) RestoreSnapshotException(org.apache.hadoop.hbase.snapshot.RestoreSnapshotException)

Example 4 with TableNotDisabledException

use of org.apache.hadoop.hbase.TableNotDisabledException in project hbase by apache.

the class TestEnableTableProcedure method testEnableNonDisabledTable.

@Test(timeout = 60000, expected = TableNotDisabledException.class)
public void testEnableNonDisabledTable() throws Exception {
    final TableName tableName = TableName.valueOf(name.getMethodName());
    final ProcedureExecutor<MasterProcedureEnv> procExec = getMasterProcedureExecutor();
    MasterProcedureTestingUtility.createTable(procExec, tableName, null, "f1", "f2");
    // Enable the table - expect failure
    long procId1 = procExec.submitProcedure(new EnableTableProcedure(procExec.getEnvironment(), tableName, false));
    ProcedureTestingUtility.waitProcedure(procExec, procId1);
    ProcedureInfo result = procExec.getResult(procId1);
    assertTrue(result.isFailed());
    LOG.debug("Enable failed with exception: " + result.getExceptionFullMessage());
    assertTrue(ProcedureTestingUtility.getExceptionCause(result) instanceof TableNotDisabledException);
    // Enable the table with skipping table state check flag (simulate recovery scenario)
    long procId2 = procExec.submitProcedure(new EnableTableProcedure(procExec.getEnvironment(), tableName, true));
    // Wait the completion
    ProcedureTestingUtility.waitProcedure(procExec, procId2);
    ProcedureTestingUtility.assertProcNotFailed(procExec, procId2);
    // Enable the table - expect failure from ProcedurePrepareLatch
    final ProcedurePrepareLatch prepareLatch = new ProcedurePrepareLatch.CompatibilityLatch();
    long procId3 = procExec.submitProcedure(new EnableTableProcedure(procExec.getEnvironment(), tableName, false, prepareLatch));
    prepareLatch.await();
    Assert.fail("Enable should throw exception through latch.");
}
Also used : TableNotDisabledException(org.apache.hadoop.hbase.TableNotDisabledException) TableName(org.apache.hadoop.hbase.TableName) ProcedureInfo(org.apache.hadoop.hbase.ProcedureInfo) Test(org.junit.Test)

Example 5 with TableNotDisabledException

use of org.apache.hadoop.hbase.TableNotDisabledException in project incubator-atlas by apache.

the class HBaseAdmin1_0 method clearTable.

@Override
public void clearTable(String tableString, long timestamp) throws IOException {
    TableName tableName = TableName.valueOf(tableString);
    if (!adm.tableExists(tableName)) {
        log.debug("Attempted to clear table {} before it exists (noop)", tableString);
        return;
    }
    if (!adm.isTableDisabled(tableName))
        adm.disableTable(tableName);
    if (!adm.isTableDisabled(tableName))
        throw new RuntimeException("Unable to disable table " + tableName);
    // This API call appears to both truncate and reenable the table.
    log.info("Truncating table {}", tableName);
    adm.truncateTable(tableName, true);
    try {
        adm.enableTable(tableName);
    } catch (TableNotDisabledException e) {
        // This triggers seemingly every time in testing with 1.0.2.
        log.debug("Table automatically reenabled by truncation: {}", tableName, e);
    }
}
Also used : TableNotDisabledException(org.apache.hadoop.hbase.TableNotDisabledException) TableName(org.apache.hadoop.hbase.TableName)

Aggregations

TableNotDisabledException (org.apache.hadoop.hbase.TableNotDisabledException)10 TableName (org.apache.hadoop.hbase.TableName)8 Test (org.junit.Test)5 ProcedureInfo (org.apache.hadoop.hbase.ProcedureInfo)3 HColumnDescriptor (org.apache.hadoop.hbase.HColumnDescriptor)2 TableNotFoundException (org.apache.hadoop.hbase.TableNotFoundException)2 IOException (java.io.IOException)1 InterruptedIOException (java.io.InterruptedIOException)1 DoNotRetryIOException (org.apache.hadoop.hbase.DoNotRetryIOException)1 HTableDescriptor (org.apache.hadoop.hbase.HTableDescriptor)1 TableState (org.apache.hadoop.hbase.client.TableState)1 TimeoutIOException (org.apache.hadoop.hbase.exceptions.TimeoutIOException)1 TableStateManager (org.apache.hadoop.hbase.master.TableStateManager)1 EnableTableState (org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.EnableTableState)1 RestoreSnapshotException (org.apache.hadoop.hbase.snapshot.RestoreSnapshotException)1