This is a preliminary review. I'll look at this more closely soon. On Thu, 29 Feb 2024 at 22:26, Heikki Linnakangas <hlinn...@iki.fi> wrote: > If the client requests the "_pq_.extended_query_cancel" protocol > feature, the server will generate a longer 256-bit cancellation key.
Huge +1 for this general idea. This is a problem I ran into with PgBouncer, and had to make some concessions when fitting the information I wanted into the available bits. Also from a security perspective I don't think the current amount of bits have stood the test of time. + ADD_STARTUP_OPTION("_pq_.extended_query_cancel", ""); Since this parameter doesn't actually take a value (just empty string). I think this behaviour makes more sense as a minor protocol version bump instead of a parameter. + if (strcmp(conn->workBuffer.data, "_pq_.extended_query_cancel") == 0) + { + /* that's ok */ + continue; + } Please see this thread[1], which in the first few patches makes pqGetNegotiateProtocolVersion3 actually usable for extending the protocol. I started that, because very proposed protocol change that's proposed on the list has similar changes to pqGetNegotiateProtocolVersion3 and I think we shouldn't make these changes ad-hoc hacked into the current code, but actually do them once in a way that makes sense for all protocol changes. > Documentation is still missing I think at least protocol message type documentation would be very helpful in reviewing, because that is really a core part of this change. Based on the current code I think it should have a few changes: + int cancel_key_len = 5 + msgLength - (conn->inCursor - conn->inStart); + + conn->be_cancel_key = malloc(cancel_key_len); + if (conn->be_cancel_key == NULL) This is using the message length to determine the length of the cancel key in BackendKey. That is not something we generally do in the protocol. It's even documented: "Notice that although each message includes a byte count at the beginning, the message format is defined so that the message end can be found without reference to the byte count." So I think the patch should be changed to include the length of the cancel key explicitly in the message. [1]: https://www.postgresql.org/message-id/flat/CAGECzQSr2%3DJPJHNN06E_jTF2%2B0E60K%3DhotyBw5wY%3Dq9Wvmt7DQ%40mail.gmail.com#359e4222eb161da37124be1a384f8d92