Skip to content

Commit 6be14e1

Browse files
committed
topic metadata
1 parent 647bb2b commit 6be14e1

File tree

5 files changed

+37
-14
lines changed

5 files changed

+37
-14
lines changed

examples/topic/basic_example.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
async def connect(endpoint: str, database: str) -> ydb.aio.Driver:
99
config = ydb.DriverConfig(endpoint=endpoint, database=database)
10-
config.credentials = ydb.credentials_from_env_variables()
10+
# config.credentials = ydb.credentials_from_env_variables()
1111
driver = ydb.aio.Driver(config)
12-
await driver.wait(15)
12+
await driver.wait(5,fail_fast=True)
1313
return driver
1414

1515

@@ -25,7 +25,11 @@ async def create_topic(driver: ydb.aio.Driver, topic: str, consumer: str):
2525
async def write_messages(driver: ydb.aio.Driver, topic: str):
2626
async with driver.topic_client.writer(topic) as writer:
2727
for i in range(10):
28-
await writer.write(f"mess-{i}")
28+
mess = ydb.TopicWriterMessage(
29+
data = f"mess-{i}",
30+
metadata_items= {"index": f"{i}"}
31+
)
32+
await writer.write(mess)
2933
await asyncio.sleep(1)
3034

3135

@@ -38,6 +42,7 @@ async def read_messages(driver: ydb.aio.Driver, topic: str, consumer: str):
3842
print(mess.seqno)
3943
print(mess.created_at)
4044
print(mess.data.decode())
45+
print(mess.metadata_items)
4146
reader.commit(mess)
4247
except asyncio.TimeoutError:
4348
return

ydb/_grpc/grpcwrapper/ydb_topic.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ class MessageData(IToProto):
208208
data: bytes
209209
uncompressed_size: int
210210
partitioning: "StreamWriteMessage.PartitioningType"
211+
metadata_items: Dict[str, bytes]
211212

212213
def to_proto(
213214
self,
@@ -218,6 +219,11 @@ def to_proto(
218219
proto.data = self.data
219220
proto.uncompressed_size = self.uncompressed_size
220221

222+
for key, value in self.metadata_items.items():
223+
# TODO: CHECK
224+
item = ydb_topic_pb2.MetadataItem(key=key, value=value)
225+
proto.metadata_items.append(item)
226+
221227
if self.partitioning is None:
222228
pass
223229
elif isinstance(self.partitioning, StreamWriteMessage.PartitioningPartitionID):
@@ -489,16 +495,19 @@ class MessageData(IFromProto):
489495
data: bytes
490496
uncompresed_size: int
491497
message_group_id: str
498+
metadata_items: Dict[str, bytes]
492499

493500
@staticmethod
494501
def from_proto(
495502
msg: ydb_topic_pb2.StreamReadMessage.ReadResponse.MessageData,
496503
) -> "StreamReadMessage.ReadResponse.MessageData":
504+
metadata_items = {meta.key: meta.value for meta in msg.metadata_items}
497505
return StreamReadMessage.ReadResponse.MessageData(
498506
offset=msg.offset,
499507
seq_no=msg.seq_no,
500508
created_at=msg.created_at.ToDatetime(),
501509
data=msg.data,
510+
metadata_items=metadata_items,
502511
uncompresed_size=msg.uncompressed_size,
503512
message_group_id=msg.message_group_id,
504513
)

ydb/_topic_reader/datatypes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class PublicMessage(ICommittable, ISessionAlive):
4040
written_at: datetime.datetime
4141
producer_id: str
4242
data: Union[bytes, Any] # set as original decompressed bytes or deserialized object if deserializer set in reader
43+
metadata_items: Dict[str, bytes]
4344
_partition_session: PartitionSession
4445
_commit_start_offset: int
4546
_commit_end_offset: int

ydb/_topic_reader/topic_reader_asyncio.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ def _read_response_to_batches(self, message: StreamReadMessage.ReadResponse) ->
624624
written_at=server_batch.written_at,
625625
producer_id=server_batch.producer_id,
626626
data=message_data.data,
627+
metadata_items=message_data.metadata_items,
627628
_partition_session=partition_session,
628629
_commit_start_offset=partition_session._next_message_start_commit_offset,
629630
_commit_end_offset=message_data.offset + 1,

ydb/_topic_writer/topic_writer.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from .._grpc.grpcwrapper.ydb_topic_public_types import PublicCodec
1616
from .. import connection
1717

18-
Message = typing.Union["PublicMessage", "PublicMessage.SimpleMessageSourceType"]
18+
Message = typing.Union["PublicMessage", "PublicMessage.SimpleSourceType"]
1919

2020

2121
@dataclass
@@ -91,20 +91,23 @@ class PublicWriterInitInfo:
9191
class PublicMessage:
9292
seqno: Optional[int]
9393
created_at: Optional[datetime.datetime]
94-
data: "PublicMessage.SimpleMessageSourceType"
94+
data: "PublicMessage.SimpleSourceType"
95+
metadata_items: Optional[Dict[str, "PublicMessage.SimpleSourceType"]]
9596

96-
SimpleMessageSourceType = Union[str, bytes] # Will be extend
97+
SimpleSourceType = Union[str, bytes] # Will be extend
9798

9899
def __init__(
99100
self,
100-
data: SimpleMessageSourceType,
101+
data: SimpleSourceType,
101102
*,
103+
metadata_items: Optional[Dict[str, "PublicMessage.SimpleSourceType"]] = None,
102104
seqno: Optional[int] = None,
103105
created_at: Optional[datetime.datetime] = None,
104106
):
105107
self.seqno = seqno
106108
self.created_at = created_at
107109
self.data = data
110+
self.metadata_items = metadata_items
108111

109112
@staticmethod
110113
def _create_message(data: Message) -> "PublicMessage":
@@ -121,26 +124,29 @@ def __init__(self, mess: PublicMessage):
121124
seq_no=mess.seqno,
122125
created_at=mess.created_at,
123126
data=mess.data,
127+
metadata_items=mess.metadata_items,
124128
uncompressed_size=len(mess.data),
125129
partitioning=None,
126130
)
127131
self.codec = PublicCodec.RAW
128132

129-
def get_bytes(self) -> bytes:
130-
if self.data is None:
133+
def get_bytes(self, obj: Optional[PublicMessage.SimpleSourceType]) -> bytes:
134+
if obj is None:
131135
return bytes()
132-
if isinstance(self.data, bytes):
133-
return self.data
134-
if isinstance(self.data, str):
135-
return self.data.encode("utf-8")
136+
if isinstance(obj, bytes):
137+
return obj
138+
if isinstance(obj, str):
139+
return obj.encode("utf-8")
136140
raise ValueError("Bad data type")
137141

138142
def to_message_data(self) -> StreamWriteMessage.WriteRequest.MessageData:
139-
data = self.get_bytes()
143+
data = self.get_bytes(self.data)
144+
metadata_items = {key: self.get_bytes(value) for key, value in self.metadata_items.items()}
140145
return StreamWriteMessage.WriteRequest.MessageData(
141146
seq_no=self.seq_no,
142147
created_at=self.created_at,
143148
data=data,
149+
metadata_items=metadata_items,
144150
uncompressed_size=len(data),
145151
partitioning=None, # unsupported by server now
146152
)
@@ -221,6 +227,7 @@ def messages_to_proto_requests(
221227
seq_no=_max_int,
222228
created_at=datetime.datetime(3000, 1, 1, 1, 1, 1, 1),
223229
data=bytes(1),
230+
metadata_items={},
224231
uncompressed_size=_max_int,
225232
partitioning=StreamWriteMessage.PartitioningMessageGroupID(
226233
message_group_id="a" * 100,

0 commit comments

Comments
 (0)