Skip to content

Commit b1a7d02

Browse files
committed
Add term_params to Metadata
`term_params` should be snapshot every `on_term_close`
1 parent c7ec6ae commit b1a7d02

File tree

1 file changed

+66
-9
lines changed

1 file changed

+66
-9
lines changed

state/src/item/metadata.rs

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub struct Metadata {
3434
term: TermMetadata,
3535
seq: u64,
3636
params: Option<CommonParams>,
37+
term_params: Option<CommonParams>,
3738
}
3839

3940
impl 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

125135
const 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+
127142
impl 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

165189
impl 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

Comments
 (0)