coordinode 3.0.0__tar.gz → 4.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. {coordinode-3.0.0 → coordinode-4.0.0}/.gitignore +0 -6
  2. {coordinode-3.0.0 → coordinode-4.0.0}/PKG-INFO +12 -1
  3. {coordinode-3.0.0 → coordinode-4.0.0}/README.md +11 -0
  4. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/__init__.py +2 -0
  5. coordinode-4.0.0/coordinode/_proto/coordinode/internode/handshake_pb2.py +38 -0
  6. coordinode-4.0.0/coordinode/_proto/coordinode/internode/handshake_pb2.pyi +11 -0
  7. coordinode-4.0.0/coordinode/_proto/coordinode/internode/handshake_pb2_grpc.py +132 -0
  8. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/admin/cluster_pb2_grpc.py +13 -12
  9. coordinode-4.0.0/coordinode/_proto/coordinode/v1/query/cypher_pb2.py +89 -0
  10. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/cypher_pb2.pyi +10 -4
  11. coordinode-4.0.0/coordinode/_proto/coordinode/v1/replication/cdc_pb2.py +62 -0
  12. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/cdc_pb2.pyi +56 -2
  13. coordinode-4.0.0/coordinode/_proto/coordinode/v1/replication/cdc_pb2_grpc.py +243 -0
  14. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/consistency_pb2.py +5 -3
  15. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/consistency_pb2.pyi +11 -0
  16. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/raft_pb2.py +6 -6
  17. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/raft_pb2.pyi +4 -2
  18. coordinode-4.0.0/coordinode/_proto/coordinode/v1/session/session_pb2.py +91 -0
  19. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/session/session_pb2.pyi +90 -10
  20. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/session/session_pb2_grpc.py +15 -9
  21. coordinode-4.0.0/coordinode/_proto/coordinode/v2/graph/__init__.py +0 -0
  22. coordinode-4.0.0/coordinode/_proto/coordinode/v2/graph/schema_pb2.py +104 -0
  23. coordinode-4.0.0/coordinode/_proto/coordinode/v2/graph/schema_pb2.pyi +296 -0
  24. coordinode-4.0.0/coordinode/_proto/coordinode/v2/graph/schema_pb2_grpc.py +400 -0
  25. coordinode-4.0.0/coordinode/_proto/google/__init__.py +0 -0
  26. coordinode-4.0.0/coordinode/_proto/google/api/__init__.py +0 -0
  27. coordinode-4.0.0/coordinode/_proto/google/rpc/__init__.py +0 -0
  28. coordinode-4.0.0/coordinode/_proto/google/rpc/status_pb2.py +38 -0
  29. coordinode-4.0.0/coordinode/_proto/google/rpc/status_pb2.pyi +18 -0
  30. coordinode-4.0.0/coordinode/_proto/google/rpc/status_pb2_grpc.py +24 -0
  31. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_version.py +2 -2
  32. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/client.py +359 -117
  33. coordinode-3.0.0/coordinode/_proto/coordinode/v1/graph/schema_pb2.py +0 -75
  34. coordinode-3.0.0/coordinode/_proto/coordinode/v1/graph/schema_pb2.pyi +0 -181
  35. coordinode-3.0.0/coordinode/_proto/coordinode/v1/graph/schema_pb2_grpc.py +0 -233
  36. coordinode-3.0.0/coordinode/_proto/coordinode/v1/query/cypher_pb2.py +0 -89
  37. coordinode-3.0.0/coordinode/_proto/coordinode/v1/replication/cdc_pb2.py +0 -48
  38. coordinode-3.0.0/coordinode/_proto/coordinode/v1/replication/cdc_pb2_grpc.py +0 -127
  39. coordinode-3.0.0/coordinode/_proto/coordinode/v1/session/session_pb2.py +0 -75
  40. {coordinode-3.0.0 → coordinode-4.0.0}/LICENSE +0 -0
  41. {coordinode-3.0.0 → coordinode-4.0.0}/NOTICE +0 -0
  42. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/__init__.py +0 -0
  43. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/__init__.py +0 -0
  44. {coordinode-3.0.0/coordinode/_proto/coordinode/v1 → coordinode-4.0.0/coordinode/_proto/coordinode/internode}/__init__.py +0 -0
  45. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/admin → coordinode-4.0.0/coordinode/_proto/coordinode/v1}/__init__.py +0 -0
  46. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/common → coordinode-4.0.0/coordinode/_proto/coordinode/v1/admin}/__init__.py +0 -0
  47. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/admin/cluster_pb2.py +0 -0
  48. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/admin/cluster_pb2.pyi +0 -0
  49. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/graph → coordinode-4.0.0/coordinode/_proto/coordinode/v1/common}/__init__.py +0 -0
  50. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/common/pagination_pb2.py +0 -0
  51. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/common/pagination_pb2.pyi +0 -0
  52. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/common/pagination_pb2_grpc.py +0 -0
  53. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/common/types_pb2.py +0 -0
  54. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/common/types_pb2.pyi +0 -0
  55. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/common/types_pb2_grpc.py +0 -0
  56. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/health → coordinode-4.0.0/coordinode/_proto/coordinode/v1/graph}/__init__.py +0 -0
  57. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/graph/blob_pb2.py +0 -0
  58. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/graph/blob_pb2.pyi +0 -0
  59. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/graph/blob_pb2_grpc.py +0 -0
  60. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/graph/graph_pb2.py +0 -0
  61. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/graph/graph_pb2.pyi +0 -0
  62. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/graph/graph_pb2_grpc.py +0 -0
  63. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/query → coordinode-4.0.0/coordinode/_proto/coordinode/v1/health}/__init__.py +0 -0
  64. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/health/health_pb2.py +0 -0
  65. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/health/health_pb2.pyi +0 -0
  66. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/health/health_pb2_grpc.py +0 -0
  67. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/replication → coordinode-4.0.0/coordinode/_proto/coordinode/v1/query}/__init__.py +0 -0
  68. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/cypher_pb2_grpc.py +0 -0
  69. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/text_pb2.py +0 -0
  70. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/text_pb2.pyi +0 -0
  71. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/text_pb2_grpc.py +0 -0
  72. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/vector_pb2.py +0 -0
  73. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/vector_pb2.pyi +0 -0
  74. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/query/vector_pb2_grpc.py +0 -0
  75. {coordinode-3.0.0/coordinode/_proto/coordinode/v1/session → coordinode-4.0.0/coordinode/_proto/coordinode/v1/replication}/__init__.py +0 -0
  76. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/consistency_pb2_grpc.py +0 -0
  77. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/raft_pb2_grpc.py +0 -0
  78. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/transfer_pb2.py +0 -0
  79. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/transfer_pb2.pyi +0 -0
  80. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/coordinode/v1/replication/transfer_pb2_grpc.py +0 -0
  81. {coordinode-3.0.0/coordinode/_proto/google → coordinode-4.0.0/coordinode/_proto/coordinode/v1/session}/__init__.py +0 -0
  82. {coordinode-3.0.0/coordinode/_proto/google/api → coordinode-4.0.0/coordinode/_proto/coordinode/v2}/__init__.py +0 -0
  83. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/google/api/annotations_pb2.py +0 -0
  84. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/google/api/annotations_pb2.pyi +0 -0
  85. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/google/api/annotations_pb2_grpc.py +0 -0
  86. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/google/api/http_pb2.py +0 -0
  87. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/google/api/http_pb2.pyi +0 -0
  88. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_proto/google/api/http_pb2_grpc.py +0 -0
  89. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_source.py +0 -0
  90. {coordinode-3.0.0 → coordinode-4.0.0}/coordinode/_types.py +0 -0
  91. {coordinode-3.0.0 → coordinode-4.0.0}/pyproject.toml +0 -0
@@ -22,10 +22,4 @@ coordinode/coordinode/_version.py
22
22
  langchain-coordinode/langchain_coordinode/_version.py
23
23
  llama-index-coordinode/llama_index/graph_stores/coordinode/_version.py
24
24
 
25
- # Local dev / arch docs — not part of the SDK
26
- GAPS.md
27
- CLAUDE.md
28
- DEVLOG*.md
29
-
30
25
  **/.ipynb_checkpoints/
31
- .claude/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: coordinode
3
- Version: 3.0.0
3
+ Version: 4.0.0
4
4
  Summary: Python client for CoordiNode — graph + vector + full-text database
5
5
  Project-URL: Homepage, https://github.com/structured-world/coordinode
6
6
  Project-URL: Repository, https://github.com/structured-world/coordinode-python
@@ -231,6 +231,17 @@ Accepted values:
231
231
  - ``read_concern``: ``local`` (default) · ``majority`` · ``linearizable`` · ``snapshot``. Causal reads (``after_index`` > 0) require ``majority`` here.
232
232
  - ``write_concern``: ``"majority"`` (default) · a member count (``1`` leader only, ``0`` fire-and-forget) · ``WriteConcern(w, journal, timeout_ms)`` with ``journal`` one of ``journal`` (default) · ``cache`` · ``memory``. The volatile ``cache`` and ``memory`` states are accepted only with ``w`` of 0 or 1.
233
233
  - ``read_preference``: ``primary`` (default) · ``primary_preferred`` · ``secondary`` · ``secondary_preferred`` · ``nearest``
234
+ - ``vector_consistency``: ``current`` (the index as it is: fastest, may include writes newer than the read) · ``snapshot`` (index candidates filtered at the read's snapshot) · ``exact`` (every vector of the label, without the index). Omitted, the mode the read concern implies. A ``vector_consistency`` hint in the query wins.
235
+ - ``vector_build_wait_ms``: how long a vector search waits for an index still being built; ``0`` refuses a building index at once. Omitted, the server's default.
236
+
237
+ ```python
238
+ db.cypher(
239
+ "MATCH (d:Doc) RETURN d.title AS title ORDER BY vector_distance(d.embedding, $q) LIMIT 5",
240
+ params={"q": query_vector},
241
+ vector_consistency="exact",
242
+ vector_build_wait_ms=0,
243
+ )
244
+ ```
234
245
 
235
246
  ## Related Packages
236
247
 
@@ -199,6 +199,17 @@ Accepted values:
199
199
  - ``read_concern``: ``local`` (default) · ``majority`` · ``linearizable`` · ``snapshot``. Causal reads (``after_index`` > 0) require ``majority`` here.
200
200
  - ``write_concern``: ``"majority"`` (default) · a member count (``1`` leader only, ``0`` fire-and-forget) · ``WriteConcern(w, journal, timeout_ms)`` with ``journal`` one of ``journal`` (default) · ``cache`` · ``memory``. The volatile ``cache`` and ``memory`` states are accepted only with ``w`` of 0 or 1.
201
201
  - ``read_preference``: ``primary`` (default) · ``primary_preferred`` · ``secondary`` · ``secondary_preferred`` · ``nearest``
202
+ - ``vector_consistency``: ``current`` (the index as it is: fastest, may include writes newer than the read) · ``snapshot`` (index candidates filtered at the read's snapshot) · ``exact`` (every vector of the label, without the index). Omitted, the mode the read concern implies. A ``vector_consistency`` hint in the query wins.
203
+ - ``vector_build_wait_ms``: how long a vector search waits for an index still being built; ``0`` refuses a building index at once. Omitted, the server's default.
204
+
205
+ ```python
206
+ db.cypher(
207
+ "MATCH (d:Doc) RETURN d.title AS title ORDER BY vector_distance(d.embedding, $q) LIMIT 5",
208
+ params={"q": query_vector},
209
+ vector_consistency="exact",
210
+ vector_build_wait_ms=0,
211
+ )
212
+ ```
202
213
 
203
214
  ## Related Packages
204
215
 
@@ -22,6 +22,7 @@ from coordinode._types import MultiVector, Path
22
22
  from coordinode.client import (
23
23
  AsyncCoordinodeClient,
24
24
  AsyncTransaction,
25
+ ConstraintInfo,
25
26
  CoordinodeClient,
26
27
  EdgeResult,
27
28
  EdgeTypeInfo,
@@ -62,6 +63,7 @@ __all__ = [
62
63
  "LabelInfo",
63
64
  "EdgeTypeInfo",
64
65
  "PropertyDefinitionInfo",
66
+ "ConstraintInfo",
65
67
  "TextIndexInfo",
66
68
  "TraverseResult",
67
69
  ]
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: coordinode/internode/handshake.proto
5
+ # Protobuf Python Version: 7.35.1
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 7,
15
+ 35,
16
+ 1,
17
+ '',
18
+ 'coordinode/internode/handshake.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$coordinode/internode/handshake.proto\x12\x14\x63oordinode.internode\"!\n\x0fHandshakeRecord\x12\x0e\n\x06record\x18\x01 \x01(\x0c\x32l\n\x10VersionHandshake\x12X\n\x08\x45xchange\x12%.coordinode.internode.HandshakeRecord\x1a%.coordinode.internode.HandshakeRecordb\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coordinode.internode.handshake_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ DESCRIPTOR._loaded_options = None
34
+ _globals['_HANDSHAKERECORD']._serialized_start=62
35
+ _globals['_HANDSHAKERECORD']._serialized_end=95
36
+ _globals['_VERSIONHANDSHAKE']._serialized_start=97
37
+ _globals['_VERSIONHANDSHAKE']._serialized_end=205
38
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,11 @@
1
+ from google.protobuf import descriptor as _descriptor
2
+ from google.protobuf import message as _message
3
+ from typing import ClassVar as _ClassVar, Optional as _Optional
4
+
5
+ DESCRIPTOR: _descriptor.FileDescriptor
6
+
7
+ class HandshakeRecord(_message.Message):
8
+ __slots__ = ("record",)
9
+ RECORD_FIELD_NUMBER: _ClassVar[int]
10
+ record: bytes
11
+ def __init__(self, record: _Optional[bytes] = ...) -> None: ...
@@ -0,0 +1,132 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+ import warnings
5
+
6
+ from coordinode.internode import handshake_pb2 as coordinode_dot_internode_dot_handshake__pb2
7
+
8
+ GRPC_GENERATED_VERSION = '1.83.1'
9
+ GRPC_VERSION = grpc.__version__
10
+ _version_not_supported = False
11
+
12
+ try:
13
+ from grpc._utilities import first_version_is_lower
14
+ _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
15
+ except ImportError:
16
+ _version_not_supported = True
17
+
18
+ if _version_not_supported:
19
+ raise RuntimeError(
20
+ f'The grpc package installed is at version {GRPC_VERSION},'
21
+ + ' but the generated code in coordinode/internode/handshake_pb2_grpc.py depends on'
22
+ + f' grpcio>={GRPC_GENERATED_VERSION}.'
23
+ + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
24
+ + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
25
+ )
26
+
27
+
28
+ class VersionHandshakeStub:
29
+ """The version handshake between two members of a consensus group.
30
+
31
+ This file is frozen for the life of the product: its package, service,
32
+ method and messages never change, so that members of any two releases can
33
+ tell each other which version they run. Members whose versions differ
34
+ exchange nothing but this.
35
+
36
+ The same record also travels in the `cn-version-handshake-bin` request
37
+ and response metadata of every other inter-node call; a call whose record
38
+ does not match the receiver's version is refused before its payload is
39
+ read.
40
+ """
41
+
42
+ def __init__(self, channel):
43
+ """Constructor.
44
+
45
+ Args:
46
+ channel: A grpc.Channel.
47
+ """
48
+ self.Exchange = channel.unary_unary(
49
+ '/coordinode.internode.VersionHandshake/Exchange',
50
+ request_serializer=coordinode_dot_internode_dot_handshake__pb2.HandshakeRecord.SerializeToString,
51
+ response_deserializer=coordinode_dot_internode_dot_handshake__pb2.HandshakeRecord.FromString,
52
+ _registered_method=True)
53
+
54
+
55
+ class VersionHandshakeServicer:
56
+ """The version handshake between two members of a consensus group.
57
+
58
+ This file is frozen for the life of the product: its package, service,
59
+ method and messages never change, so that members of any two releases can
60
+ tell each other which version they run. Members whose versions differ
61
+ exchange nothing but this.
62
+
63
+ The same record also travels in the `cn-version-handshake-bin` request
64
+ and response metadata of every other inter-node call; a call whose record
65
+ does not match the receiver's version is refused before its payload is
66
+ read.
67
+ """
68
+
69
+ def Exchange(self, request, context):
70
+ """Exchange version records. Answered whether or not the two members
71
+ match; the caller compares the records itself.
72
+ """
73
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
74
+ context.set_details('Method not implemented!')
75
+ raise NotImplementedError('Method not implemented!')
76
+
77
+
78
+ def add_VersionHandshakeServicer_to_server(servicer, server):
79
+ rpc_method_handlers = {
80
+ 'Exchange': grpc.unary_unary_rpc_method_handler(
81
+ servicer.Exchange,
82
+ request_deserializer=coordinode_dot_internode_dot_handshake__pb2.HandshakeRecord.FromString,
83
+ response_serializer=coordinode_dot_internode_dot_handshake__pb2.HandshakeRecord.SerializeToString,
84
+ ),
85
+ }
86
+ generic_handler = grpc.method_handlers_generic_handler(
87
+ 'coordinode.internode.VersionHandshake', rpc_method_handlers)
88
+ server.add_generic_rpc_handlers((generic_handler,))
89
+ server.add_registered_method_handlers('coordinode.internode.VersionHandshake', rpc_method_handlers)
90
+
91
+
92
+ # This class is part of an EXPERIMENTAL API.
93
+ class VersionHandshake:
94
+ """The version handshake between two members of a consensus group.
95
+
96
+ This file is frozen for the life of the product: its package, service,
97
+ method and messages never change, so that members of any two releases can
98
+ tell each other which version they run. Members whose versions differ
99
+ exchange nothing but this.
100
+
101
+ The same record also travels in the `cn-version-handshake-bin` request
102
+ and response metadata of every other inter-node call; a call whose record
103
+ does not match the receiver's version is refused before its payload is
104
+ read.
105
+ """
106
+
107
+ @staticmethod
108
+ def Exchange(request,
109
+ target,
110
+ options=(),
111
+ channel_credentials=None,
112
+ call_credentials=None,
113
+ insecure=False,
114
+ compression=None,
115
+ wait_for_ready=None,
116
+ timeout=None,
117
+ metadata=None):
118
+ return grpc.experimental.unary_unary(
119
+ request,
120
+ target,
121
+ '/coordinode.internode.VersionHandshake/Exchange',
122
+ coordinode_dot_internode_dot_handshake__pb2.HandshakeRecord.SerializeToString,
123
+ coordinode_dot_internode_dot_handshake__pb2.HandshakeRecord.FromString,
124
+ options,
125
+ channel_credentials,
126
+ insecure,
127
+ call_credentials,
128
+ compression,
129
+ wait_for_ready,
130
+ timeout,
131
+ metadata,
132
+ _registered_method=True)
@@ -126,18 +126,19 @@ class ClusterServiceServicer:
126
126
  def DecommissionNode(self, request, context):
127
127
  """Gracefully decommission a node from the cluster.
128
128
 
129
- Implements the Phase 0-2 decommission protocol:
130
- Phase 0: Quorum gate — verify removing node_id still leaves ≥ 2 voters.
131
- Aborts with FAILED_PRECONDITION if quorum would be lost.
132
- Phase 1: Leadership transfer — if node_id is the current Raft leader,
133
- leadership is transferred to a peer before removal.
134
- For self-decommission (leader removing itself), the request is
135
- internally forwarded to the new leader after transfer.
136
- Phase 2: Membership remove — change_membership(remove: node_id).
137
- Node stops receiving log replication and is removed from quorum.
138
-
139
- CE behaviour: single Raft group, all nodes hold full data. Pruning (Phase 3)
140
- is advisory — operator must delete data on the decommissioned node manually.
129
+ First the quorum gate: removing node_id must still leave at least 2
130
+ voters, otherwise the call aborts with FAILED_PRECONDITION.
131
+
132
+ Then the leadership transfer: if node_id is the current Raft leader,
133
+ leadership moves to a peer before removal. For self-decommission (the
134
+ leader removing itself) the request is forwarded to the new leader after
135
+ the transfer.
136
+
137
+ Last the membership remove, change_membership(remove: node_id): the node
138
+ stops receiving log replication and leaves the quorum.
139
+
140
+ CE behaviour: single Raft group, all nodes hold full data. Pruning is
141
+ advisory: the operator deletes data on the decommissioned node manually.
141
142
 
142
143
  Must be called on the current Raft leader, or on the node being decommissioned
143
144
  when that node is the leader (self-decommission path).
@@ -0,0 +1,89 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: coordinode/v1/query/cypher.proto
5
+ # Protobuf Python Version: 7.35.1
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 7,
15
+ 35,
16
+ 1,
17
+ '',
18
+ 'coordinode/v1/query/cypher.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+ from coordinode._proto.coordinode.v1.common import types_pb2 as coordinode_dot_v1_dot_common_dot_types__pb2
26
+ from coordinode._proto.coordinode.v1.replication import consistency_pb2 as coordinode_dot_v1_dot_replication_dot_consistency__pb2
27
+ from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
28
+
29
+
30
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n coordinode/v1/query/cypher.proto\x12\x13\x63oordinode.v1.query\x1a coordinode/v1/common/types.proto\x1a+coordinode/v1/replication/consistency.proto\x1a\x1cgoogle/api/annotations.proto\"\xac\x04\n\x14\x45xecuteCypherRequest\x12\r\n\x05query\x18\x01 \x01(\t\x12M\n\nparameters\x18\x02 \x03(\x0b\x32\x39.coordinode.v1.query.ExecuteCypherRequest.ParametersEntry\x12\x42\n\x0fread_preference\x18\x03 \x01(\x0e\x32).coordinode.v1.replication.ReadPreference\x12<\n\x0cread_concern\x18\x04 \x01(\x0b\x32&.coordinode.v1.replication.ReadConcern\x12>\n\rwrite_concern\x18\x05 \x01(\x0b\x32\'.coordinode.v1.replication.WriteConcern\x12\x16\n\x0etransaction_id\x18\x06 \x01(\x04\x12H\n\x12vector_consistency\x18\x07 \x01(\x0e\x32,.coordinode.v1.replication.VectorConsistency\x12!\n\x14vector_build_wait_ms\x18\x08 \x01(\rH\x00\x88\x01\x01\x1aV\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32#.coordinode.v1.common.PropertyValue:\x02\x38\x01\x42\x17\n\x15_vector_build_wait_ms\"\x80\x01\n\x15\x45xecuteCypherResponse\x12\x0f\n\x07\x63olumns\x18\x01 \x03(\t\x12&\n\x04rows\x18\x02 \x03(\x0b\x32\x18.coordinode.v1.query.Row\x12.\n\x05stats\x18\x03 \x01(\x0b\x32\x1f.coordinode.v1.query.QueryStats\":\n\x03Row\x12\x33\n\x06values\x18\x01 \x03(\x0b\x32#.coordinode.v1.common.PropertyValue\"\xf6\x01\n\nQueryStats\x12\x15\n\rnodes_created\x18\x01 \x01(\x03\x12\x15\n\rnodes_deleted\x18\x02 \x01(\x03\x12\x15\n\redges_created\x18\x03 \x01(\x03\x12\x15\n\redges_deleted\x18\x04 \x01(\x03\x12\x16\n\x0eproperties_set\x18\x05 \x01(\x03\x12\x19\n\x11\x65xecution_time_ms\x18\x06 \x01(\x03\x12\x15\n\rapplied_index\x18\x07 \x01(\x04\x12\x18\n\x10served_by_leader\x18\x08 \x01(\x08\x12\x11\n\tcommit_ts\x18\t \x01(\x04\x12\x15\n\rread_as_of_ts\x18\n \x01(\x04\"\xcc\x01\n\x14\x45xplainCypherRequest\x12\r\n\x05query\x18\x01 \x01(\t\x12M\n\nparameters\x18\x02 \x03(\x0b\x32\x39.coordinode.v1.query.ExplainCypherRequest.ParametersEntry\x1aV\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32#.coordinode.v1.common.PropertyValue:\x02\x38\x01\"E\n\x15\x45xplainCypherResponse\x12,\n\x04plan\x18\x01 \x01(\x0b\x32\x1e.coordinode.v1.query.QueryPlan\"\xd5\x01\n\tQueryPlan\x12\x10\n\x08operator\x18\x01 \x01(\t\x12<\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32+.coordinode.v1.query.QueryPlan.DetailsEntry\x12\x30\n\x08\x63hildren\x18\x03 \x03(\x0b\x32\x1e.coordinode.v1.query.QueryPlan\x12\x16\n\x0e\x65stimated_rows\x18\x04 \x01(\x01\x1a.\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x19\n\x17\x42\x65ginTransactionRequest\"2\n\x18\x42\x65ginTransactionResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\x04\"l\n\x18\x43ommitTransactionRequest\x12\x16\n\x0etransaction_id\x18\x01 \x01(\x04\x12\x38\n\x06\x65xpect\x18\x02 \x03(\x0b\x32(.coordinode.v1.query.ExpectedNodeVersion\"H\n\x13\x45xpectedNodeVersion\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x14\n\x07version\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_version\"E\n\x19\x43ommitTransactionResponse\x12\x15\n\rapplied_index\x18\x01 \x01(\x04\x12\x11\n\tcommit_ts\x18\x02 \x01(\x04\"4\n\x1aRollbackTransactionRequest\x12\x16\n\x0etransaction_id\x18\x01 \x01(\x04\"\x1d\n\x1bRollbackTransactionResponse2\x81\x06\n\rCypherService\x12\x83\x01\n\rExecuteCypher\x12).coordinode.v1.query.ExecuteCypherRequest\x1a*.coordinode.v1.query.ExecuteCypherResponse\"\x1b\x82\xd3\xe4\x93\x02\x15\"\x10/v1/query/cypher:\x01*\x12\x8b\x01\n\rExplainCypher\x12).coordinode.v1.query.ExplainCypherRequest\x1a*.coordinode.v1.query.ExplainCypherResponse\"#\x82\xd3\xe4\x93\x02\x1d\"\x18/v1/query/cypher/explain:\x01*\x12\x97\x01\n\x10\x42\x65ginTransaction\x12,.coordinode.v1.query.BeginTransactionRequest\x1a-.coordinode.v1.query.BeginTransactionResponse\"&\x82\xd3\xe4\x93\x02 \"\x1b/v1/query/transaction/begin:\x01*\x12\x9b\x01\n\x11\x43ommitTransaction\x12-.coordinode.v1.query.CommitTransactionRequest\x1a..coordinode.v1.query.CommitTransactionResponse\"\'\x82\xd3\xe4\x93\x02!\"\x1c/v1/query/transaction/commit:\x01*\x12\xa3\x01\n\x13RollbackTransaction\x12/.coordinode.v1.query.RollbackTransactionRequest\x1a\x30.coordinode.v1.query.RollbackTransactionResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/query/transaction/rollback:\x01*b\x06proto3')
31
+
32
+ _globals = globals()
33
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
34
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coordinode.v1.query.cypher_pb2', _globals)
35
+ if not _descriptor._USE_C_DESCRIPTORS:
36
+ DESCRIPTOR._loaded_options = None
37
+ _globals['_EXECUTECYPHERREQUEST_PARAMETERSENTRY']._loaded_options = None
38
+ _globals['_EXECUTECYPHERREQUEST_PARAMETERSENTRY']._serialized_options = b'8\001'
39
+ _globals['_EXPLAINCYPHERREQUEST_PARAMETERSENTRY']._loaded_options = None
40
+ _globals['_EXPLAINCYPHERREQUEST_PARAMETERSENTRY']._serialized_options = b'8\001'
41
+ _globals['_QUERYPLAN_DETAILSENTRY']._loaded_options = None
42
+ _globals['_QUERYPLAN_DETAILSENTRY']._serialized_options = b'8\001'
43
+ _globals['_CYPHERSERVICE'].methods_by_name['ExecuteCypher']._loaded_options = None
44
+ _globals['_CYPHERSERVICE'].methods_by_name['ExecuteCypher']._serialized_options = b'\202\323\344\223\002\025\"\020/v1/query/cypher:\001*'
45
+ _globals['_CYPHERSERVICE'].methods_by_name['ExplainCypher']._loaded_options = None
46
+ _globals['_CYPHERSERVICE'].methods_by_name['ExplainCypher']._serialized_options = b'\202\323\344\223\002\035\"\030/v1/query/cypher/explain:\001*'
47
+ _globals['_CYPHERSERVICE'].methods_by_name['BeginTransaction']._loaded_options = None
48
+ _globals['_CYPHERSERVICE'].methods_by_name['BeginTransaction']._serialized_options = b'\202\323\344\223\002 \"\033/v1/query/transaction/begin:\001*'
49
+ _globals['_CYPHERSERVICE'].methods_by_name['CommitTransaction']._loaded_options = None
50
+ _globals['_CYPHERSERVICE'].methods_by_name['CommitTransaction']._serialized_options = b'\202\323\344\223\002!\"\034/v1/query/transaction/commit:\001*'
51
+ _globals['_CYPHERSERVICE'].methods_by_name['RollbackTransaction']._loaded_options = None
52
+ _globals['_CYPHERSERVICE'].methods_by_name['RollbackTransaction']._serialized_options = b'\202\323\344\223\002#\"\036/v1/query/transaction/rollback:\001*'
53
+ _globals['_EXECUTECYPHERREQUEST']._serialized_start=167
54
+ _globals['_EXECUTECYPHERREQUEST']._serialized_end=723
55
+ _globals['_EXECUTECYPHERREQUEST_PARAMETERSENTRY']._serialized_start=612
56
+ _globals['_EXECUTECYPHERREQUEST_PARAMETERSENTRY']._serialized_end=698
57
+ _globals['_EXECUTECYPHERRESPONSE']._serialized_start=726
58
+ _globals['_EXECUTECYPHERRESPONSE']._serialized_end=854
59
+ _globals['_ROW']._serialized_start=856
60
+ _globals['_ROW']._serialized_end=914
61
+ _globals['_QUERYSTATS']._serialized_start=917
62
+ _globals['_QUERYSTATS']._serialized_end=1163
63
+ _globals['_EXPLAINCYPHERREQUEST']._serialized_start=1166
64
+ _globals['_EXPLAINCYPHERREQUEST']._serialized_end=1370
65
+ _globals['_EXPLAINCYPHERREQUEST_PARAMETERSENTRY']._serialized_start=612
66
+ _globals['_EXPLAINCYPHERREQUEST_PARAMETERSENTRY']._serialized_end=698
67
+ _globals['_EXPLAINCYPHERRESPONSE']._serialized_start=1372
68
+ _globals['_EXPLAINCYPHERRESPONSE']._serialized_end=1441
69
+ _globals['_QUERYPLAN']._serialized_start=1444
70
+ _globals['_QUERYPLAN']._serialized_end=1657
71
+ _globals['_QUERYPLAN_DETAILSENTRY']._serialized_start=1611
72
+ _globals['_QUERYPLAN_DETAILSENTRY']._serialized_end=1657
73
+ _globals['_BEGINTRANSACTIONREQUEST']._serialized_start=1659
74
+ _globals['_BEGINTRANSACTIONREQUEST']._serialized_end=1684
75
+ _globals['_BEGINTRANSACTIONRESPONSE']._serialized_start=1686
76
+ _globals['_BEGINTRANSACTIONRESPONSE']._serialized_end=1736
77
+ _globals['_COMMITTRANSACTIONREQUEST']._serialized_start=1738
78
+ _globals['_COMMITTRANSACTIONREQUEST']._serialized_end=1846
79
+ _globals['_EXPECTEDNODEVERSION']._serialized_start=1848
80
+ _globals['_EXPECTEDNODEVERSION']._serialized_end=1920
81
+ _globals['_COMMITTRANSACTIONRESPONSE']._serialized_start=1922
82
+ _globals['_COMMITTRANSACTIONRESPONSE']._serialized_end=1991
83
+ _globals['_ROLLBACKTRANSACTIONREQUEST']._serialized_start=1993
84
+ _globals['_ROLLBACKTRANSACTIONREQUEST']._serialized_end=2045
85
+ _globals['_ROLLBACKTRANSACTIONRESPONSE']._serialized_start=2047
86
+ _globals['_ROLLBACKTRANSACTIONRESPONSE']._serialized_end=2076
87
+ _globals['_CYPHERSERVICE']._serialized_start=2079
88
+ _globals['_CYPHERSERVICE']._serialized_end=2848
89
+ # @@protoc_insertion_point(module_scope)
@@ -10,7 +10,7 @@ from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
10
10
  DESCRIPTOR: _descriptor.FileDescriptor
11
11
 
12
12
  class ExecuteCypherRequest(_message.Message):
13
- __slots__ = ("query", "parameters", "read_preference", "read_concern", "write_concern", "transaction_id")
13
+ __slots__ = ("query", "parameters", "read_preference", "read_concern", "write_concern", "transaction_id", "vector_consistency", "vector_build_wait_ms")
14
14
  class ParametersEntry(_message.Message):
15
15
  __slots__ = ("key", "value")
16
16
  KEY_FIELD_NUMBER: _ClassVar[int]
@@ -24,13 +24,17 @@ class ExecuteCypherRequest(_message.Message):
24
24
  READ_CONCERN_FIELD_NUMBER: _ClassVar[int]
25
25
  WRITE_CONCERN_FIELD_NUMBER: _ClassVar[int]
26
26
  TRANSACTION_ID_FIELD_NUMBER: _ClassVar[int]
27
+ VECTOR_CONSISTENCY_FIELD_NUMBER: _ClassVar[int]
28
+ VECTOR_BUILD_WAIT_MS_FIELD_NUMBER: _ClassVar[int]
27
29
  query: str
28
30
  parameters: _containers.MessageMap[str, _types_pb2.PropertyValue]
29
31
  read_preference: _consistency_pb2.ReadPreference
30
32
  read_concern: _consistency_pb2.ReadConcern
31
33
  write_concern: _consistency_pb2.WriteConcern
32
34
  transaction_id: int
33
- def __init__(self, query: _Optional[str] = ..., parameters: _Optional[_Mapping[str, _types_pb2.PropertyValue]] = ..., read_preference: _Optional[_Union[_consistency_pb2.ReadPreference, str]] = ..., read_concern: _Optional[_Union[_consistency_pb2.ReadConcern, _Mapping]] = ..., write_concern: _Optional[_Union[_consistency_pb2.WriteConcern, _Mapping]] = ..., transaction_id: _Optional[int] = ...) -> None: ...
35
+ vector_consistency: _consistency_pb2.VectorConsistency
36
+ vector_build_wait_ms: int
37
+ def __init__(self, query: _Optional[str] = ..., parameters: _Optional[_Mapping[str, _types_pb2.PropertyValue]] = ..., read_preference: _Optional[_Union[_consistency_pb2.ReadPreference, str]] = ..., read_concern: _Optional[_Union[_consistency_pb2.ReadConcern, _Mapping]] = ..., write_concern: _Optional[_Union[_consistency_pb2.WriteConcern, _Mapping]] = ..., transaction_id: _Optional[int] = ..., vector_consistency: _Optional[_Union[_consistency_pb2.VectorConsistency, str]] = ..., vector_build_wait_ms: _Optional[int] = ...) -> None: ...
34
38
 
35
39
  class ExecuteCypherResponse(_message.Message):
36
40
  __slots__ = ("columns", "rows", "stats")
@@ -49,7 +53,7 @@ class Row(_message.Message):
49
53
  def __init__(self, values: _Optional[_Iterable[_Union[_types_pb2.PropertyValue, _Mapping]]] = ...) -> None: ...
50
54
 
51
55
  class QueryStats(_message.Message):
52
- __slots__ = ("nodes_created", "nodes_deleted", "edges_created", "edges_deleted", "properties_set", "execution_time_ms", "applied_index", "served_by_leader", "commit_ts")
56
+ __slots__ = ("nodes_created", "nodes_deleted", "edges_created", "edges_deleted", "properties_set", "execution_time_ms", "applied_index", "served_by_leader", "commit_ts", "read_as_of_ts")
53
57
  NODES_CREATED_FIELD_NUMBER: _ClassVar[int]
54
58
  NODES_DELETED_FIELD_NUMBER: _ClassVar[int]
55
59
  EDGES_CREATED_FIELD_NUMBER: _ClassVar[int]
@@ -59,6 +63,7 @@ class QueryStats(_message.Message):
59
63
  APPLIED_INDEX_FIELD_NUMBER: _ClassVar[int]
60
64
  SERVED_BY_LEADER_FIELD_NUMBER: _ClassVar[int]
61
65
  COMMIT_TS_FIELD_NUMBER: _ClassVar[int]
66
+ READ_AS_OF_TS_FIELD_NUMBER: _ClassVar[int]
62
67
  nodes_created: int
63
68
  nodes_deleted: int
64
69
  edges_created: int
@@ -68,7 +73,8 @@ class QueryStats(_message.Message):
68
73
  applied_index: int
69
74
  served_by_leader: bool
70
75
  commit_ts: int
71
- def __init__(self, nodes_created: _Optional[int] = ..., nodes_deleted: _Optional[int] = ..., edges_created: _Optional[int] = ..., edges_deleted: _Optional[int] = ..., properties_set: _Optional[int] = ..., execution_time_ms: _Optional[int] = ..., applied_index: _Optional[int] = ..., served_by_leader: _Optional[bool] = ..., commit_ts: _Optional[int] = ...) -> None: ...
76
+ read_as_of_ts: int
77
+ def __init__(self, nodes_created: _Optional[int] = ..., nodes_deleted: _Optional[int] = ..., edges_created: _Optional[int] = ..., edges_deleted: _Optional[int] = ..., properties_set: _Optional[int] = ..., execution_time_ms: _Optional[int] = ..., applied_index: _Optional[int] = ..., served_by_leader: _Optional[bool] = ..., commit_ts: _Optional[int] = ..., read_as_of_ts: _Optional[int] = ...) -> None: ...
72
78
 
73
79
  class ExplainCypherRequest(_message.Message):
74
80
  __slots__ = ("query", "parameters")
@@ -0,0 +1,62 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: coordinode/v1/replication/cdc.proto
5
+ # Protobuf Python Version: 7.35.1
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 7,
15
+ 35,
16
+ 1,
17
+ '',
18
+ 'coordinode/v1/replication/cdc.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#coordinode/v1/replication/cdc.proto\x12\x19\x63oordinode.v1.replication\"\x9b\x01\n\x11\x43onsumerRetention\x12<\n\x06strict\x18\x01 \x01(\x0b\x32*.coordinode.v1.replication.StrictRetentionH\x00\x12>\n\x07\x62ounded\x18\x02 \x01(\x0b\x32+.coordinode.v1.replication.BoundedRetentionH\x00\x42\x08\n\x06policy\"\x11\n\x0fStrictRetention\"\x85\x01\n\x10\x42oundedRetention\x12\x1b\n\x13max_progress_lag_ms\x18\x01 \x01(\x04\x12\x1a\n\x12max_retained_bytes\x18\x02 \x01(\x04\x12 \n\x13liveness_timeout_ms\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x16\n\x14_liveness_timeout_ms\"E\n\x19\x43\x61ncelSubscriptionRequest\x12\x13\n\x0b\x63onsumer_id\x18\x01 \x01(\t\x12\x13\n\x0bincarnation\x18\x02 \x01(\x04\"\x1c\n\x1a\x43\x61ncelSubscriptionResponse\"\x84\x01\n\x1e\x41\x63knowledgeSubscriptionRequest\x12\x13\n\x0b\x63onsumer_id\x18\x01 \x01(\t\x12\x13\n\x0bincarnation\x18\x02 \x01(\x04\x12\x38\n\x08position\x18\x03 \x01(\x0b\x32&.coordinode.v1.replication.ResumeToken\"!\n\x1f\x41\x63knowledgeSubscriptionResponse\"I\n\x0bResumeToken\x12\x10\n\x08shard_id\x18\x01 \x01(\r\x12\x12\n\nsegment_id\x18\x02 \x01(\x04\x12\x14\n\x0c\x65ntry_offset\x18\x03 \x01(\x04\"L\n\nCdcFilters\x12\x12\n\nedge_types\x18\x01 \x03(\t\x12\x19\n\x0cis_migration\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x0f\n\r_is_migration\"\xf3\x01\n\x10SubscribeRequest\x12<\n\x0cresume_token\x18\x01 \x01(\x0b\x32&.coordinode.v1.replication.ResumeToken\x12\x36\n\x07\x66ilters\x18\x02 \x01(\x0b\x32%.coordinode.v1.replication.CdcFilters\x12\x13\n\x0b\x63onsumer_id\x18\x03 \x01(\t\x12\x13\n\x0bincarnation\x18\x04 \x01(\x04\x12?\n\tretention\x18\x05 \x01(\x0b\x32,.coordinode.v1.replication.ConsumerRetention\"\xce\x01\n\x0b\x43hangeEvent\x12\n\n\x02ts\x18\x01 \x01(\x04\x12\x0c\n\x04term\x18\x02 \x01(\x04\x12\x11\n\tlog_index\x18\x03 \x01(\x04\x12\x10\n\x08shard_id\x18\x04 \x01(\r\x12\x14\n\x0cis_migration\x18\x05 \x01(\x08\x12\x30\n\x03ops\x18\x06 \x03(\x0b\x32#.coordinode.v1.replication.ChangeOp\x12\x38\n\x08position\x18\x07 \x01(\x0b\x32&.coordinode.v1.replication.ResumeToken\"p\n\x08\x43hangeOp\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.coordinode.v1.replication.ChangeOpType\x12\x11\n\tpartition\x18\x02 \x01(\r\x12\x0b\n\x03key\x18\x03 \x01(\x0c\x12\r\n\x05value\x18\x04 \x01(\x0c*\x92\x01\n\x0c\x43hangeOpType\x12\x1e\n\x1a\x43HANGE_OP_TYPE_UNSPECIFIED\x10\x00\x12\n\n\x06INSERT\x10\x01\x12\n\n\x06\x44\x45LETE\x10\x02\x12\t\n\x05MERGE\x10\x03\x12\x08\n\x04NOOP\x10\x04\x12\x0e\n\nRAFT_ENTRY\x10\x05\x12\x13\n\x0fRAFT_TRUNCATION\x10\x06\x12\x10\n\x0cREMOVE_RANGE\x10\x07\x32\x90\x03\n\x13\x43hangeStreamService\x12\x62\n\tSubscribe\x12+.coordinode.v1.replication.SubscribeRequest\x1a&.coordinode.v1.replication.ChangeEvent0\x01\x12\x90\x01\n\x17\x41\x63knowledgeSubscription\x12\x39.coordinode.v1.replication.AcknowledgeSubscriptionRequest\x1a:.coordinode.v1.replication.AcknowledgeSubscriptionResponse\x12\x81\x01\n\x12\x43\x61ncelSubscription\x12\x34.coordinode.v1.replication.CancelSubscriptionRequest\x1a\x35.coordinode.v1.replication.CancelSubscriptionResponseb\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'coordinode.v1.replication.cdc_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ DESCRIPTOR._loaded_options = None
34
+ _globals['_CHANGEOPTYPE']._serialized_start=1373
35
+ _globals['_CHANGEOPTYPE']._serialized_end=1519
36
+ _globals['_CONSUMERRETENTION']._serialized_start=67
37
+ _globals['_CONSUMERRETENTION']._serialized_end=222
38
+ _globals['_STRICTRETENTION']._serialized_start=224
39
+ _globals['_STRICTRETENTION']._serialized_end=241
40
+ _globals['_BOUNDEDRETENTION']._serialized_start=244
41
+ _globals['_BOUNDEDRETENTION']._serialized_end=377
42
+ _globals['_CANCELSUBSCRIPTIONREQUEST']._serialized_start=379
43
+ _globals['_CANCELSUBSCRIPTIONREQUEST']._serialized_end=448
44
+ _globals['_CANCELSUBSCRIPTIONRESPONSE']._serialized_start=450
45
+ _globals['_CANCELSUBSCRIPTIONRESPONSE']._serialized_end=478
46
+ _globals['_ACKNOWLEDGESUBSCRIPTIONREQUEST']._serialized_start=481
47
+ _globals['_ACKNOWLEDGESUBSCRIPTIONREQUEST']._serialized_end=613
48
+ _globals['_ACKNOWLEDGESUBSCRIPTIONRESPONSE']._serialized_start=615
49
+ _globals['_ACKNOWLEDGESUBSCRIPTIONRESPONSE']._serialized_end=648
50
+ _globals['_RESUMETOKEN']._serialized_start=650
51
+ _globals['_RESUMETOKEN']._serialized_end=723
52
+ _globals['_CDCFILTERS']._serialized_start=725
53
+ _globals['_CDCFILTERS']._serialized_end=801
54
+ _globals['_SUBSCRIBEREQUEST']._serialized_start=804
55
+ _globals['_SUBSCRIBEREQUEST']._serialized_end=1047
56
+ _globals['_CHANGEEVENT']._serialized_start=1050
57
+ _globals['_CHANGEEVENT']._serialized_end=1256
58
+ _globals['_CHANGEOP']._serialized_start=1258
59
+ _globals['_CHANGEOP']._serialized_end=1370
60
+ _globals['_CHANGESTREAMSERVICE']._serialized_start=1522
61
+ _globals['_CHANGESTREAMSERVICE']._serialized_end=1922
62
+ # @@protoc_insertion_point(module_scope)
@@ -26,6 +26,54 @@ RAFT_ENTRY: ChangeOpType
26
26
  RAFT_TRUNCATION: ChangeOpType
27
27
  REMOVE_RANGE: ChangeOpType
28
28
 
29
+ class ConsumerRetention(_message.Message):
30
+ __slots__ = ("strict", "bounded")
31
+ STRICT_FIELD_NUMBER: _ClassVar[int]
32
+ BOUNDED_FIELD_NUMBER: _ClassVar[int]
33
+ strict: StrictRetention
34
+ bounded: BoundedRetention
35
+ def __init__(self, strict: _Optional[_Union[StrictRetention, _Mapping]] = ..., bounded: _Optional[_Union[BoundedRetention, _Mapping]] = ...) -> None: ...
36
+
37
+ class StrictRetention(_message.Message):
38
+ __slots__ = ()
39
+ def __init__(self) -> None: ...
40
+
41
+ class BoundedRetention(_message.Message):
42
+ __slots__ = ("max_progress_lag_ms", "max_retained_bytes", "liveness_timeout_ms")
43
+ MAX_PROGRESS_LAG_MS_FIELD_NUMBER: _ClassVar[int]
44
+ MAX_RETAINED_BYTES_FIELD_NUMBER: _ClassVar[int]
45
+ LIVENESS_TIMEOUT_MS_FIELD_NUMBER: _ClassVar[int]
46
+ max_progress_lag_ms: int
47
+ max_retained_bytes: int
48
+ liveness_timeout_ms: int
49
+ def __init__(self, max_progress_lag_ms: _Optional[int] = ..., max_retained_bytes: _Optional[int] = ..., liveness_timeout_ms: _Optional[int] = ...) -> None: ...
50
+
51
+ class CancelSubscriptionRequest(_message.Message):
52
+ __slots__ = ("consumer_id", "incarnation")
53
+ CONSUMER_ID_FIELD_NUMBER: _ClassVar[int]
54
+ INCARNATION_FIELD_NUMBER: _ClassVar[int]
55
+ consumer_id: str
56
+ incarnation: int
57
+ def __init__(self, consumer_id: _Optional[str] = ..., incarnation: _Optional[int] = ...) -> None: ...
58
+
59
+ class CancelSubscriptionResponse(_message.Message):
60
+ __slots__ = ()
61
+ def __init__(self) -> None: ...
62
+
63
+ class AcknowledgeSubscriptionRequest(_message.Message):
64
+ __slots__ = ("consumer_id", "incarnation", "position")
65
+ CONSUMER_ID_FIELD_NUMBER: _ClassVar[int]
66
+ INCARNATION_FIELD_NUMBER: _ClassVar[int]
67
+ POSITION_FIELD_NUMBER: _ClassVar[int]
68
+ consumer_id: str
69
+ incarnation: int
70
+ position: ResumeToken
71
+ def __init__(self, consumer_id: _Optional[str] = ..., incarnation: _Optional[int] = ..., position: _Optional[_Union[ResumeToken, _Mapping]] = ...) -> None: ...
72
+
73
+ class AcknowledgeSubscriptionResponse(_message.Message):
74
+ __slots__ = ()
75
+ def __init__(self) -> None: ...
76
+
29
77
  class ResumeToken(_message.Message):
30
78
  __slots__ = ("shard_id", "segment_id", "entry_offset")
31
79
  SHARD_ID_FIELD_NUMBER: _ClassVar[int]
@@ -45,12 +93,18 @@ class CdcFilters(_message.Message):
45
93
  def __init__(self, edge_types: _Optional[_Iterable[str]] = ..., is_migration: _Optional[bool] = ...) -> None: ...
46
94
 
47
95
  class SubscribeRequest(_message.Message):
48
- __slots__ = ("resume_token", "filters")
96
+ __slots__ = ("resume_token", "filters", "consumer_id", "incarnation", "retention")
49
97
  RESUME_TOKEN_FIELD_NUMBER: _ClassVar[int]
50
98
  FILTERS_FIELD_NUMBER: _ClassVar[int]
99
+ CONSUMER_ID_FIELD_NUMBER: _ClassVar[int]
100
+ INCARNATION_FIELD_NUMBER: _ClassVar[int]
101
+ RETENTION_FIELD_NUMBER: _ClassVar[int]
51
102
  resume_token: ResumeToken
52
103
  filters: CdcFilters
53
- def __init__(self, resume_token: _Optional[_Union[ResumeToken, _Mapping]] = ..., filters: _Optional[_Union[CdcFilters, _Mapping]] = ...) -> None: ...
104
+ consumer_id: str
105
+ incarnation: int
106
+ retention: ConsumerRetention
107
+ def __init__(self, resume_token: _Optional[_Union[ResumeToken, _Mapping]] = ..., filters: _Optional[_Union[CdcFilters, _Mapping]] = ..., consumer_id: _Optional[str] = ..., incarnation: _Optional[int] = ..., retention: _Optional[_Union[ConsumerRetention, _Mapping]] = ...) -> None: ...
54
108
 
55
109
  class ChangeEvent(_message.Message):
56
110
  __slots__ = ("ts", "term", "log_index", "shard_id", "is_migration", "ops", "position")