This is an automated email from the ASF dual-hosted git repository. colegreer pushed a commit to branch fixGraphBinaryVersion in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 1d8371e864c055ba11ef72c6f7120df0cf8ec4a1 Author: Cole Greer <[email protected]> AuthorDate: Fri Mar 27 14:29:58 2026 -0700 Update Graph Binary version implementation from 1 to 4 --- .../structure/io/binary/GraphBinaryWriter.java | 2 +- gremlin-go/driver/connection_test.go | 4 ++-- gremlin-go/driver/graphBinaryDeserializer_test.go | 2 +- gremlin-go/driver/interceptor_test.go | 12 +++++----- gremlin-go/driver/serializer.go | 3 +-- .../io/binary/internals/GraphBinaryReader.js | 2 +- .../io/binary/internals/GraphBinaryWriter.js | 4 ++-- .../unit/graphbinary/GraphBinaryReader-test.js | 28 +++++++++++----------- .../unit/graphbinary/GraphBinaryWriter-test.js | 16 ++++++------- .../python/gremlin_python/driver/serializer.py | 2 +- .../gremlin/driver/SerializationBenchmark.java | 4 ++-- 11 files changed, 39 insertions(+), 40 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/GraphBinaryWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/GraphBinaryWriter.java index dc2ed926c0..5719015388 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/GraphBinaryWriter.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/GraphBinaryWriter.java @@ -47,7 +47,7 @@ public class GraphBinaryWriter { private final static byte VALUE_FLAG_NONE = 0; private final static byte VALUE_FLAG_ORDERED = 2; private final static byte VALUE_FLAG_BULK = 2; - public final static byte VERSION_BYTE = (byte)0x81; + public final static byte VERSION_BYTE = (byte)0x84; public final static byte BULKED_BYTE = (byte)0x01; private final static byte[] unspecifiedNullBytes = new byte[] { DataType.UNSPECIFIED_NULL.getCodeByte(), 0x01}; private final static byte[] customTypeCodeBytes = new byte[] { DataType.CUSTOM.getCodeByte() }; diff --git a/gremlin-go/driver/connection_test.go b/gremlin-go/driver/connection_test.go index 7d95192211..4a730b96f2 100644 --- a/gremlin-go/driver/connection_test.go +++ b/gremlin-go/driver/connection_test.go @@ -1315,6 +1315,6 @@ func TestConnectionWithMockServer_BasicAuth(t *testing.T) { // Body should still be valid serialized bytes assert.NotEmpty(t, capturedBody, "serialized body should be non-empty with BasicAuth") - assert.Equal(t, byte(0x81), capturedBody[0], - "body should start with GraphBinary version byte 0x81") + assert.Equal(t, byte(0x84), capturedBody[0], + "body should start with GraphBinary version byte 0x84") } diff --git a/gremlin-go/driver/graphBinaryDeserializer_test.go b/gremlin-go/driver/graphBinaryDeserializer_test.go index f6490b425d..2e9517ed15 100644 --- a/gremlin-go/driver/graphBinaryDeserializer_test.go +++ b/gremlin-go/driver/graphBinaryDeserializer_test.go @@ -286,7 +286,7 @@ func TestGraphBinaryDeserializerWithEndOfStreamMarker(t *testing.T) { // - EndOfStream marker // - Status: code(4) + message(nullable) + exception(nullable) data := []byte{ - 0x81, 0x00, // Header: version byte + no bulking + 0x84, 0x00, // Header: version byte + no bulking 0x01, 0x00, 0x00, 0x00, 0x00, 0x2A, // int32 = 42 0xfd, 0x00, 0x00, // Marker type + flag + value=0 (EndOfStream) 0x00, 0x00, 0x00, 0xC8, // Status code = 200 diff --git a/gremlin-go/driver/interceptor_test.go b/gremlin-go/driver/interceptor_test.go index 44c0c61988..40a947ac9d 100644 --- a/gremlin-go/driver/interceptor_test.go +++ b/gremlin-go/driver/interceptor_test.go @@ -111,8 +111,8 @@ func TestSigV4AuthWithSerializeInterceptor(t *testing.T) { // Body should be valid serialized bytes assert.NotEmpty(t, capturedBody, "body should be non-empty serialized bytes") - assert.Equal(t, byte(0x81), capturedBody[0], - "body should start with GraphBinary version byte 0x81") + assert.Equal(t, byte(0x84), capturedBody[0], + "body should start with GraphBinary version byte 0x84") } // TestSigV4Auth_AutoSerializesInChain verifies that SigV4Auth works as the only @@ -149,8 +149,8 @@ func TestSigV4Auth_AutoSerializesInChain(t *testing.T) { "SigV4Auth should set Authorization header") assert.Contains(t, capturedHeaders.Get("Authorization"), "AWS4-HMAC-SHA256") assert.NotEmpty(t, capturedBody, "body should be non-empty serialized bytes") - assert.Equal(t, byte(0x81), capturedBody[0], - "body should start with GraphBinary version byte 0x81") + assert.Equal(t, byte(0x84), capturedBody[0], + "body should start with GraphBinary version byte 0x84") } // TestMultipleInterceptors_SerializeThenAuth verifies that a custom interceptor can @@ -198,8 +198,8 @@ func TestMultipleInterceptors_SerializeThenAuth(t *testing.T) { // Body should be valid serialized bytes (from SerializeRequest) assert.NotEmpty(t, capturedBody, "body should be non-empty serialized bytes") - assert.Equal(t, byte(0x81), capturedBody[0], - "body should start with GraphBinary version byte 0x81") + assert.Equal(t, byte(0x84), capturedBody[0], + "body should start with GraphBinary version byte 0x84") } // TestInterceptor_IoReaderBody verifies that an interceptor can set Body to an io.Reader diff --git a/gremlin-go/driver/serializer.go b/gremlin-go/driver/serializer.go index 49030251cc..a6c4c9d79a 100644 --- a/gremlin-go/driver/serializer.go +++ b/gremlin-go/driver/serializer.go @@ -64,8 +64,7 @@ func newGraphBinarySerializer(handler *logHandler) *GraphBinarySerializer { } } -// TODO change for graph binary 4.0 version is finalized -const versionByte byte = 0x81 +const versionByte byte = 0x84 // SerializeMessage serializes a request message into GraphBinary format. // diff --git a/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryReader.js b/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryReader.js index d75bf13635..e1aa316970 100644 --- a/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryReader.js +++ b/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryReader.js @@ -51,7 +51,7 @@ export default class GraphBinaryReader { // {version} is a Byte representing the protocol version const version = cursor[0]; - if (version !== 0x81) { + if (version !== 0x84) { throw new Error(`Unsupported version '${version}'.`); } cursor = cursor.slice(1); // skip version diff --git a/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryWriter.js b/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryWriter.js index f0ca979a72..5a9cae0db8 100644 --- a/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryWriter.js +++ b/gremlin-js/gremlin-javascript/lib/structure/io/binary/internals/GraphBinaryWriter.js @@ -73,7 +73,7 @@ export default class GraphBinaryWriter { const gremlin = requestMessage.getGremlin(); const bufs = [ - Buffer.from([0x81]), + Buffer.from([0x84]), this.ioc.mapSerializer.serialize(fields, false), this.ioc.stringSerializer.serialize(gremlin, false), ]; @@ -82,7 +82,7 @@ export default class GraphBinaryWriter { // Legacy path: plain object with { gremlin, fields } const bufs = [ - Buffer.from([0x81]), + Buffer.from([0x84]), this.ioc.mapSerializer.serialize(requestMessage.fields || new Map(), false), this.ioc.stringSerializer.serialize(requestMessage.gremlin, false), ]; diff --git a/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryReader-test.js b/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryReader-test.js index d4484c81c7..b7493aec5c 100644 --- a/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryReader-test.js +++ b/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryReader-test.js @@ -20,7 +20,7 @@ /* * GraphBinaryReader v4 response format tests. * Tests the reader's ability to parse v4 response format: - * {version:0x81}{bulked:Byte}{result_data stream}{marker:0xFD 0x00 0x00}{status_code:Int bare}{status_message:nullable}{exception:nullable} + * {version:0x84}{bulked:Byte}{result_data stream}{marker:0xFD 0x00 0x00}{status_code:Int bare}{status_message:nullable}{exception:nullable} */ import { assert } from 'chai'; @@ -69,7 +69,7 @@ describe('GraphBinaryReader', () => { describe('non-bulked responses', () => { it('single value', () => { const buffer = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, // bulked=false 0x01, 0x00, 0x00, 0x00, 0x00, 0x43, // fq Int: type_code=0x01, value_flag=0x00, value=67 0xFD, 0x00, 0x00, // marker @@ -86,7 +86,7 @@ describe('GraphBinaryReader', () => { it('multiple values', () => { const buffer = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, // bulked=false 0x01, 0x00, 0x00, 0x00, 0x00, 0x43, // fq Int: 67 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x68, 0x65, 0x6C, 0x6C, 0x6F, // fq String: "hello" @@ -104,7 +104,7 @@ describe('GraphBinaryReader', () => { it('empty result', () => { const buffer = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, // bulked=false 0xFD, 0x00, 0x00, // marker (no data) 0x00, 0x00, 0x00, 0xCC, // status_code=204 @@ -122,7 +122,7 @@ describe('GraphBinaryReader', () => { describe('bulked responses', () => { it('single item with bulk count', () => { const buffer = Buffer.from([ - 0x81, // version + 0x84, // version 0x01, // bulked=true 0x01, 0x00, 0x00, 0x00, 0x00, 0x43, // fq Int: 67 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // fq Long bulk=3 @@ -140,7 +140,7 @@ describe('GraphBinaryReader', () => { it('multiple items with bulk counts', () => { const buffer = Buffer.from([ - 0x81, // version + 0x84, // version 0x01, // bulked=true 0x01, 0x00, 0x00, 0x00, 0x00, 0x43, // fq Int: 67 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // fq Long bulk=2 @@ -162,7 +162,7 @@ describe('GraphBinaryReader', () => { describe('status codes', () => { it('status 403', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker 0x00, 0x00, 0x01, 0x93, // status_code=403 0x01, 0x01 // null message, null exception @@ -173,7 +173,7 @@ describe('GraphBinaryReader', () => { it('status 500', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker 0x00, 0x00, 0x01, 0xF4, // status_code=500 0x01, 0x01 // null message, null exception @@ -186,7 +186,7 @@ describe('GraphBinaryReader', () => { describe('nullable status_message', () => { it('present message', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker 0x00, 0x00, 0x00, 0xC8, // status_code=200 0x00, // message present flag @@ -199,7 +199,7 @@ describe('GraphBinaryReader', () => { it('null message', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker 0x00, 0x00, 0x00, 0xC8, // status_code=200 0x01, // message null flag @@ -213,7 +213,7 @@ describe('GraphBinaryReader', () => { describe('nullable exception', () => { it('present exception', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker 0x00, 0x00, 0x01, 0xF4, // status_code=500 0x01, // message null @@ -226,7 +226,7 @@ describe('GraphBinaryReader', () => { it('null exception', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker 0x00, 0x00, 0x00, 0xC8, // status_code=200 0x01, // message null @@ -240,7 +240,7 @@ describe('GraphBinaryReader', () => { describe('error response', () => { it('no result data with error status', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0xFD, 0x00, 0x00, // marker (no data) 0x00, 0x00, 0x01, 0xF4, // status_code=500 0x00, // message present @@ -259,7 +259,7 @@ describe('GraphBinaryReader', () => { describe('complex result values', () => { it('vertex in result data', () => { const buffer = Buffer.from([ - 0x81, 0x00, // version, bulked=false + 0x84, 0x00, // version, bulked=false 0x11, 0x00, // fq Vertex: type_code=0x11, value_flag=0x00 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, // id: fq Int=1 0x00, 0x00, 0x00, 0x01, // label: bare List length=1 diff --git a/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryWriter-test.js b/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryWriter-test.js index d59937ce42..4c2a07b11e 100644 --- a/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryWriter-test.js +++ b/gremlin-js/gremlin-javascript/test/unit/graphbinary/GraphBinaryWriter-test.js @@ -20,7 +20,7 @@ /* * GraphBinaryWriter v4 request format tests. * Tests the writer's ability to generate v4 request format: - * {version:0x81}{fields:Map bare}{gremlin:String bare} + * {version:0x84}{fields:Map bare}{gremlin:String bare} */ import { assert } from 'chai'; @@ -32,9 +32,9 @@ describe('GraphBinaryWriter', () => { const writer = new GraphBinaryWriter(ioc); describe('version byte', () => { - it('first byte is 0x81', () => { + it('first byte is 0x84', () => { const result = writer.writeRequest({ gremlin: 'g.V()', fields: new Map() }); - assert.equal(result[0], 0x81); + assert.equal(result[0], 0x84); }); }); @@ -42,7 +42,7 @@ describe('GraphBinaryWriter', () => { it('empty map + bare string', () => { const result = writer.writeRequest({ gremlin: 'g.V()', fields: new Map() }); const expected = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, 0x00, 0x00, 0x00, // empty map bare (length=0) 0x00, 0x00, 0x00, 0x05, // string length=5 0x67, 0x2E, 0x56, 0x28, 0x29 // "g.V()" @@ -57,7 +57,7 @@ describe('GraphBinaryWriter', () => { fields.set('evaluationTimeout', 1000); const result = writer.writeRequest({ gremlin: 'g.V()', fields }); const expected = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, 0x00, 0x00, 0x01, // map length=1 0x03, 0x00, // key type_code=STRING, value_flag=0x00 0x00, 0x00, 0x00, 0x11, // key string length=17 @@ -75,7 +75,7 @@ describe('GraphBinaryWriter', () => { it('undefined fields defaults to empty map', () => { const result = writer.writeRequest({ gremlin: 'g.V()', fields: undefined }); const expected = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, 0x00, 0x00, 0x00, // empty map bare (length=0) 0x00, 0x00, 0x00, 0x05, // string length=5 0x67, 0x2E, 0x56, 0x28, 0x29 // "g.V()" @@ -86,7 +86,7 @@ describe('GraphBinaryWriter', () => { it('null fields defaults to empty map', () => { const result = writer.writeRequest({ gremlin: 'g.V()', fields: null }); const expected = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, 0x00, 0x00, 0x00, // empty map bare (length=0) 0x00, 0x00, 0x00, 0x05, // string length=5 0x67, 0x2E, 0x56, 0x28, 0x29 // "g.V()" @@ -112,7 +112,7 @@ describe('GraphBinaryWriter', () => { it('empty string has length 0', () => { const result = writer.writeRequest({ gremlin: '', fields: new Map() }); const expected = Buffer.from([ - 0x81, // version + 0x84, // version 0x00, 0x00, 0x00, 0x00, // empty map bare (length=0) 0x00, 0x00, 0x00, 0x00 // empty string bare (length=0) ]); diff --git a/gremlin-python/src/main/python/gremlin_python/driver/serializer.py b/gremlin-python/src/main/python/gremlin_python/driver/serializer.py index 800b0500b1..3f18e8cf06 100644 --- a/gremlin-python/src/main/python/gremlin_python/driver/serializer.py +++ b/gremlin-python/src/main/python/gremlin_python/driver/serializer.py @@ -137,7 +137,7 @@ class GraphBinarySerializersV4(object): def finalize_message(self, message): ba = bytearray() - ba.extend(graphbinaryV4.uint8_pack(0x81)) + ba.extend(graphbinaryV4.uint8_pack(0x84)) fields = message["fields"] ba.extend(self.int_pack(len(fields))) for k, v in fields.items(): diff --git a/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java index a155ddbd05..875feb334d 100644 --- a/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java +++ b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java @@ -58,7 +58,7 @@ public class SerializationBenchmark extends AbstractBenchmarkBase { private static final ByteBuf RequestMessageBinaryBuffer1 = Unpooled.wrappedBuffer(new byte[]{ // flag - (byte)0x81, + (byte)0x84, // uuid (byte) 0xd3, (byte) 0xfd, 0x35, 0x40, 0x67, 0x18, 0x46, (byte) 0x87,(byte) 0x95, 0x6b, (byte) 0xc8, 0x61, (byte) 0x8a, 0x26, (byte) 0xe3, 0x35, @@ -72,7 +72,7 @@ public class SerializationBenchmark extends AbstractBenchmarkBase { private static final ByteBuf RequestMessageBinaryBuffer2 = Unpooled.wrappedBuffer(new byte[]{ // flag - (byte)0x81, + (byte)0x84, // uuid (byte) 0xd3, (byte) 0xfd, 0x35, 0x40, 0x67, 0x18, 0x46, (byte) 0x87,(byte) 0x95, 0x6b, (byte) 0xc8, 0x61, (byte) 0x8a, 0x26, (byte) 0xe3, 0x35,
