////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
////
== TinkerPop 3.1.0 (A 187 On The Undercover Gremlinz)

image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/gremlin-gangster.png[width=185]

[[release-3-1-8]]
=== TinkerPop 3.1.8 (Release Date: August 21, 2017)

* Fixed a `MessageScope` bug in `TinkerGraphComputer`.
* Fixed a bug in `BigDecimal` divisions in `NumberHelper` that potentially threw an `ArithmeticException`.
* Non-deserializable exceptions no longer added to ScriptRecordReader IOExceptions.

==== Bugs

* TINKERPOP-1519 TinkerGraphComputer doesn't handle multiple MessageScopes in single iteration
* TINKERPOP-1736 Sack step evaluated by Groovy interprets numbers in an unexpected way
* TINKERPOP-1754 Spark can not deserialise some ScriptRecordReader parse exceptions

[[release-3-1-7]]
=== TinkerPop 3.1.7 (Release Date: June 12, 2017)

* Configured Modern and The Crew graphs to work with a integer `IdManager` when `TinkerFactory.createXXX()` is called.
* Added XSLT transform option to convert TinkerPop 2.x GraphML to 3.x GraphML.
* Added validation to `StarVertexProperty`.
* Bumped to Jackson 2.8.7.
* Fixed `EventStrategy` so that newly added properties trigger events with the name of the key that was added.
* Drop use of jitpack for the jbcrypt artifact - using the official one in Maven Central.
* Bumped to Groovy 2.4.11.

==== Improvements

* TINKERPOP-1504 MutationListener doesn't provide property key on property additions
* TINKERPOP-1608 TP2-to-TP3 GraphML XSLT
* TINKERPOP-1633 Use org.mindrot:jbcrypt v0.4
* TINKERPOP-1645 Bump to Groovy 2.4.9
* TINKERPOP-1654 Upgrade to jackson-databind 2.8.6+ in gremlin-shaded
* TINKERPOP-1659 Docker build should use maven settings.xml
* TINKERPOP-1664 StarVertexProperty#property should throw an NPE if the value is null

[[release-3-1-6]]
=== TinkerPop 3.1.6 (Release Date: February 3, 2017)

* Fixed bug in `IncidentToAdjacentStrategy`, it was missing some invalidating steps.
* Returned a confirmation on session close from Gremlin Server.
* Use non-default port for running tests on Gremlin Server.
* Fully shutdown metrics services in Gremlin Server on shutdown.
* Deprecated `tryRandomCommit()` in `AbstractGremlinTest` - the annotation was never added in 3.1.1, and was only deprecated via javadoc.
* Minor fixes to various test feature requirements in `gremlin-test`.
* Allow developers to pass options to `docker run` with TINKERPOP_DOCKER_OPTS environment variable

==== Bugs

* TINKERPOP-1493 Groovy project doesn't build on Windows
* TINKERPOP-1545 IncidentToAdjacentStrategy is buggy

==== Improvements

* TINKERPOP-1538 Gremlin Server spawned by test suites should use a different port
* TINKERPOP-1544 Return a confirmation of session close
* TINKERPOP-1556 Allow Hadoop to run on IPv6 systems
* TINKERPOP-1557 Improve docker build time with this one weird trick!
* TINKERPOP-1598 Bump to Grovy 2.4.8

[[release-3-1-5]]
=== TinkerPop 3.1.5 (Release Date: October 17, 2016)

* Improved handling of `Cluster.close()` and `Client.close()` to prevent the methods from hanging.
* Fixed a bug in `NotStep` where child requirements were not being analyzed.
* Fixed output redirection and potential memory leak in `GremlinGroovyScriptEngine`.
* Corrected naming of `g_withPath_V_asXaX_out_out_mapXa_name_it_nameX` and `g_withPath_V_asXaX_out_mapXa_nameX` in `MapTest`.
* Improved session cleanup when a close is triggered by the client.
* Removed the `appveyor.yml` file as the AppVeyor build is no longer enabled by Apache Infrastructure.
* Fixed TinkerGraph which was not saving on `close()` if the path only consisted of the file name.
* Fixed a bug in `RangeByIsCountStrategy` which didn't use the `NotStep` properly.

==== Bugs

* TINKERPOP-1158 gremlin.sh -v emits log4j initialization errors
* TINKERPOP-1391 issue with where filter
* TINKERPOP-1442 Killing session should make better attempt to cleanup
* TINKERPOP-1451 TinkerGraph persistence cannot handle a single file name as the graph location
* TINKERPOP-1467 Improve close() operations on the Java driver
* TINKERPOP-1478 Propogate ScriptEngine fixes from groovy to GremlinGroovyScriptEngine
* TINKERPOP-1512 gremlin-server-classic.yaml is broken

==== Improvements

* TINKERPOP-927 bin/publish-docs.sh should only upload diffs.
* TINKERPOP-1264 Improve BLVP docs
* TINKERPOP-1477 Make DependencyGrabberTest an integration test

[[release-3-1-4]]
=== TinkerPop 3.1.4 (Release Date: September 6, 2016)

* Improved the error provided by a client-side session if no hosts were available.
* Fixed a bug in `PropertiesTest` which assumed long id values.
* Fixed a bug in `StarGraph` around self-edges.
* Fixed a potential leak of a `ReferenceCounted` resource in Gremlin Server.
* Renamed distributions to make the prefix "apache-tinkerpop-" as opposed to just "apache-".
* Fixed a problem (previously thought resolved on 3.1.3) causing Gremlin Server to lock up when parallel requests were submitted on the same session if those parallel requests included a script that blocked indefinitely.
* Fixed bug in `TailGlobalStep` where excess bulk was not accounted for correctly.

==== Bugs

* TINKERPOP-1350 Server locks when submitting parallel requests on session
* TINKERPOP-1375 Possible ByteBuf leak for certain transactional scenarios
* TINKERPOP-1377 Closing a remote in "console mode" has bad message
* TINKERPOP-1379 unaccounted excess in TailGlobalStep
* TINKERPOP-1397 StarVertex self edge has buggy interaction with graph filters
* TINKERPOP-1419 Wrong exception when a SessionedClient is initialized with no available host

==== Improvements

* TINKERPOP-989 Default documentation should be reference/index.html
* TINKERPOP-1376 Rename TinkerPop artifacts
* TINKERPOP-1413 PropertiesTest#g_V_hasXageX_propertiesXnameX assumes that ids are longs
* TINKERPOP-1416 Write Gremlin Server log files somewhere during doc generation
* TINKERPOP-1418 CoreTraversalTests depend on missing functionality

[[release-3-1-3]]
=== TinkerPop 3.1.3 (Release Date: July 18, 2016)

* Fixed bug in `SubgraphStep` where features were not being checked properly prior to reading meta-properties.
* Ensured calls to `Result.hasNext()` were idempotent.
* Avoid hamcrest conflict by using mockito-core instead of mockito-all dependency in `gremlin-test`.
* Fixed bug in `GremlinExecutor` causing Gremlin Server to lock up when parallel requests were submitted on the same session if those parallel requests included a script that blocked indefinitely.
* Changed `GremlinExecutor` timeout scheduling so that the timer would not start until a time closer to the actual start of script evaluation.
* Fixed bug in `SubgraphStrategy` where step labels were not being propogated properly to new steps injected by the strategy.
* Fix incorrect test `FeatureRequirement` annotations.
* Defaulted to `Edge.DEFAULT` if no edge label was supplied in GraphML.
* Fixed bug in `IoGraphTest` causing IllegalArgumentException: URI is not hierarchical error for external graph implementations.
* Fixed bug in `GremlinGroovyScriptEngineFileSandboxTest` resource loading
* Improved `TinkerGraph` performance when iterating vertices and edges.
* Fixed a bug where timeout functions provided to the `GremlinExecutor` were not executing in the same thread as the script evaluation.
* Fixed a bug in the driver where many parallel requests over a session would sometimes force a connection to close and replace itself.
* Graph providers should no longer rely on the test suite to validate that hyphens work for property keys.
* Optimized a few special cases in `RangeByIsCountStrategy`.
* Added more "invalid" variable bindings to the list used by Gremlin Server to validate incoming bindings on requests.
* Fixed a bug where the `ConnectionPool` in the driver would not grow with certain configuration options.
* Fixed a bug where pauses in Gremlin Server writing to an overtaxed client would generate unexpected `FastNoSuchElementException` errors.
* Named the thread pool used by Gremlin Server sessions: "gremlin-server-session-$n".
* Fixed a bug in `BulkSet.equals()` which made itself apparent when using `store()` and `aggregate()` with labeled `cap()`.
* Fixed a bug where `Result.one()` could potentially block indefinitely under certain circumstances.
* Ensured that all asserts of vertex and edge counts were being applied properly in the test suite.
* Fixed bug in `gremlin-driver` where certain channel-level errors would not allow the driver to reconnect.
* `SubgraphStep` now consults the parent graph features to determine cardinality of a property.
* Use of `Ctrl-C` in Gremlin Console now triggers closing of open remotes.
* Bumped SLF4J to 1.7.21 as previous versions suffered from a memory leak.
* Fixed a bug in `Neo4jGraphStepStrategy` where it wasn't defined properly as a `ProviderOptimizationStrategy`.
* Renamed `AndTest.get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name` to `get_g_V_andXhasXage_gt_27X__outE_count_gte_2X_name` to match the traversal being tested.
* Fixed a self-loop bug in `StarGraph`.
* Added configuration option for disabling `:remote` timeout with `:remote config timeout none`.
* Added `init-tp-spark.sh` to Gremlin Console binary distribution.
* Fixed bug where use of `:x` in a Gremlin Console initialization script would generate a stack trace.
* Added configuration options to Gremlin Driver and Server to override the SSL configuration with an `SslContext`.
* Added driver configuration settings for SSL: `keyCertChainFile`, `keyFile` and `keyPassword`.
* Fixed bug where transaction managed sessions were not properly rolling back transactions for exceptions encountered during script evaluation.
* Fixed bug in `:uninstall` command if the default `/ext` directory was not used.
* Added support to Gremlin Driver to allow either plain text or GSSAPI SASL authentication allowing the client to pass the SASL mechanism in the request.
* Improved dryRun functionality for the docs processor. It's now possible to dry run (or full run) only specific files.
* Added precompile of `ScriptInputFormat` scripts to `ScriptRecordReader` to improve performance.

==== Bugs

* TINKERPOP-906 Install plugin always fails after first unresolved dependency
* TINKERPOP-1088 Preserve Cardinality in Subgraph
* TINKERPOP-1092 Gremlin Console init script with :x throws exception
* TINKERPOP-1139 [Neo4JGraph] GraphTraversal with SubgraphStrategy removes addLabelStep (as("b"))
* TINKERPOP-1196 Calls to Result.one() might block indefinitely
* TINKERPOP-1215 Labeled a SideEffectCapStep cause problems.
* TINKERPOP-1242 ScriptEngineTest randomly hangs indefinately.
* TINKERPOP-1257 Bad SackTest variable use.
* TINKERPOP-1265 Managed Session Eval Exceptions Rollback
* TINKERPOP-1272 Gremlin Console distribution needs bin/init-tp-spark.sh
* TINKERPOP-1284 StarGraph does not handle self-loops correctly.
* TINKERPOP-1300 Many asserts around vertex/edge counts on graphs not applied
* TINKERPOP-1317 IoGraphTest throws error: URI is not hierarchical
* TINKERPOP-1318 java.lang.NoSuchMethodError: org/hamcrest/Matcher.describeMismatch
* TINKERPOP-1319 several FeatureRequirement annotations are incorrect in gremlin-test
* TINKERPOP-1320 GremlinGroovyScriptEngineFileSandboxTest throws error: URI is not hierarchical
* TINKERPOP-1324 Better error for invalid args to addV()
* TINKERPOP-1350 Server locks when submitting parallel requests on session
* TINKERPOP-1351 Number of connections going beyond the pool max size
* TINKERPOP-1352 Connection Pool doesn't always grow
* TINKERPOP-1359 Exception thrown when calling subgraph() on Neo4jGraph
* TINKERPOP-1360 intermittent error in spark-gremlin integration test

==== Improvements

* TINKERPOP-939 Neo4jGraph should support HighAvailability (Neo4jHA).
* TINKERPOP-1003 Setting up latest/current links for bins and docs.
* TINKERPOP-1020 Provide --dryRun selectivity for "half publishing" docs.
* TINKERPOP-1063 TinkerGraph performance enhancements
* TINKERPOP-1229 More Descriptive Messaging for :remote console
* TINKERPOP-1260 Log for validate-distribution.sh
* TINKERPOP-1263 Pass SASL mechanism name through with initial SASL response
* TINKERPOP-1267 Configure Console for no timeout on remote requests
* TINKERPOP-1269 More SSL settings for driver
* TINKERPOP-1295 Precompile ScriptInputFormat scripts once during initialization of ScriptRecordReader
* TINKERPOP-1301 Provide Javadoc for ScriptInput/OutputFormat's
* TINKERPOP-1302 Ctrl-C should kill open remotes in Console
* TINKERPOP-1312 .count().is(0) is not properly optimized
* TINKERPOP-1314 Improve error detection in docs preprocessor
* TINKERPOP-1354 Include all static enum imports in request validation for bindings *(breaking)*

[[release-3-1-2-incubating]]
=== TinkerPop 3.1.2 (Release Date: April 8, 2016)

* Fixed two `NullPointerException`-potential situations in `ObjectWritable`.
* Provided Docker script that allows the execution of several build tasks within a Docker container.
* Added a per-request `scriptEvaluationTimeout` option to the Gremlin Server protocol.
* Changed `DriverRemoteAcceptor` to send scripts as multi-line.
* Fixed a bug in `gremlin-driver` where connections were not returning to the pool after many consecutive errors.
* Fixed a bug where `tree()` did not serialize into GraphSON.
* Bumped to SLF4j 1.7.19.
* Bumped to Apache Hadoop 2.7.2.
* Fixed a bug in `gremlin-driver` where a really fast call to get a `Future` to wait for a result might not register an error raised from the server.
* Fixed a severe bug where `LP_O_OB_P_S_SE_SL_Traverser` was not registered with `GryoMapper`.
* The future from `GremlinExecutor.eval()` is completed after the entire evaluation lifecyle is completed.
* Spark `Memory` uses `collect().iterator()` instead of `toLocalIterator()` to reduce noise in Spark UI.
* Added the `:remote console` option which flips the Gremlin Console into a remote-only mode where all script evaluation is routed to the currently configured remote, which removes the need to use the `:>` command.
* Added `allowRemoteConsole()` to the `RemoteAcceptor` interface.
* The `:remote` for `tinkerpop.server` now includes an option to establish the connection as a "session".
* Provided an implementation for calls to `SessionedClient.alias()`, which formerly threw an `UnsupportedOperationException`.
* Bumped to commons-collections 3.2.2.
* Fixed a bug where `OrderGlobalStep` and `OrderLocalStep` were not incorporating their children's traverser requirements.
* Fixed a compilation bug in `TraversalExplanation`.
* Fixed bug where a session explicitly closed was being closed again by session expiration.
* Improved the recovery options for `gremlin-driver` after failed requests to Gremlin Server.
* Added `maxWaitForSessionClose` to the settings for `gremlin-driver`.
* Bumped to Netty 4.0.34.Final.
* Added "interpreter mode" for the `ScriptEngine` and Gremlin Server which allows variables defined with `def` or a type to be recognized as "global".
* Bumped to Apache Groovy 2.4.6.
* Added the `gremlin-archetype-server` archetype that demonstrates
* Added the `gremlin-archetype-tinkergraph` archetype that demonstrates a basic project that uses TinkerGraph.
* Added `gremlin-archetype` module to house TinkerPop "examples".
* Fixed a condition where `ConnectionPool` initialization in the driver would present a `NullPointerException` on initialization if there were errors constructing the pool in full.
* Fixed a bug in the round-robin load balancing strategy in the driver would waste requests potentially sending messages to dead hosts.
* Added new Provider Documentation book - content for this book was extracted from the reference documentation.
* Fixed a bug where multiple "close" requests were being sent by the driver on `Client.close()`.
* Fixed an `Property` attach bug that shows up in serialization-based `GraphComputer` implementations.
* Fixed a pom.xml bug where Gremlin Console/Server were not pulling the latest Neo4j 2.3.2.
* Fixed bug in "round robin" load balancing in `gremlin-driver` where requests were wrongly being sent to the same host.
* Prevented the spawning of unneeded reconnect tasks in `gremlin-driver` when a host goes offline.
* Fixed bug preventing `gremlin-driver` from reconnecting to Gremlin Server when it was restarted.
* Better handled errors that occurred on commits and serialization in Gremlin Server to first break the result iteration loop and to ensure commit errors were reported to the client.
* Added GraphSON serializers for the `java.time.*` classes.
* Improved the logging of the Gremlin Server REST endpoint as it pertained to script execution failures.
* `TraversalExplanation` is now `Serializable` and compatible with GraphSON and Gryo serialization.
* Fixed a problem with global bindings in Gremlin Server which weren't properly designed to handle concurrent modification.
* Deprecated `ScriptElementFactory` and made the local `StarGraph` globally available for ``ScriptInputFormat``'s `parse()` method.
* Improved reusability of unique test directory creation in `/target` for `AbstractGraphProvider`, which was formerly only available to Neo4j, by adding `makeTestDirectory()`.
* Optimized memory-usage in `TraversalVertexProgram`.
* `Graph` instances are not merely "closed" at the end of tests, they are "cleared" via `GraphProvider.clear()`, which should in turn cleans up old data for an implementation.
* Expanded the Gremlin Server protocol to allow for transaction management on in-session requests and updated the `gremlin-driver` to take advantage of that.
* Greatly reduced the amount of objects required in OLAP for the `ReducingBarrierStep` steps.
* Improved messages for the different distinct "timeouts" that a user can encounter with Gremlin Server.

==== Bugs

* TINKERPOP-1041 StructureStandardTestSuite has file I/O issues on Windows
* TINKERPOP-1105 SparkGraphComputer / Null Pointer Exceptions for properties traversals
* TINKERPOP-1106 Errors on commit in Gremlin Server don't register as exception on driver
* TINKERPOP-1125 RoundRobin load balancing always uses the second Host when size = 2
* TINKERPOP-1126 A single Host spawns many reconnect tasks
* TINKERPOP-1127 client fails to reconnect to restarted server
* TINKERPOP-1146 IoTest are not clearing the db after the test run
* TINKERPOP-1148 ConcurrentModificationException with bindings in Gremlin Server
* TINKERPOP-1150 Update pom file dependencies to work with Neo4j 2.3.2
* TINKERPOP-1159 Client sends multiple session close messages per host
* TINKERPOP-1168 Switch plugins in docs preprocessor
* TINKERPOP-1172 Reconnect to Gremlin Server previously marked as dead
* TINKERPOP-1175 Anonymous traversals can't be explained
* TINKERPOP-1184 Sessions not being closed properly
* TINKERPOP-1216 OrderStep or O_Traverser is broken
* TINKERPOP-1239 Excessive continual failure for requests can cause TimeoutException in driver
* TINKERPOP-1245 Gremlin shell starts incorrectly on OS X due to awk difference
* TINKERPOP-1251 NPE in ObjectWritable.toString
* TINKERPOP-1252 Failed Neo4j transaction can leave Neo4jTransaction in inconsistent state

==== Improvements

* TINKERPOP-732 gremlin-server GraphSON serializer issue with tree()
* TINKERPOP-916 Develop a better "simple" driver for testing and example purposes
* TINKERPOP-937 Extract the implementations sections of the primary documentation to its own book
* TINKERPOP-956 Connection errors tend to force a complete close of the channel
* TINKERPOP-1039 Enable auto-commit for session'd requests.
* TINKERPOP-1068 Bump to support jbcrypt-0.4m.jar
* TINKERPOP-1080 Bump Netty version - 4.0.34.Final
* TINKERPOP-1085 Establish TinkerPop "example" projects
* TINKERPOP-1096 Support aliasing for sessions in Gremlin Server
* TINKERPOP-1097 Gremlin Console supporting sessions
* TINKERPOP-1107 Provide a way to support global variables with sandboxing enabled
* TINKERPOP-1109 Make Gremlin Console better suited for system level installs
* TINKERPOP-1131 TraversalVertexProgram traverser management is inefficient memory-wise.
* TINKERPOP-1135 Improve GraphSON representation of java.time.* classes
* TINKERPOP-1137 Deprecate ScriptElementFactory and make star graph globally available
* TINKERPOP-1138 Improve messaging on server timeouts
* TINKERPOP-1147 Add serialization for TraversalExplanation
* TINKERPOP-1160 Add timeout configuration for time to wait for connection close
* TINKERPOP-1165 Tooling Support: Compile with -parameters
* TINKERPOP-1176 Bump Groovy version - 2.4.6
* TINKERPOP-1177 Improve documentation around Spark's storage levels
* TINKERPOP-1197 Document Gremlin Server available metrics
* TINKERPOP-1198 Bump commons-collections to 3.2.2
* TINKERPOP-1213 missing docs for has(label, key, value)
* TINKERPOP-1218 Usage of toLocalIterator Produces large amount of Spark Jobs

[[release-3-1-1-incubating]]
=== TinkerPop 3.1.1 (Release Date: February 8, 2016)

* Made `GryoRecordReader` more robust to 0 byte record splits.
* Fixed a constructor/serialization bug in `LP_O_OB_S_SE_SL_Traverser`.
* Added a lazy iterator, memory safe implementation of MapReduce to `SparkGraphComputer`.
* Added `MapReduce.combine()` support to `SparkGraphComputer`.
* Bumped to Neo4j 2.3.2.
* Fixed Java comparator contract issue around `Order.shuffle`.
* Optimized a very inefficient implementation of `SampleLocalStep`.
* Reduced the complexity and execution time of all `AbstractLambdaTraversal` instances.
* `DefaultTraversal` has a well defined `hashCode()` and `equals()`.
* Added serializers to Gryo for `java.time` related classes.
* Integrated `NumberHelper` in `SackFunctions`.
* Deprecated `VertexPropertyFeatures.supportsAddProperty()` which effectively was a duplicate of `VertexFeatures.supportsMetaProperties`.
* The Spark persistence `StorageLevel` can now be set for both job graphs and `PersistedOutputRDD` data.
* Added to the list of "invalid binding keys" allowed by Gremlin Server to cover the private fields of `T` which get exposed in the `ScriptEngine` on static imports.
* Added `BulkDumperVertexProgram` that allows to dump a whole graph in any of the supported IO formats (GraphSON, Gryo, Script).
* Fixed a bug around duration calculations of `cap()`-step during profiling.
* It is possible to completely avoid using HDFS with Spark if `PersistedInputRDD` and `PersistedOutpuRDD` are leveraged.
* `InputRDD` and `OutputRDD` can now process both graphs and memory (i.e. sideEffects).
* Removed Groovy specific meta-programming overloads for handling Hadoop `FileSystem` (instead, its all accessible via `FileSystemStorage`).
* Added `FileSystemStorage` and `SparkContextStorage` which both implement the new `Storage` API.
* Added `Storage` to the gremlin-core io-package which providers can implement to allow conventional access to data sources (e.g. `ls()`, `rm()`, `cp()`, etc.).
* Bumped to Spark 1.5.2.
* Bumped to Groovy 2.4.5.
* Added `--noClean` option in `bin/process-docs.sh` to prevent the script from cleaning Grapes and HDFS.
* Execute the `LifeCycle.beforeEval()` in the same thread that `eval()` is executed in for `GremlinExecutor`.
* Improved error handling of Gremlin Console initialization scripts to better separate errors in initialization script I/O versus execution of the script itself.
* Fixed a bug in `Graph.OptOut` when trying to opt-out of certain test cases with the `method` property set to "*".
* Added another `BulkLoader` implementation (`OneTimeBulkLoader`) that doesn't store temporary properties in the target graph.
* Added option to allow for a custom `ClassResolver` to be assigned to a `GryoMapper` instance.
* 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.
* Standardized "test data directories" across all tests as generated by `TestHelper`.
* Fixed a bug in Gremlin Server where error messages were not always being passed back in the `statusMessage` field of the `ResponseMessage`.
* Added validation for parameter `bindings` to ensure that keys were `String` values.
* Improved Transaction Management consistency in Gremlin Server.
* Added `FileSandboxExtension` which takes a configuration file to white list methods and classes that can be used in `ScriptEngine` execution.
* Deprecated `SandboxExtension` and `SimpleSandboxExtension` in favor of `AbstractSandboxExtension` which provides better abstractions for those writing sandboxes.
* Fixed a long standing "view merge" issue requiring `reduceByKey()` on input data to Spark. It is no longer required.
* Added `Spark` static object to allow "file system" control of persisted RDDs in Spark.
* Added a Spark "job server" to ensure that persisted RDDs are not garbage collected by Spark.
* Improved logging control during builds with Maven.
* Fixed settings that weren't being passed to the Gremlin Driver `Cluster` through configuration file.
* `Column` now implements `Function`. The modulator `by(valueDecr)` can be replaced by `by(values,decr)` and thus, projection and order are separated.
* Added `InputRDDFormat` which wraps an `InputRDD` to make it accessible to Hadoop and not just Spark.
* Added `AbstractSparkTest` which handles closing `SparkContext` instances between tests now that we support persisted contexts.
* Fixed a serialization bug in `GryoSerializer` that made it difficult for graph providers to yield `InputRDDs` for `SparkGraphComputer`.
* `SparkGraphComputer` is now tested against Gryo, GraphSON, and `InputRDD` data sources.
* `HadoopElementIterator` (for Hadoop-Gremlin OLTP) now works for any `InputFormat`, not just `FileInputFormats`.
* Added `Traverser.Admin.getTags()` which are used to mark branches in a traversal (useful in `match()` and related future steps).
* Fixed the `Future` model for `GiraphGraphComputer` and `SparkGraphComputer` so that class loaders are preserved.
* Added support for arbitrary vertex ID types in `BulkLoaderVertexProgram`.
* Deprecated `credentialsDbLocation` from `SimpleAuthenticator` in Gremlin Server.
* `TinkerGraph` has "native" serialization in GraphSON, which enables it to be a return value from Gremlin Server.
* Improved the ability to embed Gremlin Server by providing a way to get the `ServerGremlinExecutor` and improve reusability of `AbstractEvalOpProcessor` and related classes.
* Added `Authenticator.newSaslNegotiator(InetAddress)` and deprecated the zero-arg version of that method.
* `ProfileStep` is now available off of `Traversal` via `profile()`. To be consistent with `Traversal.explain()`.
* If no comparator is provided to `order()`, `Order.incr` is assumed (previously, an exception occurred).
* Fixed various Gremlin-Groovy tests that assumed `toString()`-able ids.
* Split TinkerPop documentation into different directories.
* Added `explain()`-step which yields a `TraversalExplanation` with a pretty `toString()` detailing the compilation process.
* Fixed a traversal strategy ordering bug in `AdjacentToIncidentStrategy` and `IncidentToAdjacentStrategy`.
* Made a number of changes to improve traversal startup and execution performance.
* Added support for 'gremlin.tinkergraph.graphLocation' to accept a fully qualified class name that implements `Io.Builder` interface.

==== Bugs

* TINKERPOP-763 IsStep broken when profiling is enabled.
* TINKERPOP-972 Cluster::close does not shut down its executor
* TINKERPOP-973 BLVP shouldn't clear configuration properties
* TINKERPOP-976 Fail earlier if invalid version is supplied in validate-distribution.sh
* TINKERPOP-977 Dead link to traversal javadocs
* TINKERPOP-979 ComputerVerificationStrategy not picking up Order local traversal
* TINKERPOP-985 shouldPersistDataOnClose makes incorrect feature check
* TINKERPOP-990 Mixed types in VertexPropertyTest
* TINKERPOP-993 cyclicPath is not(simplePath)
* TINKERPOP-997 FeatureRequirementSet.SIMPLE should not require multi-property *(breaking)*
* TINKERPOP-1000 GremlinGroovyScriptEngineOverGraphTest failures
* TINKERPOP-1001 SugarLoaderPerformanceTest contains hardcoded vertex ids
* TINKERPOP-1002 Should rollback transaction after catching on close
* TINKERPOP-1006 Random error during builds: shouldReloadClassLoaderWhileDoingEvalInSeparateThread()
* TINKERPOP-1011 HadoopGraph can't re-attach when the InputFormat is not a FileInputFormat
* TINKERPOP-1012 BulkLoaderVertexProgram shouldn't assume vertex IDs of type Long
* TINKERPOP-1025 Solve SparkContext Persistence Issues with BulkLoaderVertexProgram
* TINKERPOP-1027 Merge view prior to writing graphRDD to output format/rdd
* TINKERPOP-1036 Support self-looping edges in IO
* TINKERPOP-1052 @Graph.OptOut causes Exception during Suite setup
* TINKERPOP-1060 LambdaRestrictionStrategy too restrictive
* TINKERPOP-1075 Profile duration of cap step seems broken.
* TINKERPOP-1083 Traversal needs a hashCode() and equals() definition.
* TINKERPOP-1089 Order.shuffle implementation is too fragile
* TINKERPOP-1119 LP_O_OB_S_SE_SL_Traverser doesn't have a protected constructor().

==== Improvements

* TINKERPOP-320 BulkDumperVertexProgram
* TINKERPOP-379 MessageScope.Local.setStaticMessage(M msg)
* TINKERPOP-824 Do we need runtime BigDecimal in more places?
* TINKERPOP-859 Provide a more general way to set log levels in plugins
* TINKERPOP-860 Bindings applied to the PluginAcceptor should appear to Gremlin Server
* TINKERPOP-886 Allow any GraphReader/Writer to be persistence engine for TinkerGraph
* TINKERPOP-891 Re-examine Sandboxing Abstractions
* TINKERPOP-912 Improve the ability to embed Gremlin Server with Channelizer injection
* TINKERPOP-928 Use directories to separate different books
* TINKERPOP-930 Tie Alias to Transaction Manager in Gremlin Server
* TINKERPOP-938 Add a "clear SNAPSHOT jars" section to the process-docs.sh.
* TINKERPOP-941 Improve error message for wrong order().by() arguments
* TINKERPOP-943 Warn if Gremlin Server is running prior to generating docs
* TINKERPOP-945 Exceptions should allow me to include root cause if/when available
* TINKERPOP-952 Include Cardinality.list example in VertexProperty section of main docs.
* TINKERPOP-954 Consistent test directory usage
* TINKERPOP-957 Improve speed of addV()
* TINKERPOP-964 Test XXXGraphComputer on a Hadoop2 cluster (non-pseudocluster).
* TINKERPOP-970 ProfileStep should be off Traversal, not GraphTraversal
* TINKERPOP-978 Native TinkerGraph Serializers for GraphSON
* TINKERPOP-981 Deprecate support for credentialsDbLocation in Gremlin Server Config
* TINKERPOP-982 valuesDecr, valuesIncr, keysDecr, and valuesDecr is lame.
* TINKERPOP-983 Provide a way to track open Graph instances in tests
* TINKERPOP-984 Use GraphProvider for id conversion in Groovy Environment test suite
* TINKERPOP-987 Use tinkerpop.apache.org URL in all documentation and homepage
* TINKERPOP-988 SparkGraphComputer.submit shouldn't use ForkJoinPool.commonPool
* TINKERPOP-992 Better support for schema driven Graphs in IO related tests
* TINKERPOP-994 Driver using deprecated Rebindings Still
* TINKERPOP-995 Add Authenticator.newSaslNegotiator(InetAddress)
* TINKERPOP-996 Please delete old releases from mirroring system
* TINKERPOP-998 Deprecate VertexPropertyFeatures.FEATURE_ADD_PROPERTY
* TINKERPOP-1009 Add a CAUTION to documentation about HadoopGraph and getting back elements
* TINKERPOP-1013 Traverser tags as a safer way of using path labels
* TINKERPOP-1018 Allow setting for maxContentLength to be set from yaml in driver
* TINKERPOP-1019 Convert println in test to SLF4j
* TINKERPOP-1022 Automatically warm up ops handlers
* TINKERPOP-1023 Add a spark variable in SparkGremlinPlugin like we do hdfs for HadoopGremlinPlugin
* TINKERPOP-1026 BVLP should store vertex IDs as String
* TINKERPOP-1033 Store sideEffects as a persisted RDD
* TINKERPOP-1035 Better Consistency in Gremlin Server Transaction Management
* TINKERPOP-1045 Client-Side Hangs when attempting to access a HashMap with Keys of type Integer
* TINKERPOP-1047 TinkerGraph GraphSON storage format broken
* TINKERPOP-1051 Add note in best practice docs about gremlin server heap setting
* TINKERPOP-1055 Gremlin Console FileNotFoundException can be misleading
* TINKERPOP-1062 Make LifeCycle beforeEval execute in same thread as eval operation
* TINKERPOP-1064 Allow a ClassResolver to be added to GryoMapper construction
* TINKERPOP-1065 Fix some typos and clarify some wording in the TinkerPop documentation
* TINKERPOP-1066 Add ioRegistries configuration to GraphSON MessageSerializer
* TINKERPOP-1067 Update Groovy to 2.4.5
* TINKERPOP-1072 Allow the user to set persistence options using StorageLevel.valueOf()
* TINKERPOP-1073 HadoopGraph toString() is weird for Spark PersitedRDD data.
* TINKERPOP-1086 Include gryo serializers for java.time related classes
* TINKERPOP-1087 Add has()/order() to FilterRankStrategy
* TINKERPOP-1093 Add Spark init.sh script and update dev documentation.
* TINKERPOP-1100 Look deeply into adding combine()-support in Spark MapReduce.
* TINKERPOP-1117 InputFormatRDD.readGraphRDD requires a valid gremlin.hadoop.inputLocation, breaking InputFormats (Cassandra, HBase) that don't need one

[[release-3-1-0-incubating]]
=== TinkerPop 3.1.0 (Release Date: November 16, 2015)

This release also includes changes from <<./changelog-3.0.x.asciidoc#release-3-0-1-incubating, 3.0.1-incubating>> and <<./changelog-3.0.x.asciidoc#release-3-0-2-incubating, 3.0.2-incubating>>.

* Fixed bug in Gryo and GraphSON (with embedded types) serialization for serialization of results returned from `Map.entrySet()`.
* `Transaction` settings for `onReadWrite` and `onClose` are now `ThreadLocal` in nature of standard transactions.
* Optimized `BulkLoaderVertexProgram`. It now uses `EventStrategy` to monitor what the underlying `BulkLoader` implementation does (e.g. whether it creates a new vertex or returns an existing).
* Integrated `NumberHelper` in `SumStep`, `MinStep`, `MaxStep` and `MeanStep` (local and global step variants).
* Gremlin Console remoting to Gremlin Server now supports a configuration option for assigning aliases.
* `CountMatchAlgorithm`, in OLAP, now biases traversal selection towards those traversals that start at the current traverser location to reduce message passing.
* Fixed a file stream bug in Hadoop OLTP that showed up if the streamed file was more than 2G of data.
* Added the ability to set thread local properties in `SparkGraphComputer` when using a persistent context.
* Bumped to Neo4j 2.3.0.
* Deprecated "rebindings" as an argument to Gremlin Server and replaced it with "aliases".
* Added `PersistedInputRDD` and `PersistedOutputRDD` which enables `SparkGraphComputer` to store the graph RDD in the context between jobs (no HDFS serialization required).
* Renamed the `public static String` configuration variable names of TinkerGraph (deprecated old variables).
* Added `GraphComputer.configure(key,value)` to allow engine-specific configurations.
* `GraphStep` is no longer in the `sideEffect`-package and is now in `map`-package (breaking change).
* Added support for mid-traversal `V()`-steps (`GraphStep` semantics updated).
* Fixed `Number` handling in `Operator` enums. Prior this change a lot of operations on mixed `Number` types returned a wrong result (wrong data type).
* Fixed a bug in Gremlin Server/Driver serializer where empty buffers were getting returned in certain cases.
* Renamed `ConjunctionX` to `ConnectiveX` because "conjunction" is assumed "and" (disjunction "or"), where "connective" is the parent concept.
* Removed `PathIdentityStep` as it was a hack that is now solved by `Traversal.Admin.addTraverserRequirement()`.
* Added `Traversal.Admin.addTraverserRequirement()` to allow a traversal strategy or source to add requirements (not only step determined anymore).
* Added `TraverserRequirement.ONE_BULK` to state the traverser does not handle bulk.
* Added `GraphTraversalSource.withBulk(boolean)` to enabled users to compute only using `bulk=1`.
* Gremlin Server supports Netty native transport on linux.
* Removed the need for `GFunction` (etc.) closure wrappers in Gremlin-Groovy as `as Function` can be used to convert closures accordingly.
* Added `SelectColumnStep` (`select(keys)` and `select(values)`). Deprecated `mapKeys()` and `mapValues()`.
* Renamed `gremlin.hadoop.graphInputRDD` and `gremlin.hadoop.graphOutputRDD` to `gremlin.spark.graphInputRDD` and `gremlin.spark.graphOutputRDD`, respectively.
* Fixed a bug in `FoldStep` around bulking. This could be a breaking change, but it is the correct semantics.
* Previous `group()`-behavior steps are accessible via the deprecated `groupV3d0()`-steps.
* `GroupStep` and `GroupSideEffectStep` now do lazy reductions to reduce memory footprint. Breaking change for `group()` semantics.
* Added `GroupStepHelper` with various static methods and classes that are used by both `GroupStep` and `GroupSideEffectStep`.
* Added `BarrierStep` interface with `processAllStarts()` method which process all starts up to yielding the barrier result.
* Fixed a severe threading issue in `TinkerGraphComputer`.
* The location of the jars in HDFS is now `hadoop-gremlin-x.y.z-libs` to ensure multiple TinkerPop versions don't clash.
* `GiraphGraphComputer` will only upload the jars to HDFS if it doesn't already exist (to help speed up startup time).
* `GiraphGraphComputer.workers()` is smart about using threads and machines to load balance TinkerPop workers across cluster.
* `GraphComputer.workers(int)` allows the user to programmatically set the number of workers to spawn.
* Added `GryoSerializer` as the new recommended Spark `Serializer`. Handles `Graph` and `GryoMapper` registries.
* `GryoPool` now makes use of `GryoPool.Builder` for its construction.
* Bumped to Apache Hadoop 2.7.1.
* Bumped to Apache Giraph 1.1.0.
* Bumped to Apache Spark 1.5.1.
* Split Hadoop-Gremlin apart such there is now `hadoop-gremlin`, `spark-gremlin`, and `giraph-gremlin` (and respective `GremlinPlugins`).
* Added `LambdaCollectingBarrierStep` which generalizes `NoOpBarrierStep` and allows for `barrier(normSack)`-type operations.
* Fixed bugs in the Gremlin Server's NIO protocol both on the server and driver side.
* Added `Path.popEquals(Pop,Object)` to check for path equality based on `Pop` (useful for `TraverserRequirement.LABELED_PATH`).
* Added `Operator.assign` to allow setting a direct value.
* `Operator` is now a `BinaryOperator<Object>` with appropriate typecasting for respective number operators.
* Simplified `SackValueStep` so it now supports both `sack(function)` and `sack(function).by()`. Deprecated `sack(function,string)` .
* Added `Parameters` object to allow for the parameters of a step to be retrieved at runtime via a traversal.
* Redesigned (though backwards compatible) `AddEdgeStep`, `AddVertexStep`, and `AddPropertyStep` (and respective `GraphTraversal` API).
* Added `GraphTraversalSource.inject()` so users can spawn a traverser with non-graph objects.
* `GraphStep` can now take a single argument `Collection` which is either elements or element ids (i.e. `g.V([1,2,3])` is supported now).
* Added `LoopsStep` to make the loop counter accessible within `repeat()`, `until()` and `emit()`.
* Gephi Plugin no longer requires manual insert of `store` steps to visualize a traversal.
* Added a `TinkerIoRegistry` that registers a custom serializer for Gryo that will serialize an entire `TinkerGraph` instance.
* Added configuration options to Gephi Plugin for setting the size of nodes visualized.
* Replaced `DedupBijectionStrategy` with the more effective `FilterRankingStrategy`.
* `ComputerAwareSteps` must not only handle step ids, but also step labels.
* Renamed `B_O_P_SE_SL_Traverser` to `B_LP_O_P_SE_SL_Traverser` as it now supports `TraverserRequirement.LABELED_PATH`.
* Added `B_LP_O_S_SE_SL_Traverser` in support of `TraverserRequirement.LABELED_PATH`.
* Added `TraverserRequirement.LABELED_PATH` which only generates path data for steps that are labeled (greatly increases the likelihood of bulking).
* Fixed a bug in `Path` usage that required an API update: `Path.addLabel()` is now `Path.extend(Set<String>)` and `Traverser.addLabels(Set<String>)`.
* Made `Path` iterable, so that it can be ``unfold()``'ed and used by local steps like `min(local)`, `max(local)`, etc.
* `WhereTraversalStep` and `WherePredicateStep` are now the only "special" `Scoping` steps after `MatchStartStep` in `match()`.

==== Bugs

* TINKERPOP-774 order / dedup issues
* TINKERPOP-799 [Proposal] with()-modulator for stream level variable binding.
* TINKERPOP-801 groupCount() fails for vertices (elements?) (using Spark)
* TINKERPOP-811 AddPropertyStepTest fails "all of a sudden"
* TINKERPOP-823 addV() broken for multi-value properties
* TINKERPOP-843 Misspecified HADOOP_GREMLIN_LIBS generates NullPointerException
* TINKERPOP-857 Add GraphComputer.config(key,value)
* TINKERPOP-895 Use "as BinaryOperator" and remove GBinaryOperator
* TINKERPOP-903 Fix empty buffer return upon buffer capacity exceeded
* TINKERPOP-910 In session transaction opened from sessionless request
* TINKERPOP-918 ComputerVerificationStrategy is too restrictive
* TINKERPOP-926 Renamed TinkerGraph public statics to common pattern used for other statics.
* TINKERPOP-948 AbstractGremlinProcessTest.checkMap not asserted in GroupTest
* TINKERPOP-953 Artifact equality is not evaluating properly
* TINKERPOP-955 HashMap$Node not serializable

==== Improvements

* TINKERPOP-297 Ensure Consistent Behavior Over Deleted Elements *(breaking)*
* TINKERPOP-333 Support VertexProperty in PartitionStrategy
* TINKERPOP-391 More fluency in GraphComputer for parameterization.
* TINKERPOP-616 Use Spark 1.3.0 in Hadoop-Gremlin.
* TINKERPOP-624 Passing Detached/Referenced to Graph.vertices/edge()
* TINKERPOP-680 Configurable Channelizer for Gremlin Driver
* TINKERPOP-728 Improve Remote Graph Object Treatment in Console
* TINKERPOP-756 Provide a strict parsing option for GraphMLReader
* TINKERPOP-760 Make loop counter accessible within repeat()
* TINKERPOP-762 Allow mid-traversal V() (and E())
* TINKERPOP-765 Decompose AbstractTransaction for different transactional contexts *(breaking)*
* TINKERPOP-767 Path should play well with "local" steps.
* TINKERPOP-768 MatchStep in OLAP should be smart about current vertex.
* TINKERPOP-769 Make the introduction of the TP3 docs story better.
* TINKERPOP-772 TraverserRequirement.LABELED_PATH
* TINKERPOP-796 Support merge binary operator for Gremlin sacks *(breaking)*
* TINKERPOP-798 [Proposal] Rename mapKeys()/mapValues() to select(keys) and select(values).
* TINKERPOP-802 Provide sack(object) so that the sack can be directly set.
* TINKERPOP-803 A better solution to g.V(someCollection.toArray())
* TINKERPOP-805 Enforce AutoCloseable Semantics on Transaction *(breaking)*
* TINKERPOP-821 Improve testing around TraversalHelper around recursive methods
* TINKERPOP-825 [Proposal] SetBulkStep (sideEffectStep)
* TINKERPOP-826 OneToManyBarrierStrategy
* TINKERPOP-827 Add a console session to the PageRank section of the docs.
* TINKERPOP-829 TinkerGraphComputer should support the user specified thread/worker count.
* TINKERPOP-835 Shade Jackson Dependencies *(breaking)*
* TINKERPOP-836 Support Hadoop2 in place of Hadoop1
* TINKERPOP-850 Reduce Graph.addVertex overload ambiguity *(breaking)*
* TINKERPOP-851 GroupCountStep needs a by() for the count.
* TINKERPOP-861 Solve "The Number Problem" for Operator (and follow on operators)
* TINKERPOP-863 [Proposal] Turn off bulking -- or is there something more general? (hope not).
* TINKERPOP-866 GroupStep and Traversal-Based Reductions *(breaking)*
* TINKERPOP-868 Allow Spark Gremlin Computer to Reuse Spark Contexts
* TINKERPOP-874 Rename Gremlin-Spark properties using gremlin.spark prefix. *(breaking)*
* TINKERPOP-876 Rename VendorOptimizationStrategy XXXOptimizationStrategy *(breaking)*
* TINKERPOP-879 Remove deprecated promoteBindings from GremlinExecutor *(breaking)*
* TINKERPOP-885 Change Transaction.onReadWrite() to be a ThreadLocal setting *(breaking)*
* TINKERPOP-888 GraphTraversal.property overloads *(breaking)*
* TINKERPOP-896 Simplify the {{withSack}} methods of {{GraphTraversalSource}}. *(breaking)*
* TINKERPOP-897 Remove deprecated GSupplier, GFunction, GConsumer, etc. methods. *(breaking)*
* TINKERPOP-898 Rename ConjuctionP and ConjuctionStep to ConnectiveP and ConnectiveStep *(breaking)*
* TINKERPOP-899 Bump to the latest version of Neo4j.
* TINKERPOP-900 Provide by(object) which compiles to by(constant(object))
* TINKERPOP-901 Option for use of Netty epoll on Linux to reduce GC pressure
* TINKERPOP-904 BulkLoaderVertexProgram optimizations
* TINKERPOP-905 Harden time oriented tests in ResultQueueTest
* TINKERPOP-907 getters for RepeatStep.untilTraversal and RepeatStep.emitTraversal
* TINKERPOP-908 Use line breaks in documentation
* TINKERPOP-909 Improve steps that handle numeric data
* TINKERPOP-911 Allow setting Thread Specific Spark JobGroup/Custom Properties based on hadoop conf
* TINKERPOP-913 Rename Gremlin Server arguments rebinding to alias
* TINKERPOP-914 DriverRemoteAcceptor in Gremlin Console supports aliases
* TINKERPOP-917 Add HadoopGraph.open(String)
* TINKERPOP-922 Add a book for Developer Documentation
* TINKERPOP-923 Add a book for Tutorials
* TINKERPOP-925 Use persisted SparkContext to persist an RDD across Spark jobs.
* TINKERPOP-931 Make it possible to extend the core OpProcessor implementations
* TINKERPOP-933 Improve release process to get files named properly
* TINKERPOP-935 Add missing "close" operation to the session opProcessor docs