mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-21 23:32:15 +00:00
When reserialize_value() is called on a vector type (which happens only when the vector's element type contains sets or maps), the old code materialized all elements via split_fragmented() into a std::vector<managed_bytes>, then iterated them calling reserialize_value() on each — discarding the intermediate copy. Use split_fragmented_view() to obtain zero-copy views of elements, and pass those directly to reserialize_value(). This avoids one managed_bytes allocation per element. Additionally, wrap the call with with_simplified() so that when the input is a single contiguous fragment (the common case), the compiler receives a single_fragmented_view and can eliminate fragment-boundary checks at compile time. Also generalize build_value_fragmented() to accept any forward range of FragmentedView elements (not just managed_bytes), and write directly into the output buffer via with_linearized instead of going through an intermediate read_simple_bytes copy. This benefits all callers including evaluate_vector() on the INSERT path for vector<float, N>. The with_simplified() dispatch instantiates reserialize_value with single_fragmented_view, which in turn instantiates partially_deserialize_listlike and partially_deserialize_map with that type. Add explicit template instantiations in types/types.cc since those function templates are defined there and only previously instantiated for managed_bytes_view and fragmented_temporary_buffer::view. Note: the reserialization path is only exercised for vectors whose element type contains sets or maps (e.g. vector<frozen<map<int,int>>, N>). The common vector<float, N> case never enters reserialize_value() because bound_value_needs_to_be_reserialized() returns false at the call site. However, the build_value_fragmented() improvement applies to all vector INSERTs. References: SCYLLADB-471 Fixes: SCYLLADB-1799 Closes scylladb/scylladb#28559