Get rid of unnecessary allocations/copies for SQL queries handler of IPROTO_EXECUTE
Follow-up: !1228 (merged)
Initial: #640 (comment 81625)
Причины
При обработке IPROTO_EXECUTE запросов, нам требуется отдать данные из Tuple
в box_iproto_send
, так как мы перенаправляем (un-)prepared statements в sbroad'овый sql_dispatch
. Однако, из-за того что ответ sql_dispatch
несовместим с IPROTO протоколом (вместо MP_POSFIXINT для ключей, sbroad
использует MP_FIXSTR из названия этих ключей), мы не можем его просто передать, не изменяя.
В текущей реализации, мы используем SmallVec<[u8; RESERVED_SIZE]>
, который лишь частично исправляет эту ситуацию.
Основная проблема в том, что текущее API не позволяет нам взять мутабельно (.data()
возвращает &[u8]
) данные, что находятся за Tuple
, либо хотя бы получить TupleBuffer
, из-за чего переписывание ключей в ответе без аллокаций и копирования (.to_vec()
копирует весь Tuple
в Vec<u8>
) на совместимые с IPROTO протоколом - невозможно.
Решения
Предлагается два возможных пути:
-
sql_dispatch
должен возвращать неTuple
, аTupleBuffer
, что позволит управлять слайсом более подходящим образом -
sql_dispatch
возвращает данные в совместимом с IPROTO протоколом формате
Оба варианта предполагают изменение API, при том, потенциально, ломающим образом.