Skip to content

Commit 221daae

Browse files
committed
prepared-metadata: harden cached decoder state
1 parent b8b714c commit 221daae

11 files changed

Lines changed: 2104 additions & 135 deletions

CHANGELOG.rst

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,35 @@ Features
77
statements skip re-sending result metadata on EXECUTE, and the driver automatically
88
refreshes cached metadata when the server detects a schema change (DRIVER-153)
99

10+
Bug Fixes
11+
---------
12+
* Harden prepared-result metadata caching against concurrent schema/client decoder
13+
changes. Cached metadata, ids, and decoder provenance are published atomically;
14+
UDT descriptors are isolated by registered Python class; UDT registration
15+
invalidates cached ids before publishing mapping changes; and futures refresh
16+
their request snapshot before fetching another page or after re-prepare.
17+
* Restrict ``skip_meta`` to immutable snapshots of built-in protocol handlers.
18+
A Session keeps using the immutable configuration it captured, while modified
19+
built-in handlers and custom handlers cannot create an eligible snapshot and
20+
continue to receive full result metadata.
21+
* Stop retrying a prepared query when re-prepare returns a different query id;
22+
the future now remains failed instead of updating metadata and issuing another
23+
request.
24+
* Restore an evicted prepared-statement cache entry through the Cluster's
25+
lock-protected ``add_prepared()`` path during UNPREPARED recovery.
26+
1027
Others
1128
------
1229
* ``PreparedStatement.result_metadata`` and ``PreparedStatement.result_metadata_id`` are
1330
now read-only. They are replaced together by
1431
``PreparedStatement.update_result_metadata()``, so a request can never observe a metadata
1532
id paired with result metadata from a different schema version. Code that assigned either
16-
attribute directly must call ``update_result_metadata()`` instead.
33+
attribute directly must call ``update_result_metadata()`` instead. The metadata getter
34+
keeps its historical list shape but returns a defensive copy, so mutating it cannot
35+
change the internal metadata/id pair.
36+
* Client-initiated PREPARE responses now use
37+
``Session.client_protocol_handler``, matching the handler used for subsequent
38+
EXECUTE responses. This is user-visible for custom protocol handlers.
1739
* Message serialization now receives the connection's negotiated ``ProtocolFeatures``:
1840
``Connection.send_msg`` passes ``protocol_features`` to the encoder, and
1941
``_ProtocolHandler.encode_message`` forwards it to each message's ``send_body``.
@@ -24,8 +46,10 @@ Others
2446
forward it. There is deliberately no compatibility fallback: protocol extensions
2547
are negotiated per connection at STARTUP, so an encoder unaware of
2648
``protocol_features`` could silently omit fields a negotiated extension requires.
27-
This release emits no new bytes on the wire; the parameter is groundwork for
28-
upcoming protocol extensions (``SCYLLA_USE_METADATA_ID``, ``TABLETS_ROUTING_V2``).
49+
When ``SCYLLA_USE_METADATA_ID`` is negotiated, EXECUTE messages use this plumbing
50+
to include the extension's metadata id and may request that result metadata be
51+
omitted. Connections that do not negotiate the extension retain their existing
52+
frame layout.
2953

3054
3.29.11
3155
=======

0 commit comments

Comments
 (0)