Line data Source code
1 : use bytes::BufMut;
2 : use pageserver_api::reltag::RelTag;
3 : use serde::Serialize;
4 : use utils::bin_ser::BeSer;
5 : use utils::lsn::Lsn;
6 :
7 : ///
8 : /// `RelTag` + block number (`blknum`) gives us a unique id of the page in the cluster.
9 : ///
10 : /// In Postgres `BufferTag` structure is used for exactly the same purpose.
11 : /// [See more related comments here](https://github.com/postgres/postgres/blob/99c5852e20a0987eca1c38ba0c09329d4076b6a0/src/include/storage/buf_internals.h#L91).
12 : ///
13 5199866 : #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Serialize)]
14 : pub(crate) struct BufferTag {
15 : pub rel: RelTag,
16 : pub blknum: u32,
17 : }
18 :
19 2342896 : pub(crate) fn build_begin_redo_for_block_msg(tag: BufferTag, buf: &mut Vec<u8>) {
20 2342896 : let len = 4 + 1 + 4 * 4;
21 2342896 :
22 2342896 : buf.put_u8(b'B');
23 2342896 : buf.put_u32(len as u32);
24 2342896 :
25 2342896 : tag.ser_into(buf)
26 2342896 : .expect("serialize BufferTag should always succeed");
27 2342896 : }
28 :
29 514074 : pub(crate) fn build_push_page_msg(tag: BufferTag, base_img: &[u8], buf: &mut Vec<u8>) {
30 514074 : assert!(base_img.len() == 8192);
31 :
32 514074 : let len = 4 + 1 + 4 * 4 + base_img.len();
33 514074 :
34 514074 : buf.put_u8(b'P');
35 514074 : buf.put_u32(len as u32);
36 514074 : tag.ser_into(buf)
37 514074 : .expect("serialize BufferTag should always succeed");
38 514074 : buf.put(base_img);
39 514074 : }
40 :
41 62162055 : pub(crate) fn build_apply_record_msg(endlsn: Lsn, rec: &[u8], buf: &mut Vec<u8>) {
42 62162055 : let len = 4 + 8 + rec.len();
43 62162055 :
44 62162055 : buf.put_u8(b'A');
45 62162055 : buf.put_u32(len as u32);
46 62162055 : buf.put_u64(endlsn.0);
47 62162055 : buf.put(rec);
48 62162055 : }
49 :
50 2342896 : pub(crate) fn build_get_page_msg(tag: BufferTag, buf: &mut Vec<u8>) {
51 2342896 : let len = 4 + 1 + 4 * 4;
52 2342896 :
53 2342896 : buf.put_u8(b'G');
54 2342896 : buf.put_u32(len as u32);
55 2342896 : tag.ser_into(buf)
56 2342896 : .expect("serialize BufferTag should always succeed");
57 2342896 : }
|