diff --git a/TypeDB.java b/TypeDB.java index 0833dfe4ee..1b3fabee74 100644 --- a/TypeDB.java +++ b/TypeDB.java @@ -35,27 +35,27 @@ public class TypeDB { public static final String DEFAULT_ADDRESS = "localhost:1729"; public static TypeDBClient coreClient(String address) { - return CoreClient.create(address); + return new CoreClient(address); } public static TypeDBClient coreClient(String address, int parallelisation) { - return CoreClient.create(address, parallelisation); + return new CoreClient(address, parallelisation); } public static TypeDBClient.Cluster clusterClient(String address, TypeDBCredential credential) { - return ClusterClient.create(set(address), credential); + return new ClusterClient(set(address), credential); } public static TypeDBClient.Cluster clusterClient(String address, TypeDBCredential credential, int parallelisation) { - return ClusterClient.create(set(address), credential, parallelisation); + return new ClusterClient(set(address), credential, parallelisation); } public static TypeDBClient.Cluster clusterClient(Set addresses, TypeDBCredential credential) { - return ClusterClient.create(addresses, credential); + return new ClusterClient(addresses, credential); } public static TypeDBClient.Cluster clusterClient(Set addresses, TypeDBCredential credential, int parallelisation) { - return ClusterClient.create(addresses, credential, parallelisation); + return new ClusterClient(addresses, credential, parallelisation); } } diff --git a/api/concept/Concept.java b/api/concept/Concept.java index 20353f1340..13d06aa7f0 100644 --- a/api/concept/Concept.java +++ b/api/concept/Concept.java @@ -21,7 +21,6 @@ package com.vaticle.typedb.client.api.concept; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Attribute; import com.vaticle.typedb.client.api.concept.thing.Entity; import com.vaticle.typedb.client.api.concept.thing.Relation; @@ -32,6 +31,7 @@ import com.vaticle.typedb.client.api.concept.type.RoleType; import com.vaticle.typedb.client.api.concept.type.ThingType; import com.vaticle.typedb.client.api.concept.type.Type; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; diff --git a/api/concept/thing/Attribute.java b/api/concept/thing/Attribute.java index 9f119ab52d..01938d2adf 100644 --- a/api/concept/thing/Attribute.java +++ b/api/concept/thing/Attribute.java @@ -21,9 +21,9 @@ package com.vaticle.typedb.client.api.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.AttributeType; import com.vaticle.typedb.client.api.concept.type.ThingType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; import java.time.LocalDateTime; diff --git a/api/concept/thing/Entity.java b/api/concept/thing/Entity.java index 26413569c3..f48484cc4a 100644 --- a/api/concept/thing/Entity.java +++ b/api/concept/thing/Entity.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.api.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.EntityType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; diff --git a/api/concept/thing/Relation.java b/api/concept/thing/Relation.java index 0df3559f8b..ad7478af8c 100644 --- a/api/concept/thing/Relation.java +++ b/api/concept/thing/Relation.java @@ -21,9 +21,9 @@ package com.vaticle.typedb.client.api.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.RelationType; import com.vaticle.typedb.client.api.concept.type.RoleType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; import java.util.List; diff --git a/api/concept/thing/Thing.java b/api/concept/thing/Thing.java index 1cd08c9848..69a1d6a69b 100644 --- a/api/concept/thing/Thing.java +++ b/api/concept/thing/Thing.java @@ -21,11 +21,11 @@ package com.vaticle.typedb.client.api.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.Concept; import com.vaticle.typedb.client.api.concept.type.AttributeType; import com.vaticle.typedb.client.api.concept.type.RoleType; import com.vaticle.typedb.client.api.concept.type.ThingType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; import java.util.stream.Stream; diff --git a/api/concept/type/AttributeType.java b/api/concept/type/AttributeType.java index e6bf811de9..2fe96a2ce2 100644 --- a/api/concept/type/AttributeType.java +++ b/api/concept/type/AttributeType.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.api.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Attribute; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.protocol.ConceptProto; diff --git a/api/concept/type/EntityType.java b/api/concept/type/EntityType.java index 7a9f85a914..5ab3bb8855 100644 --- a/api/concept/type/EntityType.java +++ b/api/concept/type/EntityType.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.api.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Entity; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; import java.util.stream.Stream; diff --git a/api/concept/type/RelationType.java b/api/concept/type/RelationType.java index 4ebdd4c1ad..879cefcb63 100644 --- a/api/concept/type/RelationType.java +++ b/api/concept/type/RelationType.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.api.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Relation; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; import javax.annotation.Nullable; diff --git a/api/concept/type/ThingType.java b/api/concept/type/ThingType.java index 6695de0443..f96fe92f61 100644 --- a/api/concept/type/ThingType.java +++ b/api/concept/type/ThingType.java @@ -21,9 +21,9 @@ package com.vaticle.typedb.client.api.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Thing; import com.vaticle.typedb.client.api.concept.type.AttributeType.ValueType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import javax.annotation.CheckReturnValue; import java.util.stream.Stream; diff --git a/api/concept/type/Type.java b/api/concept/type/Type.java index 1d83eca950..443cb97e14 100644 --- a/api/concept/type/Type.java +++ b/api/concept/type/Type.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.api.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.Concept; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import javax.annotation.CheckReturnValue; diff --git a/api/connection/TypeDBOptions.java b/api/connection/TypeDBOptions.java index 58b550a450..dddbda0e3d 100644 --- a/api/connection/TypeDBOptions.java +++ b/api/connection/TypeDBOptions.java @@ -162,7 +162,6 @@ public OptionsProto.Options proto() { parallel().ifPresent(builder::setParallel); prefetchSize().ifPresent(builder::setPrefetchSize); prefetch().ifPresent(builder::setPrefetch); - sessionIdleTimeoutMillis().ifPresent(builder::setSessionIdleTimeoutMillis); schemaLockAcquireTimeoutMillis().ifPresent(builder::setSchemaLockAcquireTimeoutMillis); if (isCluster()) asCluster().readAnyReplica().ifPresent(builder::setReadAnyReplica); diff --git a/api/query/QueryManager.java b/api/query/QueryManager.java index afe803dd0e..ed3888007c 100644 --- a/api/query/QueryManager.java +++ b/api/query/QueryManager.java @@ -21,11 +21,11 @@ package com.vaticle.typedb.client.api.query; -import com.vaticle.typedb.client.api.connection.TypeDBOptions; import com.vaticle.typedb.client.api.answer.ConceptMap; import com.vaticle.typedb.client.api.answer.ConceptMapGroup; import com.vaticle.typedb.client.api.answer.Numeric; import com.vaticle.typedb.client.api.answer.NumericGroup; +import com.vaticle.typedb.client.api.connection.TypeDBOptions; import com.vaticle.typedb.client.api.logic.Explanation; import com.vaticle.typeql.lang.query.TypeQLDefine; import com.vaticle.typeql.lang.query.TypeQLDelete; diff --git a/common/rpc/RequestBuilder.java b/common/rpc/RequestBuilder.java index 899afb3a0e..e783d508d3 100644 --- a/common/rpc/RequestBuilder.java +++ b/common/rpc/RequestBuilder.java @@ -24,6 +24,7 @@ import com.google.protobuf.ByteString; import com.vaticle.factory.tracing.client.FactoryTracingThreadStatic; import com.vaticle.typedb.client.common.Label; +import com.vaticle.typedb.protocol.ClientProto; import com.vaticle.typedb.protocol.ClusterDatabaseProto; import com.vaticle.typedb.protocol.ClusterServerProto; import com.vaticle.typedb.protocol.ClusterUserProto; @@ -36,6 +37,7 @@ import com.vaticle.typedb.protocol.SessionProto; import com.vaticle.typedb.protocol.TransactionProto; +import javax.annotation.Nullable; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; @@ -100,6 +102,26 @@ public static CoreDatabaseProto.CoreDatabase.Delete.Req deleteReq(String name) { return CoreDatabaseProto.CoreDatabase.Delete.Req.newBuilder().setName(name).build(); } } + + } + + public static class Client { + + public static ClientProto.Client.Open.Req openReq(@Nullable Integer idleTimeoutMillis) { + ClientProto.Client.Open.Req.Builder builder = ClientProto.Client.Open.Req.newBuilder(); + if (idleTimeoutMillis != null) { + builder = builder.setIdleTimeoutMillis(idleTimeoutMillis); + } + return builder.build(); + } + + public static ClientProto.Client.Pulse.Req pulseReq(ByteString clientID) { + return ClientProto.Client.Pulse.Req.newBuilder().setClientId(clientID).build(); + } + + public static ClientProto.Client.Close.Req closeReq(ByteString clientID) { + return ClientProto.Client.Close.Req.newBuilder().setClientId(clientID).build(); + } } public static class Cluster { @@ -163,17 +185,14 @@ public static class Database { public static class Session { public static SessionProto.Session.Open.Req openReq( - String database, SessionProto.Session.Type type, OptionsProto.Options options) { - return SessionProto.Session.Open.Req.newBuilder().setDatabase(database) + ByteString clientID, String database, SessionProto.Session.Type type, OptionsProto.Options options) { + return SessionProto.Session.Open.Req.newBuilder() + .setClientId(clientID).setDatabase(database) .setType(type).setOptions(options).build(); } - public static SessionProto.Session.Pulse.Req pulseReq(ByteString sessionID) { - return SessionProto.Session.Pulse.Req.newBuilder().setSessionId(sessionID).build(); - } - - public static SessionProto.Session.Close.Req closeReq(ByteString sessionID) { - return SessionProto.Session.Close.Req.newBuilder().setSessionId(sessionID).build(); + public static SessionProto.Session.Close.Req closeReq(ByteString clientID, ByteString sessionID) { + return SessionProto.Session.Close.Req.newBuilder().setClientId(clientID).setSessionId(sessionID).build(); } } @@ -190,10 +209,10 @@ public static TransactionProto.Transaction.Req streamReq(UUID reqID) { } public static TransactionProto.Transaction.Req.Builder openReq( - ByteString sessionID, TransactionProto.Transaction.Type type, + ByteString clientID, ByteString sessionID, TransactionProto.Transaction.Type type, OptionsProto.Options options, int networkLatencyMillis) { return TransactionProto.Transaction.Req.newBuilder().setOpenReq( - TransactionProto.Transaction.Open.Req.newBuilder().setSessionId(sessionID) + TransactionProto.Transaction.Open.Req.newBuilder().setClientId(clientID).setSessionId(sessionID) .setType(type).setOptions(options).setNetworkLatencyMillis(networkLatencyMillis) ); } diff --git a/common/rpc/TypeDBStub.java b/common/rpc/TypeDBStub.java index 43833dc4a9..9f35fde09b 100644 --- a/common/rpc/TypeDBStub.java +++ b/common/rpc/TypeDBStub.java @@ -21,7 +21,7 @@ package com.vaticle.typedb.client.common.rpc; -import com.vaticle.typedb.client.common.exception.TypeDBClientException; +import com.vaticle.typedb.protocol.ClientProto.Client; import com.vaticle.typedb.protocol.CoreDatabaseProto.CoreDatabase; import com.vaticle.typedb.protocol.CoreDatabaseProto.CoreDatabaseManager; import com.vaticle.typedb.protocol.SessionProto.Session; @@ -29,13 +29,24 @@ import com.vaticle.typedb.protocol.TypeDBGrpc; import io.grpc.ConnectivityState; import io.grpc.ManagedChannel; -import io.grpc.StatusRuntimeException; import io.grpc.stub.StreamObserver; import java.util.function.Supplier; public abstract class TypeDBStub { + public Client.Open.Res clientOpen(Client.Open.Req request) { + return resilientCall(() -> blockingStub().clientOpen(request)); + } + + public Client.Close.Res clientClose(Client.Close.Req request) { + return resilientCall(() -> blockingStub().clientClose(request)); + } + + public Client.Pulse.Res clientPulse(Client.Pulse.Req request) { + return resilientCall(() -> blockingStub().clientPulse(request)); + } + public CoreDatabaseManager.Contains.Res databasesContains(CoreDatabaseManager.Contains.Req request) { return resilientCall(() -> blockingStub().databasesContains(request)); } @@ -64,10 +75,6 @@ public Session.Close.Res sessionClose(Session.Close.Req request) { return resilientCall(() -> blockingStub().sessionClose(request)); } - public Session.Pulse.Res sessionPulse(Session.Pulse.Req request) { - return resilientCall(() -> blockingStub().sessionPulse(request)); - } - public StreamObserver transaction(StreamObserver responseObserver) { return resilientCall(() -> asyncStub().transaction(responseObserver)); } diff --git a/concept/ConceptManagerImpl.java b/concept/ConceptManagerImpl.java index ae68dabcd8..f61468915d 100644 --- a/concept/ConceptManagerImpl.java +++ b/concept/ConceptManagerImpl.java @@ -21,13 +21,13 @@ package com.vaticle.typedb.client.concept; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.ConceptManager; import com.vaticle.typedb.client.api.concept.thing.Thing; import com.vaticle.typedb.client.api.concept.type.AttributeType; import com.vaticle.typedb.client.api.concept.type.EntityType; import com.vaticle.typedb.client.api.concept.type.RelationType; import com.vaticle.typedb.client.api.concept.type.ThingType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.concept.thing.ThingImpl; import com.vaticle.typedb.client.concept.type.AttributeTypeImpl; import com.vaticle.typedb.client.concept.type.EntityTypeImpl; diff --git a/concept/thing/AttributeImpl.java b/concept/thing/AttributeImpl.java index a166f16a2f..44e07443e0 100644 --- a/concept/thing/AttributeImpl.java +++ b/concept/thing/AttributeImpl.java @@ -21,9 +21,9 @@ package com.vaticle.typedb.client.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Attribute; import com.vaticle.typedb.client.api.concept.type.ThingType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.client.concept.type.AttributeTypeImpl; import com.vaticle.typedb.protocol.ConceptProto; diff --git a/concept/thing/EntityImpl.java b/concept/thing/EntityImpl.java index f6c261b372..9c68b38869 100644 --- a/concept/thing/EntityImpl.java +++ b/concept/thing/EntityImpl.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Entity; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.concept.type.EntityTypeImpl; import com.vaticle.typedb.common.collection.Bytes; import com.vaticle.typedb.protocol.ConceptProto; diff --git a/concept/thing/RelationImpl.java b/concept/thing/RelationImpl.java index 0b97f2d1d8..b2b2de7aa0 100644 --- a/concept/thing/RelationImpl.java +++ b/concept/thing/RelationImpl.java @@ -21,10 +21,10 @@ package com.vaticle.typedb.client.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Relation; import com.vaticle.typedb.client.api.concept.thing.Thing; import com.vaticle.typedb.client.api.concept.type.RoleType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.concept.type.RelationTypeImpl; import com.vaticle.typedb.client.concept.type.RoleTypeImpl; import com.vaticle.typedb.client.concept.type.TypeImpl; diff --git a/concept/thing/ThingImpl.java b/concept/thing/ThingImpl.java index cb49ee5b95..196a8a77a6 100644 --- a/concept/thing/ThingImpl.java +++ b/concept/thing/ThingImpl.java @@ -21,11 +21,11 @@ package com.vaticle.typedb.client.concept.thing; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Attribute; import com.vaticle.typedb.client.api.concept.thing.Thing; import com.vaticle.typedb.client.api.concept.type.AttributeType; import com.vaticle.typedb.client.api.concept.type.RoleType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.client.concept.ConceptImpl; import com.vaticle.typedb.client.concept.type.RoleTypeImpl; diff --git a/concept/type/AttributeTypeImpl.java b/concept/type/AttributeTypeImpl.java index e30795ec30..7979c3a9e5 100644 --- a/concept/type/AttributeTypeImpl.java +++ b/concept/type/AttributeTypeImpl.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.AttributeType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.client.concept.thing.AttributeImpl; diff --git a/concept/type/EntityTypeImpl.java b/concept/type/EntityTypeImpl.java index 1b023452f0..4271af4719 100644 --- a/concept/type/EntityTypeImpl.java +++ b/concept/type/EntityTypeImpl.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.EntityType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import com.vaticle.typedb.client.concept.thing.EntityImpl; import com.vaticle.typedb.client.concept.thing.ThingImpl; diff --git a/concept/type/RelationTypeImpl.java b/concept/type/RelationTypeImpl.java index 03a27d8d60..028fe912c0 100644 --- a/concept/type/RelationTypeImpl.java +++ b/concept/type/RelationTypeImpl.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.RelationType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import com.vaticle.typedb.client.concept.thing.RelationImpl; import com.vaticle.typedb.client.concept.thing.ThingImpl; diff --git a/concept/type/RoleTypeImpl.java b/concept/type/RoleTypeImpl.java index ca875ba976..188fca28e7 100644 --- a/concept/type/RoleTypeImpl.java +++ b/concept/type/RoleTypeImpl.java @@ -21,9 +21,9 @@ package com.vaticle.typedb.client.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.RelationType; import com.vaticle.typedb.client.api.concept.type.RoleType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import com.vaticle.typedb.client.common.rpc.RequestBuilder; import com.vaticle.typedb.protocol.ConceptProto; diff --git a/concept/type/ThingTypeImpl.java b/concept/type/ThingTypeImpl.java index 73f7c4d1af..c711ff1f21 100644 --- a/concept/type/ThingTypeImpl.java +++ b/concept/type/ThingTypeImpl.java @@ -21,11 +21,11 @@ package com.vaticle.typedb.client.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.AttributeType; import com.vaticle.typedb.client.api.concept.type.AttributeType.ValueType; import com.vaticle.typedb.client.api.concept.type.RoleType; import com.vaticle.typedb.client.api.concept.type.ThingType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.client.common.rpc.RequestBuilder; diff --git a/concept/type/TypeImpl.java b/concept/type/TypeImpl.java index 1faa9ef0f1..12743f19c0 100644 --- a/concept/type/TypeImpl.java +++ b/concept/type/TypeImpl.java @@ -21,7 +21,6 @@ package com.vaticle.typedb.client.concept.type; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.thing.Attribute; import com.vaticle.typedb.client.api.concept.thing.Entity; import com.vaticle.typedb.client.api.concept.thing.Relation; @@ -32,6 +31,7 @@ import com.vaticle.typedb.client.api.concept.type.RoleType; import com.vaticle.typedb.client.api.concept.type.ThingType; import com.vaticle.typedb.client.api.concept.type.Type; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.client.concept.ConceptImpl; diff --git a/connection/TypeDBClientImpl.java b/connection/TypeDBClientImpl.java index c8a79e2683..9111ef0a55 100644 --- a/connection/TypeDBClientImpl.java +++ b/connection/TypeDBClientImpl.java @@ -31,26 +31,41 @@ import com.vaticle.typedb.common.concurrent.NamedThreadFactory; import io.grpc.ManagedChannel; +import javax.annotation.Nullable; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import static com.vaticle.typedb.client.common.exception.ErrorMessage.Internal.ILLEGAL_CAST; +import static com.vaticle.typedb.client.common.exception.ErrorMessage.Internal.UNEXPECTED_INTERRUPTION; +import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Client.closeReq; +import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Client.pulseReq; import static com.vaticle.typedb.common.util.Objects.className; public abstract class TypeDBClientImpl implements TypeDBClient { + private static final int PULSE_INTERVAL_MILLIS = 5_000; private static final String TYPEDB_CLIENT_RPC_THREAD_NAME = "typedb-client-rpc"; + @Nullable + protected final Integer idleTimeoutMillis; private final RequestTransmitter transmitter; private final TypeDBDatabaseManagerImpl databaseMgr; private final ConcurrentMap sessions; + private final Timer pulse; + private final AtomicBoolean isOpen; - protected TypeDBClientImpl(int parallelisation) { + protected TypeDBClientImpl(@Nullable Integer idleTimeoutMillis, int parallelisation) { + this.idleTimeoutMillis = idleTimeoutMillis; NamedThreadFactory threadFactory = NamedThreadFactory.create(TYPEDB_CLIENT_RPC_THREAD_NAME); transmitter = new RequestTransmitter(parallelisation, threadFactory); databaseMgr = new TypeDBDatabaseManagerImpl(this); sessions = new ConcurrentHashMap<>(); + pulse = new Timer(); + isOpen = new AtomicBoolean(true); } public static int calculateParallelisation() { @@ -61,6 +76,11 @@ public static int calculateParallelisation() { else return (int) Math.ceil(cores / 4.0); } + @Override + public TypeDBDatabaseManagerImpl databases() { + return databaseMgr; + } + @Override public TypeDBSessionImpl session(String database, TypeDBSession.Type type) { return session(database, type, TypeDBOptions.core()); @@ -69,31 +89,22 @@ public TypeDBSessionImpl session(String database, TypeDBSession.Type type) { @Override public TypeDBSessionImpl session(String database, TypeDBSession.Type type, TypeDBOptions options) { TypeDBSessionImpl session = new TypeDBSessionImpl(this, database, type, options); - assert !sessions.containsKey(session.id()); - sessions.put(session.id(), session); + assert !sessions.containsKey(session.ID()); + sessions.put(session.ID(), session); return session; } - @Override - public TypeDBDatabaseManagerImpl databases() { - return databaseMgr; + void removeSession(TypeDBSessionImpl session) { + sessions.remove(session.ID()); } + public abstract ByteString ID(); + @Override public boolean isOpen() { return !channel().isShutdown(); } - @Override - public boolean isCluster() { - return false; - } - - @Override - public Cluster asCluster() { - throw new TypeDBClientException(ILLEGAL_CAST, className(TypeDBClient.Cluster.class)); - } - public abstract ManagedChannel channel(); public abstract TypeDBStub stub(); @@ -102,19 +113,56 @@ RequestTransmitter transmitter() { return transmitter; } - void removeSession(TypeDBSessionImpl session) { - sessions.remove(session.id()); + protected void pulseActivate() { + pulse.scheduleAtFixedRate(this.new PulseTask(), 0, PULSE_INTERVAL_MILLIS); + } + + protected void pulseDeactivate() { + pulse.cancel(); + } + + @Override + public boolean isCluster() { + return false; + } + + @Override + public Cluster asCluster() { + throw new TypeDBClientException(ILLEGAL_CAST, className(TypeDBClient.Cluster.class)); } @Override public void close() { + if (isOpen.compareAndSet(true, false)) { + closeResources(); + } + } + + protected void closeResources() { + sessions.values().forEach(TypeDBSessionImpl::close); + stub().clientClose(closeReq(ID())); try { - sessions.values().forEach(TypeDBSessionImpl::close); channel().shutdown().awaitTermination(10, TimeUnit.SECONDS); - transmitter.close(); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + throw new TypeDBClientException(UNEXPECTED_INTERRUPTION); } + transmitter.close(); } + private class PulseTask extends TimerTask { + + @Override + public void run() { + if (!isOpen()) return; + boolean alive; + try { + alive = stub().clientPulse(pulseReq(ID())).getAlive(); + } catch (TypeDBClientException exception) { + alive = false; + } + if (!alive) { + close(); + } + } + } } diff --git a/connection/TypeDBSessionImpl.java b/connection/TypeDBSessionImpl.java index 53f3c03c90..c768e94b5a 100644 --- a/connection/TypeDBSessionImpl.java +++ b/connection/TypeDBSessionImpl.java @@ -33,8 +33,6 @@ import java.time.Duration; import java.time.Instant; -import java.util.Timer; -import java.util.TimerTask; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.StampedLock; @@ -42,19 +40,15 @@ import static com.vaticle.typedb.client.common.exception.ErrorMessage.Client.SESSION_CLOSED; import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Session.closeReq; import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Session.openReq; -import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Session.pulseReq; public class TypeDBSessionImpl implements TypeDBSession { - private static final int PULSE_INTERVAL_MILLIS = 5_000; - private final TypeDBClientImpl client; private final TypeDBDatabaseImpl database; private final ByteString sessionID; private final ConcurrentSet transactions; private final Type type; private final TypeDBOptions options; - private final Timer pulse; private final ReadWriteLock accessLock; private final AtomicBoolean isOpen; private final int networkLatencyMillis; @@ -65,7 +59,7 @@ public TypeDBSessionImpl(TypeDBClientImpl client, String database, Type type, Ty this.options = options; Instant startTime = Instant.now(); SessionProto.Session.Open.Res res = client.stub().sessionOpen( - openReq(database, type.proto(), options.proto()) + openReq(client.ID(), database, type.proto(), options.proto()) ); Instant endTime = Instant.now(); this.database = new TypeDBDatabaseImpl(client.databases(), database); @@ -74,22 +68,8 @@ public TypeDBSessionImpl(TypeDBClientImpl client, String database, Type type, Ty transactions = new ConcurrentSet<>(); accessLock = new StampedLock().asReadWriteLock(); isOpen = new AtomicBoolean(true); - pulse = new Timer(); - pulse.scheduleAtFixedRate(this.new PulseTask(), 0, PULSE_INTERVAL_MILLIS); } - @Override - public boolean isOpen() { return isOpen.get(); } - - @Override - public Type type() { return type; } - - @Override - public TypeDBDatabaseImpl database() { return database; } - - @Override - public TypeDBOptions options() { return options; } - @Override public TypeDBTransaction transaction(TypeDBTransaction.Type type) { return transaction(type, TypeDBOptions.core()); @@ -100,7 +80,7 @@ public TypeDBTransaction transaction(TypeDBTransaction.Type type, TypeDBOptions try { accessLock.readLock().lock(); if (!isOpen.get()) throw new TypeDBClientException(SESSION_CLOSED); - TypeDBTransaction.Extended transactionRPC = new TypeDBTransactionImpl(this, sessionID, type, options); + TypeDBTransaction.Extended transactionRPC = new TypeDBTransactionImpl(client.ID(), this, type, options); transactions.add(transactionRPC); return transactionRPC; } finally { @@ -108,7 +88,19 @@ public TypeDBTransaction transaction(TypeDBTransaction.Type type, TypeDBOptions } } - ByteString id() { return sessionID; } + ByteString ID() { return sessionID; } + + @Override + public TypeDBDatabaseImpl database() { return database; } + + @Override + public Type type() { return type; } + + @Override + public TypeDBOptions options() { return options; } + + @Override + public boolean isOpen() { return isOpen.get(); } TypeDBStub stub() { return client.stub(); @@ -127,9 +119,8 @@ public void close() { if (isOpen.compareAndSet(true, false)) { transactions.forEach(TypeDBTransaction.Extended::close); client.removeSession(this); - pulse.cancel(); try { - stub().sessionClose(closeReq(sessionID)); + stub().sessionClose(closeReq(client.ID(), sessionID)); } catch (TypeDBClientException e) { // Most likely the session is already closed or the server is no longer running. } @@ -138,22 +129,4 @@ public void close() { accessLock.writeLock().unlock(); } } - - private class PulseTask extends TimerTask { - - @Override - public void run() { - if (!isOpen()) return; - boolean alive; - try { - alive = stub().sessionPulse(pulseReq(sessionID)).getAlive(); - } catch (TypeDBClientException exception) { - alive = false; - } - if (!alive) { - isOpen.set(false); - pulse.cancel(); - } - } - } } diff --git a/connection/TypeDBTransactionImpl.java b/connection/TypeDBTransactionImpl.java index e3ac3a56b1..e8dac2b527 100644 --- a/connection/TypeDBTransactionImpl.java +++ b/connection/TypeDBTransactionImpl.java @@ -22,9 +22,9 @@ package com.vaticle.typedb.client.connection; import com.google.protobuf.ByteString; +import com.vaticle.typedb.client.api.concept.ConceptManager; import com.vaticle.typedb.client.api.connection.TypeDBOptions; import com.vaticle.typedb.client.api.connection.TypeDBTransaction; -import com.vaticle.typedb.client.api.concept.ConceptManager; import com.vaticle.typedb.client.api.logic.LogicManager; import com.vaticle.typedb.client.api.query.QueryFuture; import com.vaticle.typedb.client.api.query.QueryManager; @@ -54,34 +54,16 @@ public class TypeDBTransactionImpl implements TypeDBTransaction.Extended { private final BidirectionalStream bidirectionalStream; - TypeDBTransactionImpl(TypeDBSessionImpl session, ByteString sessionId, Type type, TypeDBOptions options) { + TypeDBTransactionImpl(ByteString clientID, TypeDBSessionImpl session, Type type, TypeDBOptions options) { this.type = type; this.options = options; conceptMgr = new ConceptManagerImpl(this); logicMgr = new LogicManagerImpl(this); queryMgr = new QueryManagerImpl(this); bidirectionalStream = new BidirectionalStream(session.stub(), session.transmitter()); - execute(openReq(sessionId, type.proto(), options.proto(), session.networkLatencyMillis()), false); + execute(openReq(clientID, session.ID(), type.proto(), options.proto(), session.networkLatencyMillis()), false); } - @Override - public Type type() { return type; } - - @Override - public TypeDBOptions options() { return options; } - - @Override - public boolean isOpen() { return bidirectionalStream.isOpen(); } - - @Override - public ConceptManager concepts() { return conceptMgr; } - - @Override - public LogicManager logic() { return logicMgr; } - - @Override - public QueryManager query() { return queryMgr; } - @Override public Res execute(Req.Builder request) { return execute(request, true); @@ -108,6 +90,24 @@ public Stream stream(Req.Builder request) { return bidirectionalStream.stream(request); } + @Override + public boolean isOpen() { return bidirectionalStream.isOpen(); } + + @Override + public Type type() { return type; } + + @Override + public TypeDBOptions options() { return options; } + + @Override + public ConceptManager concepts() { return conceptMgr; } + + @Override + public LogicManager logic() { return logicMgr; } + + @Override + public QueryManager query() { return queryMgr; } + @Override public void commit() { try { diff --git a/connection/cluster/ClusterClient.java b/connection/cluster/ClusterClient.java index 49210142f2..95e41cc6ff 100644 --- a/connection/cluster/ClusterClient.java +++ b/connection/cluster/ClusterClient.java @@ -33,6 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -56,6 +57,8 @@ public class ClusterClient implements TypeDBClient.Cluster { private static final Logger LOG = LoggerFactory.getLogger(ClusterClient.class); private final TypeDBCredential credential; + @Nullable + private final Integer idleTimeoutMillis; private final int parallelisation; private final Map clusterServerClients; private final ClusterUserManager userMgr; @@ -63,11 +66,20 @@ public class ClusterClient implements TypeDBClient.Cluster { private final ConcurrentMap clusterDatabases; private boolean isOpen; - private ClusterClient(Set addresses, TypeDBCredential credential, int parallelisation) { + public ClusterClient(Set addresses, TypeDBCredential credential) { + this(addresses, credential, null, ClusterServerClient.calculateParallelisation()); + } + + public ClusterClient(Set addresses, TypeDBCredential credential, int idleTimeoutMillis) { + this(addresses, credential, idleTimeoutMillis, ClusterServerClient.calculateParallelisation()); + } + + private ClusterClient(Set addresses, TypeDBCredential credential, @Nullable Integer idleTimeoutMillis, int parallelisation) { this.credential = credential; + this.idleTimeoutMillis = idleTimeoutMillis; this.parallelisation = parallelisation; clusterServerClients = fetchServerAddresses(addresses).stream() - .map(address -> pair(address, ClusterServerClient.create(address, credential, parallelisation))) + .map(address -> pair(address, new ClusterServerClient(address, credential, idleTimeoutMillis, parallelisation))) .collect(toMap(Pair::first, Pair::second)); userMgr = new ClusterUserManager(this); databaseMgr = new ClusterDatabaseManager(this); @@ -75,17 +87,9 @@ private ClusterClient(Set addresses, TypeDBCredential credential, int pa isOpen = true; } - public static Cluster create(Set addresses, TypeDBCredential credential) { - return new ClusterClient(addresses, credential, ClusterServerClient.calculateParallelisation()); - } - - public static Cluster create(Set addresses, TypeDBCredential credential, int parallelisation) { - return new ClusterClient(addresses, credential, parallelisation); - } - private Set fetchServerAddresses(Set addresses) { for (String address : addresses) { - try (ClusterServerClient client = ClusterServerClient.create(address, credential, parallelisation)) { + try (ClusterServerClient client = new ClusterServerClient(address, credential, idleTimeoutMillis, parallelisation)) { LOG.debug("Fetching list of cluster servers from {}...", address); ClusterServerStub stub = new ClusterServerStub(client.channel(), credential); ClusterServerProto.ServerManager.All.Res res = stub.serversAll(allReq()); diff --git a/connection/cluster/ClusterServerClient.java b/connection/cluster/ClusterServerClient.java index 37a830ebd9..d361f3e67d 100644 --- a/connection/cluster/ClusterServerClient.java +++ b/connection/cluster/ClusterServerClient.java @@ -21,29 +21,39 @@ package com.vaticle.typedb.client.connection.cluster; +import com.google.protobuf.ByteString; import com.vaticle.typedb.client.api.connection.TypeDBCredential; import com.vaticle.typedb.client.common.exception.TypeDBClientException; import com.vaticle.typedb.client.connection.TypeDBClientImpl; +import com.vaticle.typedb.protocol.ClientProto; import io.grpc.ManagedChannel; import io.grpc.netty.GrpcSslContexts; import io.grpc.netty.NettyChannelBuilder; import io.netty.handler.ssl.SslContext; +import javax.annotation.Nullable; import javax.net.ssl.SSLException; +import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Client.openReq; + class ClusterServerClient extends TypeDBClientImpl { + private final ByteString clientID; private final ManagedChannel channel; private final ClusterServerStub stub; - private ClusterServerClient(String address, TypeDBCredential credential, int parallelisation) { - super(parallelisation); + ClusterServerClient(String address, TypeDBCredential credential, @Nullable Integer idleTimeoutMillis, int parallelisation) { + super(idleTimeoutMillis, parallelisation); channel = newManagedChannel(address, credential); stub = new ClusterServerStub(channel, credential); + ClientProto.Client.Open.Res res = stub().clientOpen(openReq(idleTimeoutMillis)); + clientID = res.getClientId(); + pulseActivate(); } - static ClusterServerClient create(String address, TypeDBCredential credential, int parallelisation) { - return new ClusterServerClient(address, credential, parallelisation); + @Override + public ByteString ID() { + return clientID; } @Override @@ -83,4 +93,10 @@ private ManagedChannel tlsChannel(String address, TypeDBCredential credential) { throw new TypeDBClientException(e.getMessage(), e); } } + + @Override + protected void closeResources() { + pulseDeactivate(); + super.closeResources(); + } } diff --git a/connection/core/CoreClient.java b/connection/core/CoreClient.java index 559e0c40a8..3a4e255427 100644 --- a/connection/core/CoreClient.java +++ b/connection/core/CoreClient.java @@ -21,28 +21,43 @@ package com.vaticle.typedb.client.connection.core; +import com.google.protobuf.ByteString; import com.vaticle.typedb.client.common.rpc.TypeDBStub; import com.vaticle.typedb.client.connection.TypeDBClientImpl; +import com.vaticle.typedb.protocol.ClientProto; import io.grpc.ManagedChannel; import io.grpc.netty.NettyChannelBuilder; +import javax.annotation.Nullable; + +import static com.vaticle.typedb.client.common.rpc.RequestBuilder.Client.openReq; + public class CoreClient extends TypeDBClientImpl { + private final ByteString clientID; private final ManagedChannel channel; private final TypeDBStub stub; + public CoreClient(String address) { + this(address, calculateParallelisation()); + } + public CoreClient(String address, int parallelisation) { - super(parallelisation); - channel = NettyChannelBuilder.forTarget(address).usePlaintext().build(); - stub = CoreStub.create(channel); + this(address, null, parallelisation); } - public static CoreClient create(String address) { - return new CoreClient(address, calculateParallelisation()); + private CoreClient(String address, @Nullable Integer idleTimeoutMillis, int parallelisation) { + super(idleTimeoutMillis, parallelisation); + channel = NettyChannelBuilder.forTarget(address).usePlaintext().build(); + stub = CoreStub.create(channel); + ClientProto.Client.Open.Res res = stub().clientOpen(openReq(idleTimeoutMillis)); + clientID = res.getClientId(); + pulseActivate(); } - public static CoreClient create(String address, int parallelisation) { - return new CoreClient(address, parallelisation); + @Override + public ByteString ID() { + return clientID; } @Override @@ -54,4 +69,10 @@ public ManagedChannel channel() { public TypeDBStub stub() { return stub; } + + @Override + protected void closeResources() { + pulseDeactivate(); + super.closeResources(); + } } diff --git a/dependencies/vaticle/artifacts.bzl b/dependencies/vaticle/artifacts.bzl index 7627012f36..8f6ed19680 100644 --- a/dependencies/vaticle/artifacts.bzl +++ b/dependencies/vaticle/artifacts.bzl @@ -29,7 +29,7 @@ def vaticle_typedb_artifact(): artifact_name = "typedb-server-{platform}-{version}.{ext}", tag_source = deployment["artifact.release"], commit_source = deployment["artifact.snapshot"], - commit = "6ed020e52fe379d1100f64511805ed344c7a68db" + commit = "f9eed93b3e11d862102c97fc427d1d1e1158f6a3" ) def vaticle_typedb_cluster_artifact(): @@ -39,5 +39,5 @@ def vaticle_typedb_cluster_artifact(): artifact_name = "typedb-cluster-all-{platform}-{version}.{ext}", tag_source = deployment_private["artifact.release"], commit_source = deployment_private["artifact.snapshot"], - commit = "467639bb384a52ee41dbb4b6eaa1348fced8e67b", + commit = "52d36e6cc91778bf7a961a92784e3258de1cc1f5", ) diff --git a/dependencies/vaticle/repositories.bzl b/dependencies/vaticle/repositories.bzl index 098272752f..4417f2147e 100644 --- a/dependencies/vaticle/repositories.bzl +++ b/dependencies/vaticle/repositories.bzl @@ -45,8 +45,8 @@ def vaticle_dependencies(): def vaticle_typedb_protocol(): git_repository( name = "vaticle_typedb_protocol", - remote = "https://github.com/vaticle/typedb-protocol", - tag = "2.4.0", # sync-marker: do not remove this comment, this is used for sync-dependencies by @vaticle_typedb_protocol + remote = "https://github.com/lolski/typedb-protocol", + commit = "469413e45ef9e0be03702f52890d01f3ae43ea06", # sync-marker: do not remove this comment, this is used for sync-dependencies by @vaticle_typedb_protocol ) def vaticle_typedb_behaviour(): diff --git a/query/QueryManagerImpl.java b/query/QueryManagerImpl.java index 19dafa95c6..9e9cd0ccfe 100644 --- a/query/QueryManagerImpl.java +++ b/query/QueryManagerImpl.java @@ -21,12 +21,12 @@ package com.vaticle.typedb.client.query; -import com.vaticle.typedb.client.api.connection.TypeDBOptions; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.answer.ConceptMap; import com.vaticle.typedb.client.api.answer.ConceptMapGroup; import com.vaticle.typedb.client.api.answer.Numeric; import com.vaticle.typedb.client.api.answer.NumericGroup; +import com.vaticle.typedb.client.api.connection.TypeDBOptions; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.logic.Explanation; import com.vaticle.typedb.client.api.query.QueryFuture; import com.vaticle.typedb.client.api.query.QueryManager; diff --git a/test/behaviour/config/Parameters.java b/test/behaviour/config/Parameters.java index 03a5d15747..2a02446c55 100644 --- a/test/behaviour/config/Parameters.java +++ b/test/behaviour/config/Parameters.java @@ -21,8 +21,8 @@ package com.vaticle.typedb.client.test.behaviour.config; -import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.api.concept.type.AttributeType.ValueType; +import com.vaticle.typedb.client.api.connection.TypeDBTransaction; import com.vaticle.typedb.client.common.Label; import io.cucumber.java.DataTableType; import io.cucumber.java.ParameterType; diff --git a/test/deployment/src/test/java/application/MavenApplicationTest.java b/test/deployment/src/test/java/application/MavenApplicationTest.java index 9823420a59..52941287e6 100644 --- a/test/deployment/src/test/java/application/MavenApplicationTest.java +++ b/test/deployment/src/test/java/application/MavenApplicationTest.java @@ -22,10 +22,10 @@ package application; import com.vaticle.typedb.client.TypeDB; +import com.vaticle.typedb.client.api.concept.type.ThingType; import com.vaticle.typedb.client.api.connection.TypeDBClient; import com.vaticle.typedb.client.api.connection.TypeDBSession; import com.vaticle.typedb.client.api.connection.TypeDBTransaction; -import com.vaticle.typedb.client.api.concept.type.ThingType; import org.junit.Test; import java.util.stream.Collectors; diff --git a/test/integration/ClientQueryTest.java b/test/integration/ClientQueryTest.java index 53527eef16..fa604ee7a8 100644 --- a/test/integration/ClientQueryTest.java +++ b/test/integration/ClientQueryTest.java @@ -22,11 +22,11 @@ package com.vaticle.typedb.client.test.integration; import com.vaticle.typedb.client.TypeDB; +import com.vaticle.typedb.client.api.answer.ConceptMap; import com.vaticle.typedb.client.api.connection.TypeDBClient; import com.vaticle.typedb.client.api.connection.TypeDBOptions; import com.vaticle.typedb.client.api.connection.TypeDBSession; import com.vaticle.typedb.client.api.connection.TypeDBTransaction; -import com.vaticle.typedb.client.api.answer.ConceptMap; import com.vaticle.typedb.client.api.logic.Explanation; import com.vaticle.typedb.common.test.server.TypeDBCoreRunner; import com.vaticle.typeql.lang.TypeQL; @@ -59,13 +59,14 @@ import static org.junit.Assert.assertEquals; @SuppressWarnings("Duplicates") + public class ClientQueryTest { private static final Logger LOG = LoggerFactory.getLogger(ClientQueryTest.class); private static TypeDBCoreRunner typedb; private static TypeDBClient typedbClient; @BeforeClass - public static void setUpClass() throws InterruptedException, IOException, TimeoutException { + public static void setup() throws InterruptedException, IOException, TimeoutException { typedb = new TypeDBCoreRunner(); typedb.start(); typedbClient = TypeDB.coreClient(typedb.address()); @@ -74,7 +75,7 @@ public static void setUpClass() throws InterruptedException, IOException, Timeou } @AfterClass - public static void closeSession() { + public static void teardown() { typedbClient.close(); typedb.stop(); }