This is an automated email from the ASF dual-hosted git repository.
kenhuuu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/master by this push:
new 4ccb9d1f87 Improve 4-beta3 documentation CTR.
4ccb9d1f87 is described below
commit 4ccb9d1f87bdb19641c923a67912f6671bb12cf8
Author: Ken Hu <[email protected]>
AuthorDate: Fri Jul 17 13:54:49 2026 -0700
Improve 4-beta3 documentation CTR.
Document canonical Gremlin literal syntax
Update maxConnections references
Remove stale driver pool option docs
Document semantics for new primitive types
Document scriptEngines behavior
Document GLV transaction source handles
Clarify managed transaction upgrade docs
Clarify Python driver upgrade docs
Assisted-by: Codex:gpt-5.5
---
docs/src/dev/provider/gremlin-semantics.asciidoc | 16 ++-
docs/src/reference/gremlin-applications.asciidoc | 27 +++++-
docs/src/reference/gremlin-variants.asciidoc | 24 ++++-
docs/src/reference/the-traversal.asciidoc | 44 +++++++++
docs/src/upgrade/release-4.x.x.asciidoc | 108 ++++++++++-----------
.../apache/tinkerpop/gremlin/driver/Client.java | 2 +-
6 files changed, 152 insertions(+), 69 deletions(-)
diff --git a/docs/src/dev/provider/gremlin-semantics.asciidoc
b/docs/src/dev/provider/gremlin-semantics.asciidoc
index b13b13e6dc..5ccfcd9112 100644
--- a/docs/src/dev/provider/gremlin-semantics.asciidoc
+++ b/docs/src/dev/provider/gremlin-semantics.asciidoc
@@ -250,20 +250,30 @@ any non-`null` value.
For Booleans, `TRUE == TRUE`, `FALSE == FALSE`, `TRUE != FALSE`, and `FALSE <
TRUE`.
-===== STRING
+===== STRING / CHAR
-We assume the common lexicographical order over unicode strings. `A` and `B`
are compared lexicographically, and
-`A == B` if `A` and `B` are lexicographically equal.
+We assume the common lexicographical order over unicode strings and
characters. `A` and `B` are compared
+lexicographically, and `A == B` if `A` and `B` are of the same type and
lexicographically equal.
===== UUID
UUID is evaluated based on its String representation. However,
`UUID("b46d37e9-755c-477e-9ab6-44aabea51d50")` and the
String `"b46d37e9-755c-477e-9ab6-44aabea51d50"` are not <<Equality,Equal>> and
not <<Comparability,Comparable>>.
+===== BINARY
+
+Binary values are evaluated based on lexicographical comparison of their byte
sequences, comparing each byte as a
+signed 8-bit value. `A == B` if `A` and `B` have the same bytes in the same
order.
+
===== DATETIME
Dates are evaluated based on the numerical comparison of Unix Epoch time.
+===== DURATION
+
+Durations are evaluated based on the numerical comparison of their total
length. `A == B` if `A` and `B` represent the
+same total length.
+
===== Graph Elements (VERTEX / EDGE / VPROPERTY)
If they are the same type of Element, these are compared by the value of their
`T.id` according to the semantics for
diff --git a/docs/src/reference/gremlin-applications.asciidoc
b/docs/src/reference/gremlin-applications.asciidoc
index 06b6c95011..04e1d43e67 100644
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@ -840,8 +840,7 @@ possible to define the language to utilize to process the
request:
[source,text]
curl -X POST -d "{\"gremlin\":\"100-x\", \"language\":\"gremlin-groovy\",
\"parameters\":\"[x:1]\"}" "http://localhost:8182"
-By default this value is set to `gremlin-groovy`. If using a `GET` operation,
this value can be set as a query
-string argument with by setting the `language` key.
+By default this value is set to `gremlin-lang`. The value is set in the
request body with the `language` key.
[[server-configuring]]
=== Configuring
@@ -955,7 +954,7 @@ The following table describes the various YAML
configuration options that Gremli
|metrics.slf4jReporter.intervalMillis |Time in milliseconds between reports of
metrics to SLF4j. |180000
|port |The port to bind the server to. |8182
|resultIterationBatchSize |Defines the size in which the result of a request
is "batched" back to the client. In other words, if set to `1`, then a result
that had ten items in it would get each result sent back individually. If set
to `2` the same ten results would come back in five batches of two each. |64
-|scriptEngines |A `Map` of `ScriptEngine` implementations to expose through
Gremlin Server, where the key is the name given by the `ScriptEngine`
implementation. The key must match the name exactly for the `ScriptEngine` to
be constructed. The value paired with this key is itself a `Map` of
configuration for that `ScriptEngine`. If this value is not set, it will
default to "gremlin-lang". |_gremlin-lang_
+|scriptEngines |A `Map` of `ScriptEngine` configurations keyed by
`ScriptEngine` name. See <<server-scriptengines-behavior>>. |_gremlin-lang_
|scriptEngines.<name>.imports |A comma separated list of classes/packages to
make available to the `ScriptEngine`. |_none_
|scriptEngines.<name>.staticImports |A comma separated list of "static"
imports to make available to the `ScriptEngine`. |_none_
|scriptEngines.<name>.scripts |A comma separated list of script files to
execute on `ScriptEngine` initialization. Deprecated — use `traversalSources`
and `lifecycleHooks` instead.|_none_
@@ -987,6 +986,28 @@ The following table describes the various YAML
configuration options that Gremli
See the <<metrics,Metrics>> section for more information on how to configure
Ganglia and Graphite.
+[[server-scriptengines-behavior]]
+==== scriptEngines Behavior
+
+The `scriptEngines` configuration identifies the `ScriptEngine`
implementations to expose through Gremlin Server.
+The key is the name given by the `ScriptEngine` implementation and must match
that name exactly. The value paired with
+this key is itself a `Map` of configuration for that `ScriptEngine`.
+
+Only `ScriptEngine` implementations listed in the configuration will accept
requests. The `gremlin-lang`
+`ScriptEngine` is always available regardless of configuration.
+
+A request that specifies an unlisted `language` will receive a `400 Bad
Request` response. Enabling `gremlin-groovy` or
+another `ScriptEngine` therefore requires an explicit entry in `scriptEngines`:
+
+[source,yaml]
+----
+scriptEngines: {
+ gremlin-lang: {},
+ gremlin-groovy: {
+ plugins: {
+ org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin:
{}}}}
+----
+
==== Serialization
Gremlin Server can accept requests and return results using different
serialization formats. Serializers implement the
diff --git a/docs/src/reference/gremlin-variants.asciidoc
b/docs/src/reference/gremlin-variants.asciidoc
index fa27b616bf..3bc95a6fb7 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -419,6 +419,9 @@ err = tx.Commit()
if err != nil { log.Fatal(err) }
----
+The transaction-bound source retains its owning transaction. Calling
`gtx.Tx()` returns the same `Transaction`, so
+lifecycle operations can also be performed from the source with calls such as
`gtx.Tx().Commit()`.
+
==== Managed Transaction Blocks
To avoid the manual begin/commit/rollback boilerplate, `g` provides closure
methods that manage the
@@ -724,6 +727,8 @@ therefore cardinality functions that take a value like
`list()`, `set()`, and `s
[[gremlin-go-limitations]]
=== Limitations
+* The Gremlin `Character` type is not supported by Gremlin-Go.
+
* There is no default `set` type in Go. Any set type code from server will be
deserialized into slices with the list
type implementation. To input a set into Gremlin-Go, a custom struct which
implements the `gremlingo.Set` interface
will be serialized as a set. `gremlingo.NewSimpleSet` is a basic
implementation of a set that is provided by Gremlin-Go
@@ -1153,6 +1158,9 @@ try {
Traversals spawned from `gtx` are bound to the transaction. The driver handles
host pinning and transaction ID
propagation automatically.
+The transaction-bound source retains its owning transaction. Calling
`gtx.tx()` returns the same `Transaction`, so
+lifecycle operations can also be performed from the source with calls such as
`gtx.tx().commit()`.
+
==== Managed Transaction Blocks
To avoid the manual begin/commit/rollback boilerplate, `g` also provides
closure methods that manage the
@@ -1640,9 +1648,7 @@ where this occurs:
The latter of the two can be addressed from the driver side in the following
ways:
* Increase the `maxWaitForConnection` allowing the client to wait a bit longer
for a connection to become available.
-* Increase the number of requests allowed per connection by increasing the
`maxSimultaneousUsagePerConnection` and
-`maxInProcessPerConnection` settings.
-* Increase the number of connections available in the connection pool by
increasing the `maxConnectionPoolSize`.
+* Increase the number of connections available in the connection pool by
increasing the `maxConnections`.
The exception and logs (assuming they are enabled) should contain information
about the state of the connection pool
along with its connections which can help shed more light on which of these
scenarios caused the problem. Some examples
@@ -1660,7 +1666,7 @@ _Client is likely issuing more requests than the pool
size can handle_
[source,text]
----
-Timed-out (150 MILLISECONDS) waiting for connection on
Host{address=localhost/127.0.0.1:45940,
hostUri=http://localhost:45940/gremlin}. Potential Cause: Number of active
requests exceeds pool size. Consider increasing the value for
maxConnectionPoolSize.
+Timed-out (150 MILLISECONDS) waiting for connection on
Host{address=localhost/127.0.0.1:45940,
hostUri=http://localhost:45940/gremlin}. Potential Cause: Number of active
requests (1) exceeds pool size (1). Consider increasing the value for
maxConnections.
ConnectionPool (Host{address=localhost/127.0.0.1:45940,
hostUri=http://localhost:45940/gremlin})
Connection Pool Status (size=1 available=1 max=1 toCreate=0 bin=0 waiter=0)
> Connection{channel=5a859d62 isDead=false borrowed=1 pending=1
> markedReplaced=false closing=false created=2022-12-19T21:08:21.569613100Z
> thread=gremlin-driver-conn-scheduler-1}
@@ -2180,6 +2186,9 @@ await gtx.addV("person").property("name",
"josh").iterate();
await tx.commit();
----
+The transaction-bound source retains its owning transaction. Calling
`gtx.tx()` returns the same `Transaction`, so
+lifecycle operations can also be performed from the source with calls such as
`await gtx.tx().commit()`.
+
==== Managed Transaction Blocks
To avoid the manual begin/commit/rollback boilerplate, `g` provides an
`executeInTx` method that manages the
@@ -2501,6 +2510,7 @@ exact type sent to the server — see
<<gremlin-javascript-numeric-types>>.
signed range are unsuffixed (Int), integers beyond that up to
`Number.MAX_SAFE_INTEGER` use the `L` suffix (Long),
non-integer numbers and integers beyond the safe range use the `D` suffix
(Double), and `BigInt` values use the `N`
suffix (BigInteger).
+* Gremlin `Character` and `Duration` values are not supported.
* The `subgraph()`-step returns a detached `Graph` data container exposing
`vertices: Map<any, Vertex>` and `edges: Map<any, Edge>`. The result is not a
live `Graph` instance: mutating the
collections has no effect on the source graph, and it cannot be passed to
`traversal().with(...)`. To re-query
@@ -2867,6 +2877,9 @@ await gtx.AddV("person").Property("name",
"josh").Promise(t => t.Iterate());
await tx.CommitAsync();
----
+The transaction-bound source retains its owning transaction. Calling
`gtx.Tx()` returns the same `RemoteTransaction`,
+so lifecycle operations can also be performed from the source with calls such
as `await gtx.Tx().CommitAsync()`.
+
==== Managed Transaction Blocks
To avoid the manual begin/commit/rollback boilerplate, `g` provides closure
methods that manage the
@@ -3577,6 +3590,9 @@ gtx.addV('person').property('name', 'josh').iterate()
tx.commit()
----
+The transaction-bound source retains its owning transaction. Calling
`gtx.tx()` returns the same `Transaction`, so
+lifecycle operations can also be performed from the source with calls such as
`gtx.tx().commit()`.
+
==== Managed Transaction Blocks
To avoid the manual begin/commit/rollback boilerplate, `g` provides an
`execute_in_tx` method that manages the
diff --git a/docs/src/reference/the-traversal.asciidoc
b/docs/src/reference/the-traversal.asciidoc
index a44084506a..5a849914d9 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -153,6 +153,10 @@ GraphTraversalSource gtx2 = tx2.begin();
// g operates outside of both tx1 and tx2
----
+The transaction-bound `GraphTraversalSource` can also act as the transaction
handle. Calling `gtx.tx()` (or the
+language-specific casing equivalent) returns the same `Transaction`, which
allows code that only passes `gtx` through a
+helper to still close the transaction with `gtx.tx().commit()` or
`gtx.tx().rollback()`.
+
In remote cases, `GraphTraversalSource` instances spawned from `begin()` are
safe to use from a single thread. The
default behavior of `close()` on a `Transaction` for remote cases is to
`rollback()`, ensuring partial work is
discarded if the user forgets to commit. Users must call `commit()` explicitly
to persist data.
@@ -6174,6 +6178,46 @@ By default, `GType` enumerations are registered using
their simple class names a
g.V().values('age','name').is(P.typeOf('Integer'))
----
+[[canonical-gremlin-literal-types]]
+=== Canonical Gremlin Literal Types
+
+Canonical Gremlin represents typed values as text so that scripts and GLV
requests can be expressed in the
+`gremlin-lang` language and parsed by the `gremlin-lang` script engine. The
authoritative definition of this syntax is
+the
link:https://github.com/apache/tinkerpop/blob/x.y.z/gremlin-language/src/main/antlr4/Gremlin.g4[Gremlin.g4
ANTLR grammar].
+This section summarizes the commonly used literal forms for convenience when
reading canonical Gremlin or writing direct
+script requests.
+
+[width="100%",cols="2,3,6",options="header"]
+|=========================================================
+|Type |Canonical form |Expected input
+|null |`null` |The literal keyword `null`.
+|Boolean |`true`, `false` |The literal keywords `true` and `false`.
+|String |`"marko"`, `'marko'`, `"M"s` |A single-quoted or double-quoted
string. The optional `s` suffix still produces a `String`.
+|Character |`"M"c`, `'M'c` |A single-quoted or double-quoted value that is one
character.
+|Byte |`1B` |An integer with a `B` suffix and a value within the bounds of
`Byte`.
+|Short |`1S` |An integer with an `S` suffix and a value within the bounds of
`Short`.
+|Integer |`1`, `1I` |An integer within the bounds of `Integer`. The `I` suffix
forces `Integer`.
+|Long |`1L` |An integer with an `L` suffix and a value within the bounds of
`Long`.
+|BigInteger |`1N` |An integer with an `N` suffix.
+|Float |`1.0F` |A floating-point number with an `F` suffix and a value within
the bounds of `Float`.
+|Double |`1.0`, `1.0D` |A floating-point number with an optional `D` suffix.
+|BigDecimal |`1.0M` |A floating-point number with an `M` suffix.
+|DateTime |`DateTime("2018-03-22T00:35:44Z")`, `DateTime()` |An ISO-8601 date
or date-time string. `DateTime()` evaluates to the current time.
+|UUID |`UUID("f47af10b-58cc-4372-a567-0f02b2f3d479")`, `UUID()` |A UUID string
in the textual form written as 8-4-4-4-12 hexadecimal digit groups. `UUID()`
generates a random UUID.
+|Duration |`Duration(3600,0)`, `Duration(30,0,false)` |The first argument is
non-negative seconds. The second is nanoseconds from `0` to `999999999`. The
optional third argument is a boolean sign flag with `false` negating the
duration.
+|Binary |`Binary("AQID")` |A Base64-encoded string.
+|Enum |`T.id`, `Cardinality.single`, `Direction.OUT` |A Gremlin enum token
from `T`, `Cardinality`, `Direction`, `Merge`, `Pick`, `DT`, or `GType`.
+|List |`[1,"two",null]` |A comma-separated sequence of generic literals inside
square brackets.
+|Set |`{1,"two"}` |A comma-separated sequence of generic literals inside
braces.
+|Map |`[:]`, `["name":"marko", "age":29]` |An empty map is `[:]`. A populated
map is a comma-separated sequence of `key:value` entries inside square brackets.
+|Provider Defined Type |`PDT("Point",["x":1,"y":2])`, `PDT("Uint32","42")`
|The first argument is the provider-defined type name. The composite form
expects a map literal with string keys. The primitive form expects an opaque
string value.
+|=========================================================
+
+NOTE: Numeric values may be signed, and integer values may use decimal,
hexadecimal (`0x`), or octal (`0`) notation.
+Underscores may appear between digits. Numeric type suffixes are accepted in
either uppercase or lowercase form, though
+the examples above use uppercase suffixes. Special floating-point values are
expressed as `NaN`, `Infinity`,
+`+Infinity`, or `-Infinity`.
+
[[a-note-on-maps]]
== A Note on Maps
diff --git a/docs/src/upgrade/release-4.x.x.asciidoc
b/docs/src/upgrade/release-4.x.x.asciidoc
index 5221c0a9a0..bd9e9f02b1 100644
--- a/docs/src/upgrade/release-4.x.x.asciidoc
+++ b/docs/src/upgrade/release-4.x.x.asciidoc
@@ -214,33 +214,40 @@ Each GLV provides two entry points:
* **Traversal API**: `g.tx().begin()` returns a transaction-bound
`GraphTraversalSource`
* **Driver API**: `client.transact()` (or `client.Transact()` in .NET) returns
a `Transaction` with `submit()` methods
-See the <<gremlin-drivers-variants,Gremlin Drivers and Variants>> reference
documentation for language-specific
-syntax and examples.
+See the
link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-drivers-variants[Gremlin
Drivers and Variants]
+reference documentation for language-specific syntax and examples.
===== Managed Transaction Blocks
-In addition to the manual `begin()`/`commit()`/`rollback()` lifecycle, every
GLV (including the Java driver and embedded
-Java graphs) now offers closure-based convenience methods directly on
`GraphTraversalSource` (`g`). You hand `g` a
-function that receives the transaction-bound `g` (`gtx`), and the transaction
lifecycle is managed for you: the
-transaction is begun, your function runs, and it is committed on normal
completion or rolled back if your function
-raises. This reduces the common begin/do-work/commit boilerplate and makes it
harder to accidentally run a traversal
-against the non-transactional `g`, since only the transactional source is in
scope inside the closure. The methods are a
-Traversal-API convenience (they live on `g`, not on the `Transaction` returned
by `g.tx()`).
-
-The method naming follows each language's idiom (the value-returning form is
`evaluateInTx` rather than `call`, because
-`call` is already the `call()` service step on `GraphTraversalSource`):
-
-* **Java**: `g.executeInTx(Consumer)` (no return) and
`g.evaluateInTx(Function)` (returns the body's value).
-* **Python**: `g.execute_in_tx(fn)` — a single method that returns whatever
the function returns.
-* **JavaScript**: `await g.executeInTx(fn)` — the callback may be `async`;
resolves to the callback's return value.
-* **.NET**: `g.ExecuteInTxAsync(Func<..,Task>)` and
`g.EvaluateInTxAsync<T>(Func<..,Task<T>>)`, both accepting an optional
`CancellationToken`.
-* **Go**: `g.ExecuteInTx(func(*GraphTraversalSource) error) error` and
`g.EvaluateInTx(func(*GraphTraversalSource) (interface{}, error)) (interface{},
error)`.
-
-The closure runs the transaction exactly once (no automatic retry). If the
function fails, the original error is
-re-raised after rollback; if `commit()` fails, the commit error is raised and
a rollback is still attempted to release
-server-side resources. The manual `begin()`/`commit()`/`rollback()` API
remains available and unchanged for advanced
-use. See the <<gremlin-drivers-variants,Gremlin Drivers and Variants>>
reference documentation for language-specific
-examples.
+Managed transaction blocks provide a shorter way to run a unit of work in a
transaction. The application passes a
+closure to `g`, receives a transaction-bound `gtx`, and the transaction will
be committed when the closure completes
+normally or rolled back when the closure throws.
+
+[source,java]
+----
+// before: manage the transaction lifecycle directly
+Transaction tx = g.tx();
+GraphTraversalSource gtx = tx.begin();
+try {
+ gtx.addV("person").property("name", "alice").iterate();
+ gtx.addV("software").property("name", "graph-app").iterate();
+ tx.commit();
+} catch (RuntimeException ex) {
+ tx.rollback();
+ throw ex;
+}
+
+// now: let the traversal source manage the lifecycle
+g.executeInTx(gtx -> {
+ gtx.addV("person").property("name", "alice").iterate();
+ gtx.addV("software").property("name", "graph-app").iterate();
+});
+----
+
+The same managed transaction pattern is supported in every GLV, with method
names following each language's
+conventions. See the
+link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-drivers-variants[Gremlin
Drivers and Variants]
+reference documentation for language-specific syntax and error-handling
details.
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3253[TINKERPOP-3253]
@@ -527,8 +534,6 @@ A character literal is a single-character string with a `c`
suffix:
g.V().has("initial","M"c)
----
-NOTE: Character is not supported in gremlin-go or gremlin-javascript.
-
===== Duration
A duration literal uses seconds and nanoseconds with an optional sign flag:
@@ -567,48 +572,26 @@ g.V().has("blob",P.eq(Binary("AQID")))
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3153[TINKERPOP-3153]
-==== Python Driver Simplification — Removed GraphSON, Abstract Base Classes,
and Protocol Layer
-
-The `AbstractBaseTransport`, `AbstractBaseProtocol`, and
`GremlinServerHTTPProtocol` classes have been removed from
-`gremlin-python`. The protocol layer's request-building logic (serialization,
headers, interceptors, auth) has been
-merged directly into `Connection`. The driver now uses `AiohttpHTTPTransport`
directly without an abstract transport
-interface.
+==== Python Driver Simplification
-`GremlinServerError` has moved from `gremlin_python.driver.protocol` to
`gremlin_python.driver.connection`:
-
-The `GraphSONSerializersV4` class and the
`gremlin_python.structure.io.graphsonV4` module have been removed.
-GraphBinary is the only supported wire format for the Python driver in
TinkerPop 4. Code that constructed
-`GraphSONSerializersV4()` or imported from
`gremlin_python.structure.io.graphsonV4` must switch to
-`GraphBinarySerializersV4` (the default `response_serializer`):
-
-[source,python]
-----
-# Before
-from gremlin_python.driver.protocol import GremlinServerError
-
-# After
-from gremlin_python.driver.connection import GremlinServerError
-----
-
-The `protocol_factory` and `transport_factory` parameters have been removed
from `Client`,
-`DriverRemoteConnection`, and `Connection`. Users who were passing a custom
`protocol_factory` should use the
-`response_serializer`, `auth`, and `interceptors` parameters directly instead.
These cover all functionality that
-`GremlinServerHTTPProtocol` previously provided.
-
-Transport options like SSL and timeouts are now passed as keyword arguments
directly:
+Gremlin for Python has been heavily refactored for this release, simplifying
driver usage and removing unnecessary
+infrastructure. Key areas for change to consider when upgrading include
removal of the old mechanism used to configure
+a custom `transport_factory`, which was commonly used to pass SSL and timeout
options into the underlying transport.
+Those settings now pass directly to `Client` or `DriverRemoteConnection`:
[source,python]
----
# Before
from gremlin_python.driver.aiohttp.transport import AiohttpHTTPTransport
+
Client(url, 'g', transport_factory=lambda:
AiohttpHTTPTransport(ssl_options=ctx, read_timeout=30))
# After
Client(url, 'g', ssl=ctx, read_timeout=30)
----
-The `Connection` constructor signature has changed. The `protocol` and
`transport_factory` positional arguments have
-been removed. Transport kwargs are forwarded to `AiohttpHTTPTransport`
internally:
+The lower-level `Connection` API follows the same simplification. The old
protocol and transport factory arguments have
+been removed, and serializer, authentication, interceptor, and transport
settings are configured directly:
[source,python]
----
@@ -621,9 +604,18 @@ Connection(url, traversal_source, executor, pool,
auth=None, interceptors=None, **transport_kwargs)
----
-Custom transport implementations are no longer supported. The driver uses
`AiohttpHTTPTransport` directly.
+`GremlinServerError` now imports from `gremlin_python.driver.connection`:
+
+[source,python]
+----
+# Before
+from gremlin_python.driver.protocol import GremlinServerError
+
+# After
+from gremlin_python.driver.connection import GremlinServerError
+----
-See:
link:https://tinkerpop.apache.org/docs/4.0.0/reference/#gremlin-python[Gremlin-Python]
+See:
link:https://tinkerpop.apache.org/docs/4.0.0-beta.3/reference/#gremlin-python[Gremlin-Python]
==== Removal of sparql-gremlin
diff --git
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
index 2348884b60..adb93f6335 100644
---
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
+++
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
@@ -58,7 +58,7 @@ public abstract class Client implements RequestSubmitter,
RequestSubmitterAsync
private static final Logger logger = LoggerFactory.getLogger(Client.class);
public static final String TOO_MANY_IN_FLIGHT_REQUESTS = "Number of active
requests (%s) exceeds pool size (%s). " +
- "Consider increasing the value for maxConnectionPoolSize.";
+ "Consider increasing the value for maxConnections.";
protected final Cluster cluster;
protected volatile boolean initialized;