tinkerpop-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From spmalle...@apache.org
Subject [1/2] incubator-tinkerpop git commit: Added a strictTransactionManagement setting to Gremlin Server.
Date Mon, 14 Dec 2015 17:27:55 GMT
Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 32e6d281a -> e3042c09b


Added a strictTransactionManagement setting to Gremlin Server.

Basically forces the user to pass the aliases argument.  Gremlin Server then uses that to
determine the scope of the transactions to close.  This setting is false by default so as
to be backward compatible.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/8b3af127
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/8b3af127
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/8b3af127

Branch: refs/heads/master
Commit: 8b3af12715678543f444f79c314e427019762f5a
Parents: 5a9ba5f
Author: Stephen Mallette <spmva@genoprime.com>
Authored: Wed Dec 9 17:17:37 2015 -0500
Committer: Stephen Mallette <spmva@genoprime.com>
Committed: Wed Dec 9 17:17:37 2015 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../src/reference/gremlin-applications.asciidoc |  8 +++
 .../upgrade/release-3.1.x-incubating.asciidoc   | 10 +++-
 gremlin-server/conf/gremlin-server-classic.yaml |  1 +
 gremlin-server/conf/gremlin-server-min.yaml     |  1 +
 .../conf/gremlin-server-modern-readonly.yaml    |  1 +
 gremlin-server/conf/gremlin-server-modern.yaml  |  1 +
 gremlin-server/conf/gremlin-server-neo4j.yaml   |  1 +
 .../conf/gremlin-server-rest-modern.yaml        |  1 +
 .../conf/gremlin-server-rest-secure.yaml        |  1 +
 gremlin-server/conf/gremlin-server-secure.yaml  |  1 +
 gremlin-server/conf/gremlin-server-spark.yaml   |  1 +
 gremlin-server/conf/gremlin-server.yaml         |  1 +
 .../tinkerpop/gremlin/server/GraphManager.java  | 46 ++++++++++++++++
 .../tinkerpop/gremlin/server/Settings.java      |  9 ++++
 .../gremlin/server/channel/HttpChannelizer.java |  2 +-
 .../handler/HttpGremlinEndpointHandler.java     | 37 ++++++++++---
 .../server/op/AbstractEvalOpProcessor.java      | 30 ++++++-----
 .../server/op/session/SessionOpProcessor.java   |  1 -
 .../server/op/standard/StandardOpProcessor.java | 27 +++++++---
 .../server/GremlinDriverIntegrateTest.java      | 55 ++++++++++++++++++++
 .../server/GremlinServerHttpIntegrateTest.java  | 36 +++++++++++++
 .../server/gremlin-server-integration.yaml      |  1 +
 .../server/gremlin-server-performance.yaml      |  1 +
 24 files changed, 243 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 5ebd2de..d046adb 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -27,6 +27,7 @@ TinkerPop 3.1.1 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 * Fixed a `SparkGraphComputer` sorting bug in MapReduce that occurred when there was more
than one partition.
+* Added `strictTransactionManagement` to the Gremlin Server settings to indicate that the
`aliases` parameter must be passed on requests and that transaction management will be scoped
to the graphs provided in that argument.
 * Fixed a `NullPointerException` bug in `PeerPressureVertexProgram` that occurred when an
adjacency traversal was not provided.
 * Improved Transaction Management consistency in Gremlin Server.
 * Fixed a long standing "view merge" issue requiring `reduceByKey()` on input data to Spark.
It is no longer required.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/docs/src/reference/gremlin-applications.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/gremlin-applications.asciidoc b/docs/src/reference/gremlin-applications.asciidoc
index 812a1d7..7dc9064 100644
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@ -731,6 +731,7 @@ The following table describes the various configuration options that Gremlin
Ser
 |ssl.keyFile |The `PKCS#8` private key file in PEM format. If this value is not present and
`ssl.enabled` is `true` a self-signed certificate will be used (not suitable for production).
|_none_
 |ssl.keyPassword |The password of the `keyFile` if it's not password-protected |_none_
 |ssl.trustCertChainFile |Trusted certificates for verifying the remote endpoint's certificate.
The file should contain an X.509 certificate chain in PEM format. A system default will be
used if this setting is not present. |_none_
+|strictTransactionManagement |Set to `true` to require `aliases` to be submitted on every
requests, where the `aliases` become the scope of transaction management. |false
 |threadPoolBoss |The number of threads available to Gremlin Server for accepting connections.
Should always be set to `1`. |1
 |threadPoolWorker |The number of threads available to Gremlin Server for processing non-blocking
reads and writes. |1
 |writeBufferHighWaterMark | If the number of bytes in the network send buffer exceeds this
value then the channel is no longer writeable, accepting no additional writes until buffer
is drained and the `writeBufferLowWaterMark` is met. |65536
@@ -1156,6 +1157,13 @@ Server attempts to detect these types of traversals and treat them
specially. Th
 result of this script must be realized in memory which means that they aren't being streamed
back to the client.
 For small results this likely should not present an issue.
 
+Another aspect of Transaction Management that should be considered is the usage of the `strictTransactionManagement`
+setting.  It is `false` by default, but when set to `true`, it forces the user to pass `aliases`
for all requests.
+The aliases are then used to determine which graphs will have their transactions closed for
that request. Running
+Gremlin Server in this configuration should be more efficient when there are multiple graphs
being hosted as
+Gremlin Server will only close transactions on the graphs specified by the `aliases`. Keeping
this setting `false`,
+will simply have Gremlin Server close transactions on all graphs for every request.
+
 NOTE: It is possible to bypass the transaction management system around `GraphTraversal`
by using a lambda. Gremlin
 Server is only looking for `Mutating` steps, so a script like: `g.V().sideEffect{it.get().property('color','green')}`
 would not be iterated prior to commit and the mutations not realized.  If lambdas must be
used then it is important

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/docs/src/upgrade/release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.1.x-incubating.asciidoc b/docs/src/upgrade/release-3.1.x-incubating.asciidoc
index 08e38e7..dcc9b4e 100644
--- a/docs/src/upgrade/release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.1.x-incubating.asciidoc
@@ -46,7 +46,15 @@ the `Graph`, will fail to do so unless it is self-iterated.  In other words,
ins
 `g.V().sideEffect{it.get().property('color','green')}` one would send:
 `g.V().sideEffect{it.get().property('color','green')}.toList()`
 
-See: link:https://issues.apache.org/jira/browse/TINKERPOP-1035[TINKERPOP-1035],
+In addition, Gremlin Server now has a new setting called `strictTransactionManagement`, which
forces the user to pass
+`aliases` for all requests. The aliases are then used to determine which graphs will have
their transactions closed
+for that request. The alternative is to continue with default operations where the transactions
of all configured
+graphs will be closed. It is likely that `strictTransactionManagement` (which is `false`
by default so as to be
+backward compatible with previous versions) will become the future standard mode of operation
for Gremlin Server as
+it provides a more efficient method for transaction management.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-930[TINKERPOP-930],
+link:https://issues.apache.org/jira/browse/TINKERPOP-1035[TINKERPOP-1035],
 link:http://tinkerpop.apache.org/docs/3.1.1-incubating/#considering-transactions[Reference
Documentation - Considering Transactions]
 
 Deprecated credentialsDbLocation

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-classic.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-classic.yaml b/gremlin-server/conf/gremlin-server-classic.yaml
index a054346..6ec2a37 100644
--- a/gremlin-server/conf/gremlin-server-classic.yaml
+++ b/gremlin-server/conf/gremlin-server-classic.yaml
@@ -35,6 +35,7 @@ serializers:
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config:
{ serializeResultToString: true }}   # application/vnd.gremlin-v1.0+gryo-stringd
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-min.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-min.yaml b/gremlin-server/conf/gremlin-server-min.yaml
index a769c16..042ee29 100644
--- a/gremlin-server/conf/gremlin-server-min.yaml
+++ b/gremlin-server/conf/gremlin-server-min.yaml
@@ -33,6 +33,7 @@ serializers:
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config:
{ useMapperFromGraph: graph }}         # application/json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-modern-readonly.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-modern-readonly.yaml b/gremlin-server/conf/gremlin-server-modern-readonly.yaml
index 1f44153..97ce6da 100644
--- a/gremlin-server/conf/gremlin-server-modern-readonly.yaml
+++ b/gremlin-server/conf/gremlin-server-modern-readonly.yaml
@@ -35,6 +35,7 @@ serializers:
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config:
{ serializeResultToString: true }}   # application/vnd.gremlin-v1.0+gryo-stringd
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-modern.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-modern.yaml b/gremlin-server/conf/gremlin-server-modern.yaml
index 35b1f54..5744d29 100644
--- a/gremlin-server/conf/gremlin-server-modern.yaml
+++ b/gremlin-server/conf/gremlin-server-modern.yaml
@@ -35,6 +35,7 @@ serializers:
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config:
{ serializeResultToString: true }}   # application/vnd.gremlin-v1.0+gryo-stringd
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-neo4j.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-neo4j.yaml b/gremlin-server/conf/gremlin-server-neo4j.yaml
index 81f257d..e9d6cd7 100644
--- a/gremlin-server/conf/gremlin-server-neo4j.yaml
+++ b/gremlin-server/conf/gremlin-server-neo4j.yaml
@@ -58,6 +58,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-rest-modern.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-rest-modern.yaml b/gremlin-server/conf/gremlin-server-rest-modern.yaml
index c15c15f..62ad779 100644
--- a/gremlin-server/conf/gremlin-server-rest-modern.yaml
+++ b/gremlin-server/conf/gremlin-server-rest-modern.yaml
@@ -36,6 +36,7 @@ serializers:
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config:
{ useMapperFromGraph: graph }}         # application/json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-rest-secure.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-rest-secure.yaml b/gremlin-server/conf/gremlin-server-rest-secure.yaml
index 5fe36c7..0659f74 100644
--- a/gremlin-server/conf/gremlin-server-rest-secure.yaml
+++ b/gremlin-server/conf/gremlin-server-rest-secure.yaml
@@ -58,6 +58,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-secure.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-secure.yaml b/gremlin-server/conf/gremlin-server-secure.yaml
index c203c0a..721932b 100644
--- a/gremlin-server/conf/gremlin-server-secure.yaml
+++ b/gremlin-server/conf/gremlin-server-secure.yaml
@@ -58,6 +58,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server-spark.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-spark.yaml b/gremlin-server/conf/gremlin-server-spark.yaml
index 32626a4..e6510b6 100644
--- a/gremlin-server/conf/gremlin-server-spark.yaml
+++ b/gremlin-server/conf/gremlin-server-spark.yaml
@@ -71,6 +71,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/conf/gremlin-server.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server.yaml b/gremlin-server/conf/gremlin-server.yaml
index b0cfaa0..f310f56 100644
--- a/gremlin-server/conf/gremlin-server.yaml
+++ b/gremlin-server/conf/gremlin-server.yaml
@@ -48,6 +48,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
index aceac78..d633cad 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
@@ -20,14 +20,19 @@ package org.apache.tinkerpop.gremlin.server;
 
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Transaction;
 import org.apache.tinkerpop.gremlin.structure.util.GraphFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.script.Bindings;
 import javax.script.SimpleBindings;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Predicate;
 
 /**
  * Holder for {@link Graph} and {@link TraversalSource} instances configured for the server
to be passed to script
@@ -101,6 +106,13 @@ public final class GraphManager {
     }
 
     /**
+     * Selectively rollback transactions on the specified graphs or the graphs of traversal
sources.
+     */
+    public void rollback(final Set<String> graphSourceNamesToCloseTxOn) {
+        closeTx(graphSourceNamesToCloseTxOn, Transaction.Status.ROLLBACK);
+    }
+
+    /**
      * Commit transactions across all {@link Graph} objects.
      */
     public void commitAll() {
@@ -110,4 +122,38 @@ public final class GraphManager {
                 g.tx().commit();
         });
     }
+
+    /**
+     * Selectively commit transactions on the specified graphs or the graphs of traversal
sources.
+     */
+    public void commit(final Set<String> graphSourceNamesToCloseTxOn) {
+        closeTx(graphSourceNamesToCloseTxOn, Transaction.Status.COMMIT);
+    }
+
+    /**
+     * Selectively close transactions on the specified graphs or the graphs of traversal
sources.
+     */
+    private void closeTx(final Set<String> graphSourceNamesToCloseTxOn, final Transaction.Status
tx) {
+        final Set<Graph> graphsToCloseTxOn = new HashSet<>();
+
+        // by the time this method has been called, it should be validated that the source/graph
is present.
+        // might be possible that it could have been removed dynamically, but that i'm not
sure how one would do
+        // that as of right now unless they were embedded in which case they'd need to know
what they were doing
+        // anyway
+        graphSourceNamesToCloseTxOn.forEach(r -> {
+            if (graphs.containsKey(r))
+                graphsToCloseTxOn.add(graphs.get(r));
+            else
+                graphsToCloseTxOn.add(traversalSources.get(r).getGraph().get());
+        });
+
+        graphsToCloseTxOn.forEach(graph -> {
+            if (graph.features().graph().supportsTransactions()) {
+                if (tx == Transaction.Status.COMMIT)
+                    graph.tx().commit();
+                else
+                    graph.tx().rollback();
+            }
+        });
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
index 5b3c2bf..e97a45e 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
@@ -161,6 +161,15 @@ public class Settings {
     public int writeBufferLowWaterMark = 1024 * 32;
 
     /**
+     * If set to {@code true} the {@code aliases} option is required on requests and Gremlin
Server will use that
+     * information to control which {@link Graph} instances are transaction managed for that
request.  If this
+     * setting is false (which is the default), specification of {@code aliases} is not required
and Gremlin
+     * Server will simply apply a commit for all graphs.  This setting only applies to sessionless
requests.
+     * With either setting the user is responsible for their own transaction management for
in-session requests.
+     */
+    public boolean strictTransactionManagement = false;
+
+    /**
      * The full class name of the {@link Channelizer} to use in Gremlin Server.
      */
     public String channelizer = WebSocketChannelizer.class.getName();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/channel/HttpChannelizer.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/channel/HttpChannelizer.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/channel/HttpChannelizer.java
index 0873473..9e58a40 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/channel/HttpChannelizer.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/channel/HttpChannelizer.java
@@ -47,7 +47,7 @@ public class HttpChannelizer extends AbstractChannelizer {
     @Override
     public void init(final ServerGremlinExecutor<EventLoopGroup> serverGremlinExecutor)
{
         super.init(serverGremlinExecutor);
-        httpGremlinEndpointHandler = new HttpGremlinEndpointHandler(serializers, gremlinExecutor,
graphManager);
+        httpGremlinEndpointHandler = new HttpGremlinEndpointHandler(serializers, gremlinExecutor,
graphManager, settings);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
index 51fcc26..f03f9c2 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.server.GraphManager;
 import org.apache.tinkerpop.gremlin.server.GremlinServer;
+import org.apache.tinkerpop.gremlin.server.Settings;
 import org.apache.tinkerpop.gremlin.server.util.MetricManager;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.util.function.FunctionUtils;
@@ -64,6 +65,7 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -82,7 +84,12 @@ import static io.netty.handler.codec.http.HttpHeaders.is100ContinueExpected;
 import static io.netty.handler.codec.http.HttpHeaders.isKeepAlive;
 import static io.netty.handler.codec.http.HttpMethod.GET;
 import static io.netty.handler.codec.http.HttpMethod.POST;
-import static io.netty.handler.codec.http.HttpResponseStatus.*;
+import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST;
+import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE;
+import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR;
+import static io.netty.handler.codec.http.HttpResponseStatus.METHOD_NOT_ALLOWED;
+import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND;
+import static io.netty.handler.codec.http.HttpResponseStatus.OK;
 import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
 
 /**
@@ -120,14 +127,18 @@ public class HttpGremlinEndpointHandler extends ChannelInboundHandlerAdapter
{
 
     private final GremlinExecutor gremlinExecutor;
     private final GraphManager graphManager;
-    final Pattern pattern = Pattern.compile("(.*);q=(.*)");
+    private final Settings settings;
+
+    private static final Pattern pattern = Pattern.compile("(.*);q=(.*)");
 
     public HttpGremlinEndpointHandler(final Map<String, MessageSerializer> serializers,
                                       final GremlinExecutor gremlinExecutor,
-                                      final GraphManager graphManager) {
+                                      final GraphManager graphManager,
+                                      final Settings settings) {
         this.serializers = serializers;
         this.gremlinExecutor = gremlinExecutor;
         this.graphManager = graphManager;
+        this.settings = settings;
     }
 
     @Override
@@ -226,12 +237,15 @@ public class HttpGremlinEndpointHandler extends ChannelInboundHandlerAdapter
{
                             final ResponseMessage responseMessage = ResponseMessage.build(UUID.randomUUID())
                                     .code(ResponseStatusCode.SUCCESS)
                                     .result(IteratorUtils.asList(o)).create();
+
+                            // http server is sessionless and must handle commit on transactions.
the commit occurs
+                            // before serialization to be consistent with how things work
for websocket based
+                            // communication.  this means that failed serialization does
not mean that you won't get
+                            // a commit to the database
+                            attemptCommit(requestArguments.getValue3(), graphManager, settings.strictTransactionManagement);
+
                             try {
-                                Object wrappedBuffer = Unpooled.wrappedBuffer(
-                                        serializer.getValue1().serializeResponseAsString(responseMessage).getBytes(UTF8));
-                                // http server is sessionless and must handle commit on transactions
-                                this.graphManager.commitAll();
-                                return wrappedBuffer;
+                                return Unpooled.wrappedBuffer(serializer.getValue1().serializeResponseAsString(responseMessage).getBytes(UTF8));
                             } catch (Exception ex) {
                                 logger.warn(String.format("Error during serialization for
%s", responseMessage), ex);
                                 throw ex;
@@ -435,4 +449,11 @@ public class HttpGremlinEndpointHandler extends ChannelInboundHandlerAdapter
{
         // Close the connection as soon as the error message is sent.
         ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
     }
+
+    private static void attemptCommit(final Map<String, String> aliases, final GraphManager
graphManager, final boolean strict) {
+        if (strict)
+            graphManager.commit(new HashSet<>(aliases.values()));
+        else
+            graphManager.commitAll();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
index fb415b5..f3dfae1 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
@@ -20,8 +20,6 @@ package org.apache.tinkerpop.gremlin.server.op;
 
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.Timer;
-import io.netty.channel.ChannelFuture;
-import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.Tokens;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
@@ -29,31 +27,24 @@ import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.server.handler.StateKey;
+import org.apache.tinkerpop.gremlin.server.GraphManager;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.server.Context;
 import org.apache.tinkerpop.gremlin.server.GremlinServer;
 import org.apache.tinkerpop.gremlin.server.OpProcessor;
 import org.apache.tinkerpop.gremlin.server.Settings;
 import org.apache.tinkerpop.gremlin.server.util.MetricManager;
-import org.apache.tinkerpop.gremlin.structure.io.Mapper;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoMapper;
 import org.apache.tinkerpop.gremlin.util.function.ThrowingConsumer;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import io.netty.channel.ChannelHandlerContext;
 import org.apache.commons.lang.time.StopWatch;
-import org.apache.tinkerpop.shaded.kryo.Kryo;
-import org.apache.tinkerpop.shaded.kryo.io.ByteBufferOutputStream;
-import org.apache.tinkerpop.shaded.kryo.io.Input;
-import org.apache.tinkerpop.shaded.kryo.io.Output;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.script.Bindings;
-import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -224,7 +215,7 @@ public abstract class AbstractEvalOpProcessor implements OpProcessor {
         if (!itty.hasNext()) {
             // as there is nothing left to iterate if we are transaction managed then we
should execute a
             // commit here before we send back a NO_CONTENT which implies success
-            if (manageTransactions) context.getGraphManager().commitAll();
+            if (manageTransactions) attemptCommit(msg, context.getGraphManager(), settings.strictTransactionManagement);
             ctx.writeAndFlush(ResponseMessage.build(msg)
                     .code(ResponseStatusCode.NO_CONTENT)
                     .create());
@@ -255,7 +246,7 @@ public abstract class AbstractEvalOpProcessor implements OpProcessor {
             // the script has been executed. failures will bubble up before we start to iterate
results which makes
             // sense as we wouldn't want to waste time sending back results when the transaction
is going to end up
             // failing
-            context.getGraphManager().commitAll();
+            attemptCommit(msg, context.getGraphManager(), settings.strictTransactionManagement);
         }
 
         // the batch size can be overridden by the request
@@ -308,6 +299,19 @@ public abstract class AbstractEvalOpProcessor implements OpProcessor
{
         stopWatch.stop();
     }
 
+    private static void attemptCommit(final RequestMessage msg, final GraphManager graphManager,
final boolean strict) {
+        if (strict) {
+            // assumes that validations will already have been performed in extending classes
- they are performed
+            // in StandardOpProcessor when getting bindings right now
+            final boolean hasRebindings = msg.getArgs().containsKey(Tokens.ARGS_REBINDINGS);
+            final String rebindingOrAliasParameter = hasRebindings ? Tokens.ARGS_REBINDINGS
: Tokens.ARGS_ALIASES;
+            final Map<String, String> aliases = (Map<String, String>) msg.getArgs().get(rebindingOrAliasParameter);
+            graphManager.commit(new HashSet<>(aliases.values()));
+        } else {
+            graphManager.commitAll();
+        }
+    }
+
     @FunctionalInterface
     public interface BindingSupplier {
         public Bindings get() throws OpProcessorException;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
index 8441464..cbfd34a 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
@@ -34,7 +34,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.script.Bindings;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/standard/StandardOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/standard/StandardOpProcessor.java
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/standard/StandardOpProcessor.java
index 3923548..237a4b0 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/standard/StandardOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/standard/StandardOpProcessor.java
@@ -112,30 +112,43 @@ public class StandardOpProcessor extends AbstractEvalOpProcessor {
 
             // alias any global bindings to a different variable.
             if (msg.getArgs().containsKey(rebindingOrAliasParameter)) {
-                final Map<String, String> rebinds = (Map<String, String>) msg.getArgs().get(rebindingOrAliasParameter);
-                for (Map.Entry<String,String> kv : rebinds.entrySet()) {
+                final Map<String, String> aliases = (Map<String, String>) msg.getArgs().get(rebindingOrAliasParameter);
+                for (Map.Entry<String,String> aliasKv : aliases.entrySet()) {
                     boolean found = false;
+
+                    // first check if the alias refers to a Graph instance
                     final Map<String, Graph> graphs = context.getGraphManager().getGraphs();
-                    if (graphs.containsKey(kv.getValue())) {
-                        bindings.put(kv.getKey(), graphs.get(kv.getValue()));
+                    if (graphs.containsKey(aliasKv.getValue())) {
+                        bindings.put(aliasKv.getKey(), graphs.get(aliasKv.getValue()));
                         found = true;
                     }
 
+                    // if the alias wasn't found as a Graph then perhaps it is a TraversalSource
- it needs to be
+                    // something
                     if (!found) {
                         final Map<String, TraversalSource> traversalSources = context.getGraphManager().getTraversalSources();
-                        if (traversalSources.containsKey(kv.getValue())) {
-                            bindings.put(kv.getKey(), traversalSources.get(kv.getValue()));
+                        if (traversalSources.containsKey(aliasKv.getValue())) {
+                            bindings.put(aliasKv.getKey(), traversalSources.get(aliasKv.getValue()));
                             found = true;
                         }
                     }
 
+                    // this validation is important to calls to GraphManager.commit() and
rollback() as they both
+                    // expect that the aliases supplied are valid
                     if (!found) {
                         final String error = String.format("Could not alias [%s] to [%s]
as [%s] not in the Graph or TraversalSource global bindings",
-                                kv.getKey(), kv.getValue(), kv.getValue());
+                                aliasKv.getKey(), aliasKv.getValue(), aliasKv.getValue());
                         throw new OpProcessorException(error, ResponseMessage.build(msg)
                                 .code(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS).result(error).create());
                     }
                 }
+            } else {
+                // there's no bindings so determine if that's ok with Gremlin Server
+                if (context.getSettings().strictTransactionManagement) {
+                    final String error = "Gremlin Server is configured with strictTransactionManagement
as 'true' - the 'aliases' arguments must be provided";
+                    throw new OpProcessorException(error, ResponseMessage.build(msg)
+                            .code(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS).result(error).create());
+                }
             }
 
             // add any bindings to override any other supplied

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
index 614d161..d05b4f3 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
@@ -106,6 +106,14 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
                 deleteDirectory(new File("/tmp/neo4j"));
                 settings.graphs.put("graph", "conf/neo4j-empty.properties");
                 break;
+            case "shouldRequireAliasedGraphVariablesInStrictTransactionMode":
+                settings.strictTransactionManagement = true;
+                break;
+            case "shouldAliasGraphVariablesInStrictTransactionMode":
+                settings.strictTransactionManagement = true;
+                deleteDirectory(new File("/tmp/neo4j"));
+                settings.graphs.put("graph", "conf/neo4j-empty.properties");
+                break;
         }
 
         return settings;
@@ -794,6 +802,53 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
     }
 
     @Test
+    public void shouldRequireAliasedGraphVariablesInStrictTransactionMode() throws Exception
{
+        final Cluster cluster = Cluster.build().create();
+        final Client client = cluster.connect();
+
+        try {
+            client.submit("1+1").all().get().get(0).getVertex();
+            fail("Should have tossed an exception because strict mode is on and no aliasing
was performed");
+        } catch (Exception ex) {
+            final Throwable root = ExceptionUtils.getRootCause(ex);
+            assertThat(root, instanceOf(ResponseException.class));
+            final ResponseException re = (ResponseException) root;
+            assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode());
+        }
+
+        cluster.close();
+    }
+
+    @Test
+    public void shouldAliasGraphVariablesInStrictTransactionMode() throws Exception {
+        assumeNeo4jIsPresent();
+
+        final Cluster cluster = Cluster.build().create();
+        final Client client = cluster.connect();
+
+        try {
+            client.submit("g.addVertex('name','stephen');").all().get().get(0).getVertex();
+            fail("Should have tossed an exception because \"g\" does not have the addVertex
method under default config");
+        } catch (Exception ex) {
+            final Throwable root = ExceptionUtils.getRootCause(ex);
+            assertThat(root, instanceOf(ResponseException.class));
+            final ResponseException re = (ResponseException) root;
+            assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode());
+        }
+
+        // keep the testing here until "rebind" is completely removed
+        final Client reboundLegacy = cluster.connect().rebind("graph");
+        final Vertex vLegacy = reboundLegacy.submit("g.addVertex('name','stephen')").all().get().get(0).getVertex();
+        assertEquals("stephen", vLegacy.value("name"));
+
+        final Client rebound = cluster.connect().alias("graph");
+        final Vertex v = rebound.submit("g.addVertex('name','jason')").all().get().get(0).getVertex();
+        assertEquals("jason", v.value("name"));
+
+        cluster.close();
+    }
+
+    @Test
     public void shouldAliasGraphVariables() throws Exception {
         final Cluster cluster = Cluster.build().create();
         final Client client = cluster.connect();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
index 19f732a..00e757c 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
@@ -70,6 +70,11 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
                 deleteDirectory(new File("/tmp/neo4j"));
                 settings.graphs.put("graph", "conf/neo4j-empty.properties");
                 break;
+            case "should200OnPOSTTransactionalGraphInStrictMode":
+                settings.strictTransactionManagement = true;
+                deleteDirectory(new File("/tmp/neo4j"));
+                settings.graphs.put("graph", "conf/neo4j-empty.properties");
+                break;
             case "should401OnGETWithNoAuthorizationHeader":
             case "should401OnPOSTWithNoAuthorizationHeader":
             case "should401OnGETWithBadAuthorizationHeader":
@@ -453,7 +458,38 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
                 assertEquals(1, node.get("result").get("data").get(0).intValue());
             }
         }
+    }
 
+    @Test
+    public void should200OnPOSTTransactionalGraphInStrictMode() throws Exception {
+        assumeNeo4jIsPresent();
+
+        // we can remove this first test when rebindings are completely removed
+        final CloseableHttpClient httpclientLegacy = HttpClients.createDefault();
+        final HttpPost httppostLegacy = new HttpPost("http://localhost:8182");
+        httppostLegacy.addHeader("Content-Type", "application/json");
+        httppostLegacy.setEntity(new StringEntity("{\"gremlin\":\"g1.addV()\",\"rebindings\":{\"g1\":\"g\"}}",
Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = httpclientLegacy.execute(httppostLegacy))
{
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals("application/json", response.getEntity().getContentType().getValue());
+            final String json = EntityUtils.toString(response.getEntity());
+            final JsonNode node = mapper.readTree(json);
+            assertEquals(1, node.get("result").get("data").size());
+        }
+
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new HttpPost("http://localhost:8182");
+        httppost.addHeader("Content-Type", "application/json");
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"g1.addV()\",\"aliases\":{\"g1\":\"g\"}}",
Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals("application/json", response.getEntity().getContentType().getValue());
+            final String json = EntityUtils.toString(response.getEntity());
+            final JsonNode node = mapper.readTree(json);
+            assertEquals(1, node.get("result").get("data").size());
+        }
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
index 1a57a15..054f0dd 100644
--- a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
+++ b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
@@ -47,6 +47,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8b3af127/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-performance.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-performance.yaml
b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-performance.yaml
index e907343..841523c 100644
--- a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-performance.yaml
+++ b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-performance.yaml
@@ -46,6 +46,7 @@ metrics: {
   slf4jReporter: {enabled: true, interval: 180000},
   gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
   graphiteReporter: {enabled: false, interval: 180000}}
+strictTransactionManagement: false
 threadPoolBoss: 1
 maxInitialLineLength: 4096
 maxHeaderSize: 8192



Mime
View raw message