@@ -54,6 +54,7 @@ pub(super) fn encode_snapshot(snapshot: &Snapshot) -> Vec<u8> {
5454 bytes. extend_from_slice ( & reservation. reservation_id . get ( ) . to_le_bytes ( ) ) ;
5555 bytes. extend_from_slice ( & reservation. resource_id . get ( ) . to_le_bytes ( ) ) ;
5656 bytes. extend_from_slice ( & reservation. holder_id . get ( ) . to_le_bytes ( ) ) ;
57+ bytes. extend_from_slice ( & reservation. lease_epoch . to_le_bytes ( ) ) ;
5758 bytes. push ( encode_reservation_state ( reservation. state ) ) ;
5859 bytes. extend_from_slice ( & reservation. created_lsn . get ( ) . to_le_bytes ( ) ) ;
5960 bytes. extend_from_slice ( & reservation. deadline_slot . get ( ) . to_le_bytes ( ) ) ;
@@ -76,6 +77,7 @@ pub(super) fn encode_snapshot(snapshot: &Snapshot) -> Vec<u8> {
7677 & mut bytes,
7778 operation. result_reservation_id . map ( ReservationId :: get) ,
7879 ) ;
80+ encode_optional_u64 ( & mut bytes, operation. result_lease_epoch ) ;
7981 encode_optional_u64 ( & mut bytes, operation. result_deadline_slot . map ( Slot :: get) ) ;
8082 bytes. extend_from_slice ( & operation. applied_lsn . get ( ) . to_le_bytes ( ) ) ;
8183 bytes. extend_from_slice ( & operation. retire_after_slot . get ( ) . to_le_bytes ( ) ) ;
@@ -103,7 +105,7 @@ pub(super) fn decode_snapshot(bytes: &[u8]) -> Result<Snapshot, SnapshotError> {
103105 }
104106
105107 let version = cursor. read_u16 ( ) ?;
106- if version != 1 && version != 2 && version != VERSION {
108+ if version != 1 && version != 2 && version != 3 && version != VERSION {
107109 return Err ( SnapshotError :: InvalidVersion ( version) ) ;
108110 }
109111
@@ -143,6 +145,11 @@ pub(super) fn decode_snapshot(bytes: &[u8]) -> Result<Snapshot, SnapshotError> {
143145 command_fingerprint : cursor. read_u128 ( ) ?,
144146 result_code : decode_result_code ( cursor. read_u8 ( ) ?) ?,
145147 result_reservation_id : cursor. read_optional_u128 ( ) ?. map ( ReservationId ) ,
148+ result_lease_epoch : if version >= 4 {
149+ cursor. read_optional_u64 ( ) ?
150+ } else {
151+ None
152+ } ,
146153 result_deadline_slot : cursor. read_optional_u64 ( ) ?. map ( Slot ) ,
147154 applied_lsn : Lsn ( cursor. read_u64 ( ) ?) ,
148155 retire_after_slot : Slot ( cursor. read_u64 ( ) ?) ,
@@ -235,6 +242,7 @@ fn decode_snapshot_reservations(
235242 reservation_id : ReservationId ( cursor. read_u128 ( ) ?) ,
236243 resource_id : ResourceId ( cursor. read_u128 ( ) ?) ,
237244 holder_id : HolderId ( cursor. read_u128 ( ) ?) ,
245+ lease_epoch : if version >= 4 { cursor. read_u64 ( ) ? } else { 1 } ,
238246 state : decode_reservation_state ( cursor. read_u8 ( ) ?) ?,
239247 created_lsn : Lsn ( cursor. read_u64 ( ) ?) ,
240248 deadline_slot : Slot ( cursor. read_u64 ( ) ?) ,
@@ -358,7 +366,8 @@ fn decode_result_code(tag: u8) -> Result<ResultCode, SnapshotError> {
358366 14 => Ok ( ResultCode :: OperationConflict ) ,
359367 15 => Ok ( ResultCode :: InvalidState ) ,
360368 16 => Ok ( ResultCode :: HolderMismatch ) ,
361- 17 => Ok ( ResultCode :: SlotOverflow ) ,
369+ 17 => Ok ( ResultCode :: StaleEpoch ) ,
370+ 18 => Ok ( ResultCode :: SlotOverflow ) ,
362371 _ => Err ( SnapshotError :: InvalidStateTag ( tag) ) ,
363372 }
364373}
@@ -382,6 +391,7 @@ fn encode_result_code(code: ResultCode) -> u8 {
382391 ResultCode :: OperationConflict => 14 ,
383392 ResultCode :: InvalidState => 15 ,
384393 ResultCode :: HolderMismatch => 16 ,
385- ResultCode :: SlotOverflow => 17 ,
394+ ResultCode :: StaleEpoch => 17 ,
395+ ResultCode :: SlotOverflow => 18 ,
386396 }
387397}
0 commit comments