Search in sources :

Example 1 with GraphSerialisable

use of uk.gov.gchq.gaffer.graph.GraphSerialisable in project Gaffer by gchq.

the class FederatedGraphStorage method changeGraphId.

private boolean changeGraphId(final String graphId, final String newGraphId, final Predicate<FederatedAccess> accessPredicate) throws StorageException {
    boolean rtn;
    final Graph graphToMove = getGraphToMove(graphId, accessPredicate);
    if (nonNull(graphToMove)) {
        FederatedAccess key = null;
        // remove graph to be moved from storage
        for (final Entry<FederatedAccess, Set<Graph>> entry : storage.entrySet()) {
            final boolean removed = entry.getValue().removeIf(graph -> graph.getGraphId().equals(graphId));
            if (removed) {
                key = entry.getKey();
                break;
            }
        }
        // Update Tables
        String storeClass = graphToMove.getStoreProperties().getStoreClass();
        if (nonNull(storeClass) && storeClass.startsWith(AccumuloStore.class.getPackage().getName())) {
            /*
                 * This logic is only for Accumulo derived stores Only.
                 * For updating table names to match graphs names.
                 *
                 * uk.gov.gchq.gaffer.accumulostore.[AccumuloStore, SingleUseAccumuloStore,
                 * SingleUseMockAccumuloStore, MockAccumuloStore, MiniAccumuloStore]
                 */
            try {
                AccumuloProperties tmpAccumuloProps = (AccumuloProperties) graphToMove.getStoreProperties();
                Connector connection = TableUtils.getConnector(tmpAccumuloProps.getInstance(), tmpAccumuloProps.getZookeepers(), tmpAccumuloProps.getUser(), tmpAccumuloProps.getPassword());
                if (connection.tableOperations().exists(graphId)) {
                    connection.tableOperations().offline(graphId);
                    connection.tableOperations().rename(graphId, newGraphId);
                    connection.tableOperations().online(newGraphId);
                }
            } catch (final Exception e) {
                LOGGER.warn("Error trying to update tables for graphID:{} graphToMove:{}", graphId, graphToMove);
                LOGGER.warn("Error trying to update tables.", e);
            }
        }
        final GraphConfig configWithNewGraphId = cloneGraphConfigWithNewGraphId(newGraphId, graphToMove);
        // add the graph being renamed.
        GraphSerialisable newGraphSerialisable = new GraphSerialisable.Builder().graph(graphToMove).config(configWithNewGraphId).build();
        this.put(newGraphSerialisable, key);
        // Update cache
        if (isCacheEnabled()) {
            try {
                // Overwrite cache = true because the graphLibrary should have thrown an error before this point.
                federatedStoreCache.addGraphToCache(newGraphSerialisable, key, true);
            } catch (final CacheOperationException e) {
                String s = "Contact Admin for recovery. Error occurred updating graphId. GraphStorage=updated, Cache=outdated graphId.";
                LOGGER.error(s + " graphStorage graphId:{} cache graphId:{}", newGraphId, graphId);
                throw new StorageException(s, e);
            }
            federatedStoreCache.deleteGraphFromCache(graphId);
        }
        rtn = true;
    } else {
        rtn = false;
    }
    return rtn;
}
Also used : Connector(org.apache.accumulo.core.client.Connector) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet) Set(java.util.Set) AccumuloProperties(uk.gov.gchq.gaffer.accumulostore.AccumuloProperties) StorageException(uk.gov.gchq.gaffer.federatedstore.exception.StorageException) SchemaException(uk.gov.gchq.gaffer.data.elementdefinition.exception.SchemaException) OverwritingException(uk.gov.gchq.gaffer.commonutil.exception.OverwritingException) CacheOperationException(uk.gov.gchq.gaffer.cache.exception.CacheOperationException) OperationException(uk.gov.gchq.gaffer.operation.OperationException) GraphConfig(uk.gov.gchq.gaffer.graph.GraphConfig) Graph(uk.gov.gchq.gaffer.graph.Graph) GraphSerialisable(uk.gov.gchq.gaffer.graph.GraphSerialisable) CacheOperationException(uk.gov.gchq.gaffer.cache.exception.CacheOperationException) AccumuloStore(uk.gov.gchq.gaffer.accumulostore.AccumuloStore) StorageException(uk.gov.gchq.gaffer.federatedstore.exception.StorageException)

Example 2 with GraphSerialisable

use of uk.gov.gchq.gaffer.graph.GraphSerialisable in project Gaffer by gchq.

the class FederatedGraphStorage method makeGraphFromCache.

private void makeGraphFromCache(final String graphId) throws StorageException {
    final GraphSerialisable graph = federatedStoreCache.getGraphSerialisableFromCache(graphId);
    final FederatedAccess accessFromCache = federatedStoreCache.getAccessFromCache(graphId);
    put(graph, accessFromCache);
}
Also used : GraphSerialisable(uk.gov.gchq.gaffer.graph.GraphSerialisable)

Example 3 with GraphSerialisable

use of uk.gov.gchq.gaffer.graph.GraphSerialisable in project Gaffer by gchq.

the class FederatedStoreCache method addGraphToCache.

/**
 * Add the specified {@link Graph} to the cache.
 *
 * @param graphSerialisable the serialised {@link Graph} to be added
 * @param access            Access for the graph being stored.
 * @param overwrite         if true, overwrite any graphs already in the cache with the same ID
 * @throws CacheOperationException if there was an error trying to add to the cache
 */
public void addGraphToCache(final GraphSerialisable graphSerialisable, final FederatedAccess access, final boolean overwrite) throws CacheOperationException {
    String graphId = graphSerialisable.getDeserialisedConfig().getGraphId();
    Pair<GraphSerialisable, FederatedAccess> pair = new Pair<>(graphSerialisable, access);
    try {
        addToCache(graphId, pair, overwrite);
    } catch (final CacheOperationException e) {
        throw new CacheOperationException(String.format(ERROR_ADDING_GRAPH_TO_CACHE_GRAPH_ID_S, graphId), e.getCause());
    }
}
Also used : GraphSerialisable(uk.gov.gchq.gaffer.graph.GraphSerialisable) CacheOperationException(uk.gov.gchq.gaffer.cache.exception.CacheOperationException) Pair(uk.gov.gchq.gaffer.commonutil.pair.Pair)

Example 4 with GraphSerialisable

use of uk.gov.gchq.gaffer.graph.GraphSerialisable in project Gaffer by gchq.

the class FederatedGraphStorageTest method checkSchemaNotLeakedWhenAlreadyExistsUnderDifferentAccessWithOtherGraphs.

@Test
public void checkSchemaNotLeakedWhenAlreadyExistsUnderDifferentAccessWithOtherGraphs() throws Exception {
    // Given
    final String unusualType = "unusualType";
    final String groupEnt = "ent";
    final String groupEdge = "edg";
    Schema schemaNotToBeExposed = new Schema.Builder().type(unusualType, String.class).type(DIRECTED_EITHER, Boolean.class).entity(groupEnt, new SchemaEntityDefinition.Builder().vertex(unusualType).build()).edge(groupEdge, new SchemaEdgeDefinition.Builder().source(unusualType).destination(unusualType).directed(DIRECTED_EITHER).build()).build();
    final GraphSerialisable graph1 = new GraphSerialisable.Builder().config(new GraphConfig.Builder().graphId(GRAPH_ID_A).build()).properties(PROPERTIES).schema(schemaNotToBeExposed).build();
    graphStorage.put(graph1, access);
    final GraphSerialisable graph2 = new GraphSerialisable.Builder().config(new GraphConfig.Builder().graphId(GRAPH_ID_B).build()).schema(new Schema.Builder().merge(schemaNotToBeExposed).entity("e2", e2).type("string2", String.class).build()).properties(PROPERTIES).build();
    graphStorage.put(graph2, altAccess);
    // When / Then
    try {
        graphStorage.put(graph2, access);
    } catch (StorageException e) {
        assertEquals("Error adding graph " + GRAPH_ID_B + " to storage due to: " + String.format(FederatedGraphStorage.USER_IS_ATTEMPTING_TO_OVERWRITE, GRAPH_ID_B), e.getMessage());
        testNotLeakingContents(e, unusualType, groupEdge, groupEnt);
    }
}
Also used : GraphSerialisable(uk.gov.gchq.gaffer.graph.GraphSerialisable) Schema(uk.gov.gchq.gaffer.store.schema.Schema) SchemaEntityDefinition(uk.gov.gchq.gaffer.store.schema.SchemaEntityDefinition) StorageException(uk.gov.gchq.gaffer.federatedstore.exception.StorageException) Test(org.junit.jupiter.api.Test)

Example 5 with GraphSerialisable

use of uk.gov.gchq.gaffer.graph.GraphSerialisable in project Gaffer by gchq.

the class FederatedGraphStorageTest method checkSchemaNotLeakedWhenOverwritingExistingGraph.

@Test
public void checkSchemaNotLeakedWhenOverwritingExistingGraph() throws Exception {
    // Given
    graphStorage.setGraphLibrary(mock(GraphLibrary.class));
    final String unusualType = "unusualType";
    final String groupEnt = "ent";
    final String groupEdge = "edg";
    Schema schemaNotToBeExposed = new Schema.Builder().type(unusualType, String.class).type(DIRECTED_EITHER, Boolean.class).entity(groupEnt, new SchemaEntityDefinition.Builder().vertex(unusualType).build()).edge(groupEdge, new SchemaEdgeDefinition.Builder().source(unusualType).destination(unusualType).directed(DIRECTED_EITHER).build()).build();
    final GraphSerialisable graph1 = new GraphSerialisable.Builder().config(new GraphConfig.Builder().graphId(GRAPH_ID_A).build()).properties(PROPERTIES).schema(schemaNotToBeExposed).build();
    graphStorage.put(graph1, access);
    final GraphSerialisable graph2 = new GraphSerialisable.Builder().config(new GraphConfig.Builder().graphId(GRAPH_ID_A).build()).schema(new Schema.Builder().entity("e2", e2).type("string2", String.class).build()).properties(PROPERTIES).build();
    // When / Then
    try {
        graphStorage.put(graph2, access);
        fail(EXCEPTION_EXPECTED);
    } catch (StorageException e) {
        assertEquals("Error adding graph " + GRAPH_ID_A + " to storage due to: " + String.format(FederatedGraphStorage.USER_IS_ATTEMPTING_TO_OVERWRITE, GRAPH_ID_A), e.getMessage());
        testNotLeakingContents(e, unusualType, groupEdge, groupEnt);
    }
}
Also used : GraphSerialisable(uk.gov.gchq.gaffer.graph.GraphSerialisable) GraphLibrary(uk.gov.gchq.gaffer.store.library.GraphLibrary) Schema(uk.gov.gchq.gaffer.store.schema.Schema) SchemaEntityDefinition(uk.gov.gchq.gaffer.store.schema.SchemaEntityDefinition) StorageException(uk.gov.gchq.gaffer.federatedstore.exception.StorageException) Test(org.junit.jupiter.api.Test)

Aggregations

GraphSerialisable (uk.gov.gchq.gaffer.graph.GraphSerialisable)20 Test (org.junit.jupiter.api.Test)13 GraphConfig (uk.gov.gchq.gaffer.graph.GraphConfig)10 StorageException (uk.gov.gchq.gaffer.federatedstore.exception.StorageException)5 FederatedGetTraitsHandlerTest (uk.gov.gchq.gaffer.federatedstore.operation.handler.impl.FederatedGetTraitsHandlerTest)5 Builder (uk.gov.gchq.gaffer.store.schema.Schema.Builder)5 StoreTrait (uk.gov.gchq.gaffer.store.StoreTrait)4 Schema (uk.gov.gchq.gaffer.store.schema.Schema)4 Graph (uk.gov.gchq.gaffer.graph.Graph)3 SchemaEntityDefinition (uk.gov.gchq.gaffer.store.schema.SchemaEntityDefinition)3 ArrayList (java.util.ArrayList)2 Test (org.junit.Test)2 CacheOperationException (uk.gov.gchq.gaffer.cache.exception.CacheOperationException)2 AddGraph (uk.gov.gchq.gaffer.federatedstore.operation.AddGraph)2 RemoveGraph (uk.gov.gchq.gaffer.federatedstore.operation.RemoveGraph)2 OperationException (uk.gov.gchq.gaffer.operation.OperationException)2 Collection (java.util.Collection)1 HashSet (java.util.HashSet)1 LinkedHashSet (java.util.LinkedHashSet)1 Set (java.util.Set)1