This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch tinkergraph-storage
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 819bd8c17cf642fe275b6b8392d6be6af480788d
Author: Stephen Mallette <[email protected]>
AuthorDate: Thu Aug 20 18:26:32 2026 +0000

    Document TinkerStorageGraph persistence and fix stale class doc
    
    Rewrite the TinkerStorageGraph class Javadoc, which still described disk
    storage as planned future work. Add a commented, persistence-enabled server
    sample (tinkerstoragegraph-persistent.properties) and a Gremlin Server
    subsection in the persistence reference. Rename the misnamed console
    tinkergraph-gryo.properties to tinkergraph-storage.properties and comment 
the
    credentials sample.
    
    Assisted-by: Claude Code:claude-opus-4-8
---
 .../reference/implementations-tinkergraph.asciidoc | 18 ++++++++++
 ...o.properties => tinkergraph-storage.properties} |  4 +++
 .../conf/tinkergraph-credentials.properties        |  3 ++
 .../conf/tinkerstoragegraph-persistent.properties  | 40 ++++++++++++++++++++++
 .../tinkergraph/structure/TinkerStorageGraph.java  | 14 ++++++--
 5 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/docs/src/reference/implementations-tinkergraph.asciidoc 
b/docs/src/reference/implementations-tinkergraph.asciidoc
index 7f7db73fbe..6b3a8d086c 100644
--- a/docs/src/reference/implementations-tinkergraph.asciidoc
+++ b/docs/src/reference/implementations-tinkergraph.asciidoc
@@ -471,6 +471,24 @@ the storage format version it was written with. Opening a 
store written in a for
 with a clear error rather than misreading the data. There is no in-place 
format migration. To move a graph across an
 incompatible storage format, export it with the `io()` step before upgrading 
and read it back afterward.
 
+Gremlin Server persists a graph the same way. A graph in the server's `graphs` 
configuration is pointed at a
+properties file that sets the storage keys, and the server opens that graph at 
startup, commits to it as clients
+request, and closes it on shutdown. A graph configured without a storage 
engine remains transactional but in-memory,
+so its data is lost when the server stops.
+
+[source,properties]
+----
+gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerStorageGraph
+gremlin.tinkergraph.storage=graphbinary
+gremlin.tinkergraph.graphLocation=/data/mygraph
+----
+
+[source,yaml]
+----
+graphs: {
+  graph: conf/tinkerstoragegraph-persistent.properties }
+----
+
 Persistence is distinct from interchange. `TinkerMemoryGraph` is purely 
in-memory and does not persist. To move data in
 or out of any TinkerGraph in an interchange format such as GraphML, GraphSON, 
or Gryo, use the `io()` step directly:
 
diff --git a/gremlin-console/conf/tinkergraph-gryo.properties 
b/gremlin-console/conf/tinkergraph-storage.properties
similarity index 69%
rename from gremlin-console/conf/tinkergraph-gryo.properties
rename to gremlin-console/conf/tinkergraph-storage.properties
index 312dc3f9b6..2a04bb7d37 100644
--- a/gremlin-console/conf/tinkergraph-gryo.properties
+++ b/gremlin-console/conf/tinkergraph-storage.properties
@@ -15,7 +15,11 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# Sample configuration for a durable, transactional TinkerStorageGraph. 
Opening a graph with this configuration
+# (for example via GraphFactory) produces a TinkerStorageGraph that persists 
committed transactions to graphLocation.
 
gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerStorageGraph
 
+# built-in storage engine; without this key the graph is transactional but 
in-memory only
 gremlin.tinkergraph.storage=graphbinary
+# directory holding the durable data (created if absent; a location may be 
opened by only one graph at a time)
 gremlin.tinkergraph.graphLocation=/tmp/tinkergraph
diff --git a/gremlin-server/conf/tinkergraph-credentials.properties 
b/gremlin-server/conf/tinkergraph-credentials.properties
index 4597fabcd3..fb4225b376 100644
--- a/gremlin-server/conf/tinkergraph-credentials.properties
+++ b/gremlin-server/conf/tinkergraph-credentials.properties
@@ -16,5 +16,8 @@
 # under the License.
 gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph
 gremlin.tinkergraph.vertexIdManager=LONG
+# This credential store is an in-memory TinkerGraph. TinkerGraph no longer 
auto-loads from disk on open, so
+# SimpleAuthenticator reads the store explicitly from graphLocation using 
graphFormat at startup. (A durable
+# TinkerStorageGraph, by contrast, manages its own persistence and needs no 
graphFormat.)
 gremlin.tinkergraph.graphLocation=data/credentials.kryo
 gremlin.tinkergraph.graphFormat=gryo
\ No newline at end of file
diff --git a/gremlin-server/conf/tinkerstoragegraph-persistent.properties 
b/gremlin-server/conf/tinkerstoragegraph-persistent.properties
new file mode 100644
index 0000000000..dac2460298
--- /dev/null
+++ b/gremlin-server/conf/tinkerstoragegraph-persistent.properties
@@ -0,0 +1,40 @@
+# 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.
+
+# Sample configuration for a durable, transactional TinkerStorageGraph on 
Gremlin Server. Reference it from the
+# server's "graphs" block, for example in gremlin-server-transaction.yaml:
+#   graphs: { graph: conf/tinkerstoragegraph-persistent.properties }
+gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerStorageGraph
+
+# Enables durable persistence. "graphbinary" is the built-in storage engine; 
the fully qualified class name of a
+# custom TinkerStorage implementation may be used instead. Without this key 
the graph is transactional but in-memory.
+gremlin.tinkergraph.storage=graphbinary
+# Directory holding the durable data. Required when a storage engine is set. 
It is created if absent and may be
+# opened by only one graph at a time (single writer, whether in this JVM or 
another process).
+gremlin.tinkergraph.graphLocation=/tmp/tinkerstoragegraph
+
+gremlin.tinkergraph.vertexIdManager=LONG
+gremlin.tinkergraph.edgeIdManager=LONG
+gremlin.tinkergraph.vertexPropertyIdManager=LONG
+
+# Optional storage tuning (defaults shown, uncomment to change):
+# "commit" forces each transaction to disk (survives OS crash/power loss); 
"os" is faster but survives only a JVM crash
+#gremlin.tinkergraph.storage.sync=commit
+# auto-compact the append log once it grows past this many bytes (default 
67108864 = 64MB; 0 disables)
+#gremlin.tinkergraph.storage.compactThreshold=67108864
+# persist auto-generated vertex-property ids across a reopen (default false)
+#gremlin.tinkergraph.storage.preserveVertexPropertyIds=false
diff --git 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerStorageGraph.java
 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerStorageGraph.java
index 803cc27dcf..ae9fcb2b48 100644
--- 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerStorageGraph.java
+++ 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerStorageGraph.java
@@ -49,9 +49,17 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * The transactional implementation of the {@link TinkerGraph} interface, 
in-memory with optional persistence on
- * calls to {@link #close()}. It is planned that this implementation will 
optionally support simple storage to disk
- * built on its transaction functionality.
+ * The transactional implementation of the {@link TinkerGraph} interface. It 
provides {@code read committed}
+ * transaction isolation with optimistic locking and, when a storage engine is 
configured, durable persistence to
+ * disk. With no storage engine configured it is an in-memory transactional 
graph that retains nothing across
+ * restarts.
+ * <p/>
+ * Persistence is pluggable through the {@link 
org.apache.tinkerpop.gremlin.tinkergraph.structure.storage.TinkerStorage}
+ * SPI and enabled with the {@code gremlin.tinkergraph.storage} and {@code 
gremlin.tinkergraph.graphLocation}
+ * configuration keys. Each committed transaction is written through to the 
storage engine before the in-memory commit
+ * is applied, and reopening the same location replays the persisted commits 
to rebuild the graph. A storage location
+ * is single-writer: it is guarded by an exclusive {@link 
org.apache.tinkerpop.gremlin.tinkergraph.structure.storage.DirectoryLock}
+ * so a second open of the same directory fails rather than corrupting the 
data.
  *
  * @author Valentyn Kahamlyk
  */

Reply via email to