mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-08 05:52:55 +00:00
## Problem Protobuf doesn't support 128 bit integers, so we encode the keys as two 64 bit integers. Issue is that when we split the 128 bit compact key we use signed 64 bit integers to represent the two halves. This may result in a negative lower half when relnode is larger than `0x00800000`. When we convert the lower half to an i128 we get a negative `CompactKey`. ## Summary of Changes Use unsigned integers when encoding into Protobuf. ## Deployment * Prod: We disabled the interpreted proto, so no compat concerns. * Staging: Disable the interpreted proto, do one release, and then release the fixed version. We do this because a negative int32 will convert to a large uint32 value and could give a key in the actual pageserver space. In production we would around this by adding new fields to the proto and deprecating the old ones, but we can make our lives easy here. * Pre-prod: Same as staging
44 lines
777 B
Protocol Buffer
44 lines
777 B
Protocol Buffer
syntax = "proto3";
|
|
|
|
package interpreted_wal;
|
|
|
|
message InterpretedWalRecords {
|
|
repeated InterpretedWalRecord records = 1;
|
|
optional uint64 next_record_lsn = 2;
|
|
}
|
|
|
|
message InterpretedWalRecord {
|
|
optional bytes metadata_record = 1;
|
|
SerializedValueBatch batch = 2;
|
|
uint64 next_record_lsn = 3;
|
|
bool flush_uncommitted = 4;
|
|
uint32 xid = 5;
|
|
}
|
|
|
|
message SerializedValueBatch {
|
|
bytes raw = 1;
|
|
repeated ValueMeta metadata = 2;
|
|
uint64 max_lsn = 3;
|
|
uint64 len = 4;
|
|
}
|
|
|
|
enum ValueMetaType {
|
|
Serialized = 0;
|
|
Observed = 1;
|
|
}
|
|
|
|
message ValueMeta {
|
|
ValueMetaType type = 1;
|
|
CompactKey key = 2;
|
|
uint64 lsn = 3;
|
|
optional uint64 batch_offset = 4;
|
|
optional uint64 len = 5;
|
|
optional bool will_init = 6;
|
|
}
|
|
|
|
message CompactKey {
|
|
uint64 high = 1;
|
|
uint64 low = 2;
|
|
}
|
|
|