@@ -38,6 +38,8 @@ use restate_types::identifiers::{PartitionId, PartitionKey, SnapshotId, WithPart
3838use restate_types:: logs:: Lsn ;
3939use restate_types:: partitions:: Partition ;
4040use restate_types:: storage:: StorageCodec ;
41+ use restate_types:: storage:: StorageDecode ;
42+ use restate_types:: storage:: StorageEncode ;
4143
4244use crate :: fsm_table:: { get_locally_durable_lsn, get_schema_version, put_schema_version} ;
4345use crate :: keys:: KeyKind ;
@@ -1075,17 +1077,25 @@ pub(crate) trait StorageAccess {
10751077 & mut self ,
10761078 key : K ,
10771079 value : & V ,
1080+ ) -> Result < ( ) > {
1081+ self . put_kv_storage_codec (
1082+ key,
1083+ & ProtobufStorageWrapper :: < V :: ProtobufType > ( value. clone ( ) . into ( ) ) ,
1084+ )
1085+ }
1086+
1087+ #[ inline]
1088+ fn put_kv_storage_codec < K : TableKey , V : StorageEncode + ' static > (
1089+ & mut self ,
1090+ key : K ,
1091+ value : & V ,
10781092 ) -> Result < ( ) > {
10791093 let key_buffer = self . cleared_key_buffer_mut ( key. serialized_length ( ) ) ;
10801094 key. serialize_to ( key_buffer) ;
10811095 let key_buffer = key_buffer. split ( ) ;
10821096
10831097 let value_buffer = self . cleared_value_buffer_mut ( 0 ) ;
1084- StorageCodec :: encode (
1085- & ProtobufStorageWrapper :: < V :: ProtobufType > ( value. clone ( ) . into ( ) ) ,
1086- value_buffer,
1087- )
1088- . map_err ( |e| StorageError :: Generic ( e. into ( ) ) ) ?;
1098+ StorageCodec :: encode ( value, value_buffer) . map_err ( |e| StorageError :: Generic ( e. into ( ) ) ) ?;
10891099 let value_buffer = value_buffer. split ( ) ;
10901100
10911101 self . put_cf ( K :: TABLE , key_buffer, value_buffer)
@@ -1107,23 +1117,33 @@ pub(crate) trait StorageAccess {
11071117 V : PartitionStoreProtobufValue ,
11081118 <<V as PartitionStoreProtobufValue >:: ProtobufType as TryInto < V > >:: Error :
11091119 Into < anyhow:: Error > ,
1120+ {
1121+ let value: Option < ProtobufStorageWrapper < V :: ProtobufType > > =
1122+ self . get_value_storage_codec ( key) ?;
1123+
1124+ value
1125+ . map ( |v| v. 0 . try_into ( ) )
1126+ . transpose ( )
1127+ . map_err ( |err| StorageError :: Conversion ( err. into ( ) ) )
1128+ }
1129+
1130+ #[ inline]
1131+ fn get_value_storage_codec < K , V > ( & mut self , key : K ) -> Result < Option < V > >
1132+ where
1133+ K : TableKey ,
1134+ V : StorageDecode ,
11101135 {
11111136 let mut buf = self . cleared_key_buffer_mut ( key. serialized_length ( ) ) ;
11121137 key. serialize_to ( & mut buf) ;
11131138 let buf = buf. split ( ) ;
11141139
1115- match self . get ( K :: TABLE , & buf) {
1116- Ok ( value) => {
1117- let slice = value. as_ref ( ) . map ( |v| v. as_ref ( ) ) ;
1118-
1119- if let Some ( mut slice) = slice {
1120- Ok ( Some ( V :: decode ( & mut slice) ?) )
1121- } else {
1122- Ok ( None )
1123- }
1124- }
1125- Err ( err) => Err ( err) ,
1126- }
1140+ self . get ( K :: TABLE , & buf) ?
1141+ . map ( |value| {
1142+ let mut slice = value. as_ref ( ) ;
1143+ StorageCodec :: decode ( & mut slice)
1144+ } )
1145+ . transpose ( )
1146+ . map_err ( |err| StorageError :: Generic ( err. into ( ) ) )
11271147 }
11281148
11291149 /// Forces a read from persistent storage, bypassing memtables and block cache.
0 commit comments