Search in sources :

Example 1 with IgniteTablesInternal

use of org.apache.ignite.internal.table.IgniteTablesInternal in project ignite-3 by apache.

the class ItTablesApiTest method testCreateDropTable.

/**
 * Checks that if a table would be created/dropped in any cluster node, this action reflects on all others.
 * Table management operations should pass in linearize order: if an action completed in one node,
 * the result has to be visible to another one.
 *
 * @throws Exception If failed.
 */
@Test
public void testCreateDropTable() throws Exception {
    clusterNodes.forEach(ign -> assertNull(ign.tables().table(TABLE_NAME)));
    Ignite ignite1 = clusterNodes.get(1);
    WatchListenerInhibitor ignite1Inhibitor = metastorageEventsInhibitor(ignite1);
    ignite1Inhibitor.startInhibit();
    Table table = createTable(clusterNodes.get(0), SCHEMA, SHORT_TABLE_NAME);
    UUID tblId = ((TableImpl) table).tableId();
    CompletableFuture<Table> tableByNameFut = CompletableFuture.supplyAsync(() -> {
        return ignite1.tables().table(TABLE_NAME);
    });
    CompletableFuture<Table> tableByIdFut = CompletableFuture.supplyAsync(() -> {
        try {
            return ((IgniteTablesInternal) ignite1.tables()).table(tblId);
        } catch (NodeStoppingException e) {
            throw new AssertionError(e.getMessage());
        }
    });
    // Therefore the table still doesn't exists locally, but API prevents getting null and waits events.
    for (Ignite ignite : clusterNodes) {
        if (ignite != ignite1) {
            assertNotNull(ignite.tables().table(TABLE_NAME));
            assertNotNull(((IgniteTablesInternal) ignite.tables()).table(tblId));
        }
    }
    assertFalse(tableByNameFut.isDone());
    assertFalse(tableByIdFut.isDone());
    ignite1Inhibitor.stopInhibit();
    assertNotNull(tableByNameFut.get(10, TimeUnit.SECONDS));
    assertNotNull(tableByIdFut.get(10, TimeUnit.SECONDS));
    ignite1Inhibitor.startInhibit();
    clusterNodes.get(0).tables().dropTable(TABLE_NAME);
    // Therefore the table still exists locally, but API prevents getting it.
    for (Ignite ignite : clusterNodes) {
        assertNull(ignite.tables().table(TABLE_NAME));
        assertNull(((IgniteTablesInternal) ignite.tables()).table(tblId));
        assertThrows(TableNotFoundException.class, () -> dropTable(ignite, SCHEMA, SHORT_TABLE_NAME));
        dropTableIfExists(ignite, SCHEMA, SHORT_TABLE_NAME);
    }
    ignite1Inhibitor.stopInhibit();
}
Also used : Table(org.apache.ignite.table.Table) NodeStoppingException(org.apache.ignite.lang.NodeStoppingException) TableImpl(org.apache.ignite.internal.table.TableImpl) Ignite(org.apache.ignite.Ignite) WatchListenerInhibitor(org.apache.ignite.internal.test.WatchListenerInhibitor) UUID(java.util.UUID) IgniteTablesInternal(org.apache.ignite.internal.table.IgniteTablesInternal) Test(org.junit.jupiter.api.Test) IgniteAbstractTest(org.apache.ignite.internal.testframework.IgniteAbstractTest)

Aggregations

UUID (java.util.UUID)1 Ignite (org.apache.ignite.Ignite)1 IgniteTablesInternal (org.apache.ignite.internal.table.IgniteTablesInternal)1 TableImpl (org.apache.ignite.internal.table.TableImpl)1 WatchListenerInhibitor (org.apache.ignite.internal.test.WatchListenerInhibitor)1 IgniteAbstractTest (org.apache.ignite.internal.testframework.IgniteAbstractTest)1 NodeStoppingException (org.apache.ignite.lang.NodeStoppingException)1 Table (org.apache.ignite.table.Table)1 Test (org.junit.jupiter.api.Test)1