TinkerPop Upgrade Information
This document helps users of TinkerPop to understand the changes that come with each software release. It outlines new features, how to resolve breaking changes and other information specific to a release. This document is useful to end-users who are building applications on TinkerPop, but it is equally useful to TinkerPop providers, who build libraries and other systems on the the core APIs and protocols that TinkerPop exposes.
These providers include:
-
Graph System Provider
-
Graph Database Provider
-
Graph Processor Provider
-
-
Graph Driver Provider
-
Graph Language Provider
-
Graph Plugin Provider
TinkerPop 3.1.0
A 187 On The Undercover Gremlinz
TinkerPop 3.1.3
Release Date: July 18, 2016
Please see the changelog for a complete list of all the modifications that are part of this release.
Upgrading for Users
Reserved Gremlin Server Keys
Gremlin Server has always considered certain binding keys (request parameters) as reserved, but that list has now expanded to be more inclusive all the static enums that are imported to the script engine. It is possible that those using Gremlin Server may have to rename their keys if they somehow successfully were using some of the now reserved terms in previous versions.
See: TINKERPOP-1354
Remote Timeout
Disabling the timeout for a :remote to Gremlin Server was previously accomplished by setting the timeout to max as in:
:remote config timeout max where max would set the timeout to be Integer.MAX_VALUE. While this feature is still supported, it has been deprecated in favor of the new configuration option of none, as in:
:remote config timeout none The use of none completely disables the timeout rather than just setting an arbitrarily high one. Note that it is still possible to get a timeout on a request if the server timeout limits are reached. The console timeout value only refers to how long the console will wait for a response from the server before giving up. By default, the timeout is set to none.
See: TINKERPOP-1267
Gremlin Server Workers
Past configuration recommendations for the threadPoolWorker setting on Gremlin Server stated this value could be safely set to 1 at the low end. A size of 1 is still valid for most cases, however, if Gremlin Server is being used with sessions that accept parallel requests, then this value should be no less than 2 or else certain scripts (i.e. those that block for an extended period of time) may cause Gremlin Server to lock up the session.
See: TINKERPOP-1350
Upgrading for Providers
| Important | It is recommended that providers also review all the upgrade instructions specified for users. Many of the changes there may prove important for the provider’s implementation. |
Graph Database Providers
Property Keys and Hyphens
Graph providers should no longer rely on the test suite to validate that hyphens work for labels and property keys.
Vertex and Edge Counts
A large number of asserts for vertex and edge counts in the test suite were not being applied. This problem has been rectified, but could manifest as test errors for different implementations. The chances of the new assertions identifying previously unrecognized bugs seems slim however, as there are many other tests that validate these counts in other ways. If those were passing previously, then these new asserts should likely not pose a problem.
See: TINKERPOP-1300
Test Feature Annotations
A large number of gremlin-test feature annotations were incorrect which caused test cases to run against graphs that did not support those features. The annotations have been fixed, but this opened the possibility that more test cases will run against the graph implementation. Providers should ensure that their graph features() are consistent with the capabilities of the graph implementation.
See: TINKERPOP-1319
Graph Language Providers
AndTest Renaming
The get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name test in AndTest was improperly named and did not match the nature of the traversal it was providing. It has been renamed to: get_g_V_andXhasXage_gt_27X__outE_count_gte_2X_name.
Driver Providers
SASL Mechanism
Note that the Gremlin Driver for Java now passes a new parameter for SASL authentication called saslMechanism. This is an optional argument and does not represent a breaking change, but it does make the overall implementation more complete. While the default authentication implementations packaged with Gremlin Server don’t utilize this argument other implementations might, so the drivers should be able to pass it as per the SASL specification.
See: TINKERPOP-1263
TinkerPop 3.1.2
Release Date: April 8, 2016
Please see the changelog for a complete list of all the modifications that are part of this release.
Upgrading for Users
Aliasing Sessions
Calls to SessionedClient.alias() used to throw UnsupportedOperationException and it was therefore not possible to use that capability with a session. That method is now properly implemented and aliasing is allowed.
See: TINKERPOP-1096
Remote Console
The :remote console command provides a way to avoid having to prefix the :> command to scripts when remoting. This mode of console usage can be convenient when working exclusively with a remote like Gremlin Server and there is only a desire to view the returned data and not to actually work with it locally in any way.
Console Remote Sessions
The :remote tinkerpop.server command now allows for a "session" argument to be passed to connect. This argument, tells the remote to configure it with a Gremlin Server session. In this way, the console can act as a window to script exception on the server and behave more like a standard "local" console when it comes to script execution.
See: TINKERPOP-1097
TinkerPop Archetypes
TinkerPop now offers Maven archetypes, which provide example project templates to quickly get started with TinkerPop. The available archetypes are as follows:
-
gremlin-archetype-server- An example project that demonstrates the basic structure of a Gremlin Server project, how to connect with the Gremlin Driver, and how to embed Gremlin Server in a testing framework. -
gremlin-archetype-tinkergraph- A basic example of how to structure a TinkerPop project with Maven.
Session Transaction Management
When connecting to a session with gremlin-driver, it is now possible to configure the Client instance so as to request that the server manage the transaction for each requests.
Cluster cluster = Cluster.open(); Client client = cluster.connect("sessionName", true); Specifying true to the connect() method signifies that the client should make each request as one encapsulated in a transaction. With this configuration of client there is no need to close a transaction manually.
Session Timeout Setting
The gremlin-driver now has a setting called maxWaitForSessionClose that allows control of how long it will wait for an in-session connection to respond to a close request before it simply times-out and moves on. When that happens, the server will either eventually close the connection via at session expiration or at the time of shutdown.
See: TINKERPOP-1160
Upgrading for Providers
| Important | It is recommended that providers also review all the upgrade instructions specified for users. Many of the changes there may prove important for the provider’s implementation. |
All Providers
Provider Documentation
Documentation related to the lower-level APIs used by a provider, that was formerly in the reference documentation, has been moved to its own documentation set that is now referred to as the Provider Documentation.
See: TINKERPOP-937
Graph System Providers
GraphProvider.clear() Semantics
The semantics of the various clear() methods on GraphProvider didn’t really change, but it would be worth reviewing their implementations to ensure that implementations can be called successfully in an idempotent fashion. Multiple calls to clear() may occur for a single test on the same Graph instance, as 3.1.1-incubating introduced an automated method for clearing graphs at the end of a test and some tests call clear() manually.
See: TINKERPOP-1146
Driver Providers
Session Transaction Management
Up until now transaction management has been a feature of sessionless requests only, but the new manageTransaction request argument for the Session OpProcessor changes that. Session-based requests can now pass this boolean value on each request to signal to Gremlin Server that it should attempt to commit (or rollback) the transaction at the end of the request. By default, this value as false, so there is no change to the protocol for this feature.
scriptEvalTimeout Override
The Gremlin Server protocol now allows the passing of scriptEvaluationTimeout as an argument to the SessionOpProcessor and the StandardOpProcessor. This value will override the setting of the same name provided in the Gremlin Server configuration file on a per request basis.
Plugin Providers
RemoteAcceptor allowRemoteConsole
The RemoteAcceptor now has a new method called allowRemoteConsole(). It has a default implementation that returns false and should thus be a non-breaking change for current implementations. This value should only be set to true if the implementation expects the user to always use :> to interact with it. For example, the tinkerpop.server plugin expects all user interaction through :>, where the line is sent to Gremlin Server. In that case, that RemoteAcceptor implementation can return true. On the other hand, the tinkerpop.gephi plugin, expects that the user sometimes call :> and sometimes work with local evaluation as well. It interacts with the local variable bindings in the console itself. For tinkerpop.gephi, this method returns false.
TinkerPop 3.1.1
Release Date: February 8, 2016
Please see the changelog for a complete list of all the modifications that are part of this release.
Upgrading for Users
Storage I/O
The gremlin-core io-package now has a Storage interface. The methods that were available via hdfs (e.g. rm(), ls(), head(), etc.) are now part of Storage. Both HDFS and Spark implement Storage via FileSystemStorage and SparkContextStorage, respectively. SparkContextStorage adds support for interacting with persisted RDDs in the Spark cache.
This update changed a few of the file handling methods. As it stands, these changes only effect manual Gremlin Console usage as HDFS support was previously provided via Groovy meta-programing. Thus, these are not "code-based" breaking changes.
-
hdfs.rmr()no longer exists.hdfs.rm()is now recursive. Simply change all references tormr()torm()for identical behavior. -
hdfs.head(location,lines,writableClass)no longer exists.-
For graph locations, use
hdfs.head(location,writableClass,lines). -
For memory locations, use
hdfs.head(location,memoryKey,writableClass,lines).
-
-
hdfs.head(...,ObjectWritable)no longer exists. UseSequenceFileInputFormatas an input format is the parsing class.
Given that HDFS (and now Spark) interactions are possible via Storage and no longer via Groovy meta-programming, developers can use these Storage implementations in their Java code. In fact, Storage has greatly simplified complex file/RDD operations in both GiraphGraphComputer and SparkGraphComputer.
Finally, note that the following low-level/internal classes have been removed: HadoopLoader and HDFSTools.
See: TINKERPOP-1033, TINKERPOP-1023
Gremlin Server Transaction Management
Gremlin Server now has a 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.
Deprecated credentialsDbLocation
The credentialsDbLocation setting was a TinkerGraph only configuration option to the SimpleAuthenticator for Gremlin Server. It provided the file system location to a "credentials graph" that TinkerGraph would read from a Gryo file at that spot. This setting was only required because TinkerGraph did not support file persistence at the time that SimpleAuthenticator was created.
As of 3.1.0-incubating, TinkerGraph received a limited persistence feature that allowed the "credentials graph" location to be specified in the TinkerGraph properties file via gremlin.tinkergraph.graphLocation and as such the need for credentialsDbLocation was eliminated.
This deprecation is not a breaking change, however users should be encouraged to convert their configurations to use the gremlin.tinkergraph.graphLocation as soon as possible, as the deprecated setting will be removed in a future release.
TinkerGraph Supports Any I/O
TinkerGraph’s gremlin.tinkergraph.graphLocation configuration setting can now take a fully qualified class name of a Io.Builder implementation, which means that custom IO implementations can be used to read and write TinkerGraph instances.
See: TINKERPOP-886
Authenticator Method Deprecation
For users who have a custom Authenticator implementation for Gremlin Server, there will be a new method present:
public default SaslNegotiator newSaslNegotiator(final InetAddress remoteAddress) Implementation of this method is now preferred over the old method with the same name that has no arguments. The old method has been deprecated. This is a non-breaking change as the new method has a default implementation that simply calls the old deprecated method. In this way, existing Authenticator implementations will still work.
See: TINKERPOP-995
Spark Persistence Updates
Spark RDD persistence is now much safer with a "job server" system that ensures that persisted RDDs are not garbage collected by Spark. With this, the user is provider a spark object that enables them to manage persisted RDDs much like the hdfs object is used for managing files in HDFS.
Finally, InputRDD instance no longer need a reduceByKey() postfix as view merges happen prior to writing the graphRDD. Note that a reduceByKey() postfix will not cause problems if continued, it is simply inefficient and no longer required.
See: TINKERPOP-1023, TINKERPOP-1027
Logging
Logging to Gremlin Server and Gremlin Console can now be consistently controlled by the log4j-server.properties and log4j-console.properties which are in the respective conf/ directories of the packaged distributions.
See: TINKERPOP-859
Gremlin Server Sandboxing
A number of improvements were made to the sandboxing feature of Gremlin Server (more specifically the GremlinGroovyScriptEngine). A new base class for sandboxing was introduce with the AbstractSandboxExtension, which makes it a bit easier to build white list style sandboxes. A usable implementation of this was also supplied with the FileSandboxExtension, which takes a configuration file containing a white list of accessible methods and variables that can be used in scripts. Note that the original SandboxExtension has been deprecated in favor of the AbsstractSandboxExtension or extending directly from Groovy’s TypeCheckingDSL.
Deprecated supportsAddProperty()
It was realized that VertexPropertyFeatures.supportsAddProperty() was effectively a duplicate of VertexFeatures.supportsMetaProperties(). As a result, supportsAddProperty() was deprecated in favor of the other. If using supportsAddProperty(), simply modify that code to instead utilize supportsMetaProperties().
Upgrading for Providers
| Important | It is recommended that providers also review all the upgrade instructions specified for users. Many of the changes there may prove important for the provider’s implementation. |
Graph System Providers
Data Types in Tests
There were a number of fixes related to usage of appropriate types in the test suite. There were cases where tests were mixing types, such that a single property key might have two different values. This mixed typing caused problems for some graphs and wasn’t really something TinkerPop was looking to explicitly enforce as a rule of implementing the interfaces.
While the changes should not have been breaking, providers should be aware that improved consistencies in the tests may present opportunities for test failures.
Graph Database Providers
Custom ClassResolver
For providers who have built custom serializers in Gryo, there is a new feature open that can be considered. A GryoMapper can now take a custom Kryo ClassResolver, which means that custom types can be coerced to other types during serialization (e.g. a custom identifier could be serialized as a HashMap). The advantage to taking this approach is that users will not need to have the provider’s serializers on the client side. They will only need to exist on the server (presuming that the a type is coerced to a type available on the client, of course). The downside is that serialization is then no longer a two way street. For example, a custom ClassResolver that coerced a custom identifier to HashMap would let the client work with the identifier as a HashMap, but the client would then have to send that identifier back to the server as a HashMap where it would be recognized as a HashMap (not an identifier).
See: TINKERPOP-1064
Feature Consistency
There were a number of corrections made around the consistency of Features and how they were applied in tests. Corrections fell into two groups of changes:
-
Bugs in the how
Featureswere applied to certain tests. -
Refactoring around the realization that
VertexFeatures.supportsMetaProperties()is really just a duplicate of features already exposed asVertexPropertyFeatures.supportsAddProperty().VertexPropertyFeatures.supportsAddProperty()has been deprecated.
These changes related to "Feature Consistency" open up a number of previously non-executing tests for graphs that did not support meta-properties, so providers should be wary of potential test failure on previously non-executing tests.
Graph Processor Providers
InputRDD and OutputRDD Updates
There are two new methods on the Spark-Gremlin RDD interfaces.
-
InputRDD.readMemoryRDD(): get aComputerResult.memory()from an RDD. -
OutputRDD.writeMemoryRDD(): write aComputerResult.memory()to an RDD.
Note that both these methods have default implementations which simply work with empty RDDs. Most providers will never need to implement these methods as they are specific to file/RDD management for GraphComputer. The four classes that implement these methods are PersistedOutputRDD, PersistedInputRDD, InputFormatRDD, and OutputFormatRDD. For the interested provider, study the implementations therein to see the purpose of these two new methods.
TinkerPop 3.1.0
Release Date: November 16, 2015
Please see the changelog for a complete list of all the modifications that are part of this release.
Additional upgrade information can be found here:
Upgrading for Users
Shading Jackson
The Jackson library is now shaded to gremlin-shaded, which will allow Jackson to version independently without breaking compatibility with dependent libraries or with those who depend on TinkerPop. The downside is that if a library depends on TinkerPop and uses the Jackson classes, those classes will no longer exist with the standard Jackson package naming. They will have to shifted as follows:
-
org.objenesisbecomesorg.apache.tinkerpop.shaded.objenesis -
com.esotericsoftware.minlogbecomesorg.apache.tinkerpop.shaded.minlog -
com.fasterxml.jacksonbecomesorg.apache.tinkerpop.shaded.jackson
See: TINKERPOP-835
PartitionStrategy and VertexProperty
PartitionStrategy now supports partitioning within VertexProperty. The Graph needs to be able to support meta-properties for this feature to work.
See: TINKERPOP-333
Gremlin Server and Epoll
Gremlin Server provides a configuration option to turn on support for Netty native transport on Linux, which has been shown to help improve performance.
See: TINKERPOP-901
Rebindings Deprecated
The notion of "rebindings" has been deprecated in favor of the term "aliases". Alias is a better and more intuitive term than rebindings which should make it easier for newcomers to understand what they are for.
Configurable Driver Channelizer
The Gremlin Driver now allows the Channerlizer to be supplied as a configuration, which means that custom implementations may be supplied.
See: TINKERPOP-680
GraphSON and Strict Option
The GraphMLReader now has a strict option on the Builder so that if a data type for a value is invalid in some way, GraphMLReader will simply skip that problem value. In that way, it is a bit more forgiving than before especially with empty data.
See: TINKERPOP-756
Transaction.close() Default Behavior
The default behavior of Transaction.close() is to rollback the transaction. This is in contrast to previous versions where the default behavior was commit. Using rollback as the default should be thought of as a like a safer approach to closing where a user must now explicitly call commit() to persist their mutations.
See TINKERPOP-805 for more information.
ThreadLocal Transaction Settings
The Transaction.onReadWrite() and Transaction.onClose() settings now need to be set for each thread (if another behavior than the default is desired). For gremlin-server users that may be changing these settings via scripts. If the settings are changed for a sessionless request they will now only apply to that one request. If the settings are changed for an in-session request they will now only apply to all future requests made in the scope of that session.
See TINKERPOP-885
Hadoop-Gremlin
-
Hadoop1 is no longer supported. Hadoop2 is now the only supported Hadoop version in TinkerPop.
-
Spark and Giraph have been split out of Hadoop-Gremlin into their own respective packages (Spark-Gremlin and Giraph-Gremlin).
-
The directory where application jars are stored in HDFS is now
hadoop-gremlin-3.1.3-libs.-
This versioning is important so that cross-version TinkerPop use does not cause jar conflicts.
-
See link:https://issues.apache.org/jira/browse/TINKERPOP-616
Spark-Gremlin
-
Providers that wish to reuse a graphRDD can leverage the new
PersistedInputRDDandPersistedOutputRDD.-
This allows the graphRDD to avoid serialization into HDFS for reuse. Be sure to enabled persisted
SparkContext(see documentation).
-
See link:https://issues.apache.org/jira/browse/TINKERPOP-868, link:https://issues.apache.org/jira/browse/TINKERPOP-925
TinkerGraph Serialization
TinkerGraph is serializable over Gryo, which means that it can shipped over the wire from Gremlin Server. This feature can be useful when working with remote subgraphs.
See: TINKERPOP-728
Deprecation in TinkerGraph
The public static String configurations have been renamed. The old public static variables have been deprecated. If the deprecated variables were being used, then convert to the replacements as soon as possible.
See: TINKERPOP-926
Deprecation in Gremlin-Groovy
The closure wrappers classes GFunction, GSupplier, GConsumer have been deprecated. In Groovy, a closure can be specified using as Function and thus, these wrappers are not needed. Also, the GremlinExecutor.promoteBindings() method which was previously deprecated has been removed.
See: TINKERPOP-879, TINKERPOP-897
Gephi Traversal Visualization
The process for visualizing a traversal has been simplified. There is no longer a need to "name" steps that will represent visualization points for Gephi. It is possible to just "configure" a visualTraversal in the console:
gremlin> :remote config visualTraversal graph vg which creates a special TraversalSource from graph called vg. The traversals created from vg can be used to :submit to Gephi.
Alterations to GraphTraversal
There were a number of changes to GraphTraversal. Many of the changes came by way of deprecation, but some semantics have changed as well:
-
ConjunctionStrategyhas been renamed toConnectiveStrategy(no other behaviors changed). -
ConjunctionPhas been renamed toConnectiveP(no other behaviors changed). -
DedupBijectionStrategyhas been renamed (and made more effective) asFilterRankingStrategy. -
The
GraphTraversalmutation API has change significantly with all previous methods being supported but deprecated.-
The general pattern used now is
addE('knows').from(select('a')).to(select('b')).property('weight',1.0).
-
-
The
GraphTraversalsack API has changed with all previous methods being supported but deprecated.-
The old
sack(mult,'weight')is nowsack(mult).by('weight').
-
-
GroupStephas been redesigned such that there is now only a key- and value-traversal. No more reduce-traversal.-
The previous
group()-methods have been renamed togroupV3d0(). To immediately upgrade, rename all yourgroup()-calls togroupV3d0(). -
To migrate to the new
group()-methods, what wasgroup().by('age').by(outE()).by(sum(local))is nowgroup().by('age').by(outE().sum()).
-
-
There was a bug in
fold(), where if a bulked traverser was provided, the traverser was only represented once.-
This bug fix might cause a breaking change to a user query if the non-bulk behavior was being counted on. If so, used
dedup()prior tofold().
-
-
Both
GraphTraversal().mapKeys()andGraphTraversal.mapValues()has been deprecated.-
Use
select(keys)andselect(columns). However, note thatselect()will not unroll the keys/values. Thus,mapKeys()⇒select(keys).unfold().
-
-
The data type of
Operatorenums will now always be the highest common data type of the two given numbers, rather than the data type of the first number, as it’s been before.
Aliasing Remotes in the Console
The :remote command in Gremlin Console has a new alias configuration option. This alias option allows specification of a set of key/value alias/binding pairs to apply to the remote. In this way, it becomes possible to refer to a variable on the server as something other than what it is referred to for purpose of the submitted script. For example once a :remote is created, this command:
:remote alias x g would allow "g" on the server to be referred to as "x".
:> x.E().label().groupCount() See: TINKERPOP-914
Upgrading for Providers
| Important | It is recommended that providers also review all the upgrade instructions specified for users. Many of the changes there may prove important for the provider’s implementation. |
All providers should be aware that Jackson is now shaded to gremlin-shaded and could represent breaking change if there was usage of the dependency by way of TinkerPop, a direct dependency to Jackson may be required on the provider’s side.
Graph System Providers
GraphStep Alterations
-
GraphStepis no longer insideEffect-package, but now inmap-package as traversals support mid-traversalV(). -
Traversals now support mid-traversal
V()-steps. Graph system providers should ensure that a mid-traversalV()can leverage any suitable index.
See link:https://issues.apache.org/jira/browse/TINKERPOP-762
Decomposition of AbstractTransaction
The AbstractTransaction class has been abstracted into two different classes supporting two different modes of operation: AbstractThreadLocalTransaction and AbstractThreadedTransaction, where the former should be used when supporting ThreadLocal transactions and the latter for threaded transactions. Of course, providers may still choose to build their own implementation on AbstractTransaction itself or simply implement the Transaction interface.
The AbstractTransaction gains the following methods to potentially implement (though default implementations are supplied in AbstractThreadLocalTransaction and AbstractThreadedTransaction):
-
doReadWritethat should execute the read-write consumer. -
doClosethat should execute the close consumer.
See: TINKERPOP-765, TINKERPOP-885
Transaction.close() Default Behavior
The default behavior for Transaction.close() is to rollback the transaction and is enforced by tests, which previously asserted the opposite (i.e. commit on close). These tests have been renamed to suite the new semantics:
-
shouldCommitOnCloseByDefaultbecameshouldCommitOnCloseWhenConfigured -
shouldRollbackOnCloseWhenConfiguredbecameshouldRollbackOnCloseByDefault
If these tests were referenced in an OptOut, then their names should be updated.
See: TINKERPOP-805
Graph Traversal Updates
There were numerous changes to the GraphTraversal API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
-
GraphStepis no longer insideEffectpackage. Now inmappackage. -
Make sure mid-traversal
GraphStepcalls are foldingHasContainersin for index-lookups. -
Think about copying
TinkerGraphStepStrategyTestfor your implementation so you know folding is happening correctly.
Element Removal
Element.Exceptions.elementAlreadyRemoved has been deprecated and test enforcement for consistency have been removed. Providers are free to deal with deleted elements as they see fit.
See: TINKERPOP-297
VendorOptimizationStrategy Rename
The VendorOptimizationStrategy has been renamed to ProviderOptimizationStrategy. This renaming is consistent with revised terminology for what were formerly referred to as "vendors".
See: TINKERPOP-876
GraphComputer Updates
GraphComputer.configure(String key, Object value) is now a method (with default implementation). This allows the user to specify engine-specific parameters to the underlying OLAP system. These parameters are not intended to be cross engine supported. Moreover, if there are not parameters that can be altered (beyond the standard GraphComputer methods), then the provider’s GraphComputer implementation should simply return and do nothing.
Driver Providers
Aliases Parameter
The "rebindings" argument to the "standard" OpProcessor has been renamed to "aliases". While "rebindings" is still supported it is recommended that the upgrade to "aliases" be made as soon as possible as support will be removed in the future. Gremlin Server will not accept both parameters at the same time - a request must contain either one parameter or the other if either is supplied.
See: TINKERPOP-913
ThreadLocal Transaction Settings
If a driver configures the Transaction.onReadWrite() or Transaction.onClose() settings, note that these settings no longer apply to all future requests. If the settings are changed for a sessionless request they will only apply to that one request. If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session.
See: TINKERPOP-885
TinkerPop 3.0.0
A Gremlin Rāga in 7/16 Time
TinkerPop 3.0.2
Release Date: October 19, 2015
Please see the changelog for a complete list of all the modifications that are part of this release.
Upgrading for Users
BulkLoaderVertexProgram (BLVP)
BulkLoaderVertexProgram now supports arbitrary inputs (i addition to HadoopGraph, which was already supported in version 3.0.1-incubating). It can now also read from any TP3 enabled graph, like TinkerGraph or Neo4jGraph.
TinkerGraph
TinkerGraph can now be configured to support persistence, where TinkerGraph will try to load a graph from a specified location and calls to close() will save the graph data to that location.
Gremlin Driver and Server
There were a number of fixes to gremlin-driver that prevent protocol desynchronization when talking to Gremlin Server.
On the Gremlin Server side, Websocket sub-protocol introduces a new "close" operation to explicitly close sessions. Prior to this change, sessions were closed in a more passive fashion (i.e. session timeout). There were also so bug fixes around the protocol as it pertained to third-party drivers (e.g. python) using JSON for authentication.
Upgrading for Providers
Graph Driver Providers
Gremlin Server close Operation
It is important to note that this feature of the sub-protocol applies to the SessionOpProcessor (i.e. for session-based requests). Prior to this change, there was no way to explicitly close a session. Sessions would get closed by the server after timeout of activity. This new "op" gives drivers the ability to close the session explicitly and as needed.
TinkerPop 3.0.1
Release Date: September 2, 2015
Please see the changelog for a complete list of all the modifications that are part of this release.
Upgrading for Users
Gremlin Server
Gremlin Server now supports a SASL-based (Simple Authentication and Security Layer) authentication model and a default SimpleAuthenticator which implements the PLAIN SASL mechanism (i.e. plain text) to authenticate requests. This gives Gremlin Server some basic security capabilities, especially when combined with its built-in SSL feature.
There have also been changes in how global variable bindings in Gremlin Server are established via initialization scripts. The initialization scripts now allow for a Map of values that can be returned from those scripts. That Map will be used to set global bindings for the server. See this sample script for an example.
See: TINKERPOP-576
Neo4j
Problems related to using :install to get the Neo4j plugin operating in Gremlin Console on Windows have been resolved.
See: TINKERPOP-804
Upgrading for Providers
Graph System Providers
GraphFactoryClass Annotation
Providers can consider the use of the new GraphFactoryClass annotation to specify the factory class that GraphFactory will use to open a new Graph instance. This is an optional feature and will generally help implementations that have an interface extending Graph. If that is the case, then this annotation can be used in the following fashion:
@GraphFactory(MyGraphFactory.class) public interface MyGraph extends Graph{ } MyGraphFactory must contain the static open method that is normally expected by GraphFactory.
See: TINKERPOP-778
GraphProvider.Descriptor Annotation
There was a change that affected providers who implemented GraphComputer related tests such as the ProcessComputerSuite. If the provider runs those tests, then edit the GraphProvider implementation for those suites to include the GraphProvider.Descriptor annotation as follows:
@GraphProvider.Descriptor(computer = GiraphGraphComputer.class) public final class HadoopGiraphGraphProvider extends HadoopGraphProvider { public GraphTraversalSource traversal(final Graph graph) { return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(GiraphGraphComputer.class)).create(graph); } } See: TINKERPOP-690 for more information.
Semantics of Transaction.close()
There were some adjustments to the test suite with respect to how Transaction.close() was being validated. For most providers, this will generally mean checking OptOut annotations for test renaming problems. The error that occurs when running the test suite should make it apparent that a test name is incorrect in an OptOut if there are issues there.
See: TINKERPOP-764 for more information.
Graph Driver Providers
Authentication
Gremlin Server now supports SASL-based authentication. By default, Gremlin Server is not configured with authentication turned on and authentication is not required, so existing drivers should still work without any additional change. Drivers should however consider implementing this feature as it is likely that many users will want the security capabilities that it provides.