@@ -34,6 +34,7 @@ pub struct Metadata {
3434 term : TermMetadata ,
3535 seq : u64 ,
3636 params : Option < CommonParams > ,
37+ term_params : Option < CommonParams > ,
3738}
3839
3940impl Metadata {
@@ -45,6 +46,7 @@ impl Metadata {
4546 term : Default :: default ( ) ,
4647 seq : 0 ,
4748 params : None ,
49+ term_params : None ,
4850 }
4951 }
5052
@@ -93,6 +95,14 @@ impl Metadata {
9395 self . params = Some ( params) ;
9496 }
9597
98+ pub fn term_params ( & self ) -> Option < & CommonParams > {
99+ self . term_params . as_ref ( )
100+ }
101+
102+ pub fn snapshot_term_params ( & mut self ) {
103+ self . term_params = self . params ;
104+ }
105+
96106 pub fn increase_term_id ( & mut self , last_term_finished_block_num : u64 ) {
97107 assert ! ( self . term. last_term_finished_block_num < last_term_finished_block_num) ;
98108 self . term . last_term_finished_block_num = last_term_finished_block_num;
@@ -124,25 +134,33 @@ impl CacheableItem for Metadata {
124134
125135const PREFIX : u8 = super :: METADATA_PREFIX ;
126136
137+ const INITIAL_LEN : usize = 4 ;
138+ const TERM_LEN : usize = 2 ;
139+ const PARAMS_LEN : usize = 2 ;
140+ const TERM_PARAMS_LEN : usize = 1 ;
141+
127142impl Encodable for Metadata {
128143 fn rlp_append ( & self , s : & mut RlpStream ) {
129- const INITIAL_LEN : usize = 4 ;
130- const TERM_LEN : usize = 2 ;
131- const PARAMS_LEN : usize = 2 ;
132- let mut len = INITIAL_LEN ;
133-
134144 let term_changed = self . term != Default :: default ( ) ;
145+ let params_changed = self . seq != 0 ;
146+ let term_params_changed = self . term_params . is_some ( ) ;
147+
148+ let mut len = INITIAL_LEN ;
135149 if term_changed {
136150 len += TERM_LEN ;
137151 }
138-
139- let params_changed = self . seq != 0 ;
140152 if params_changed {
141153 if !term_changed {
142154 len += TERM_LEN ;
143155 }
144156 len += PARAMS_LEN ;
145157 }
158+ if term_params_changed {
159+ if !params_changed {
160+ panic ! ( "Term params only can be changed if params changed" ) ;
161+ }
162+ len += TERM_PARAMS_LEN ;
163+ }
146164 s. begin_list ( len)
147165 . append ( & PREFIX )
148166 . append ( & self . number_of_shards )
@@ -159,20 +177,27 @@ impl Encodable for Metadata {
159177 }
160178 s. append ( & self . seq ) . append ( self . params . as_ref ( ) . unwrap ( ) ) ;
161179 }
180+ if term_params_changed {
181+ if !params_changed {
182+ unreachable ! ( "Term params only can be changed if params changed" ) ;
183+ }
184+ s. append ( self . term_params . as_ref ( ) . unwrap ( ) ) ;
185+ }
162186 }
163187}
164188
165189impl Decodable for Metadata {
166190 fn decode ( rlp : & Rlp ) -> Result < Self , DecoderError > {
167- let ( term, seq, params) = match rlp. item_count ( ) ? {
168- 4 => ( TermMetadata :: default ( ) , 0 , None ) ,
191+ let ( term, seq, params, term_params ) = match rlp. item_count ( ) ? {
192+ 4 => ( TermMetadata :: default ( ) , 0 , None , None ) ,
169193 6 => (
170194 TermMetadata {
171195 last_term_finished_block_num : rlp. val_at ( 4 ) ?,
172196 current_term_id : rlp. val_at ( 5 ) ?,
173197 } ,
174198 0 ,
175199 None ,
200+ None ,
176201 ) ,
177202 8 => (
178203 TermMetadata {
@@ -181,6 +206,16 @@ impl Decodable for Metadata {
181206 } ,
182207 rlp. val_at ( 6 ) ?,
183208 Some ( rlp. val_at ( 7 ) ?) ,
209+ None ,
210+ ) ,
211+ 9 => (
212+ TermMetadata {
213+ last_term_finished_block_num : rlp. val_at ( 4 ) ?,
214+ current_term_id : rlp. val_at ( 5 ) ?,
215+ } ,
216+ rlp. val_at ( 6 ) ?,
217+ Some ( rlp. val_at ( 7 ) ?) ,
218+ Some ( rlp. val_at ( 8 ) ?) ,
184219 ) ,
185220 item_count => {
186221 return Err ( DecoderError :: RlpInvalidLength {
@@ -201,6 +236,7 @@ impl Decodable for Metadata {
201236 term,
202237 seq,
203238 params,
239+ term_params,
204240 } )
205241 }
206242}
@@ -266,6 +302,7 @@ mod tests {
266302 term : Default :: default ( ) ,
267303 seq : 0 ,
268304 params : None ,
305+ term_params : None ,
269306 } ;
270307 let mut rlp = RlpStream :: new_list ( 4 ) ;
271308 rlp. append ( & PREFIX ) . append ( & 10u16 ) . append ( & 1u16 ) . append_list :: < H256 , H256 > ( & [ ] ) ;
@@ -281,6 +318,7 @@ mod tests {
281318 term : Default :: default ( ) ,
282319 seq : 3 ,
283320 params : Some ( CommonParams :: default_for_test ( ) ) ,
321+ term_params : Some ( CommonParams :: default_for_test ( ) ) ,
284322 } ;
285323 rlp_encode_and_decode_test ! ( metadata) ;
286324 }
@@ -297,6 +335,7 @@ mod tests {
297335 } ,
298336 seq : 0 ,
299337 params : None ,
338+ term_params : None ,
300339 } ;
301340 rlp_encode_and_decode_test ! ( metadata) ;
302341 }
@@ -313,6 +352,24 @@ mod tests {
313352 } ,
314353 seq : 3 ,
315354 params : Some ( CommonParams :: default_for_test ( ) ) ,
355+ term_params : Some ( CommonParams :: default_for_test ( ) ) ,
356+ } ;
357+ rlp_encode_and_decode_test ! ( metadata) ;
358+ }
359+
360+ #[ test]
361+ fn metadata_with_term_and_seq_but_not_term_params ( ) {
362+ let metadata = Metadata {
363+ number_of_shards : 10 ,
364+ number_of_initial_shards : 1 ,
365+ hashes : vec ! [ ] ,
366+ term : TermMetadata {
367+ last_term_finished_block_num : 1 ,
368+ current_term_id : 100 ,
369+ } ,
370+ seq : 3 ,
371+ params : Some ( CommonParams :: default_for_test ( ) ) ,
372+ term_params : None ,
316373 } ;
317374 rlp_encode_and_decode_test ! ( metadata) ;
318375 }
0 commit comments