-
Notifications
You must be signed in to change notification settings - Fork 460
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pageserver: move things around to prepare for decoding logic (#9504)
## Problem We wish to have high level WAL decoding logic in `wal_decoder::decoder` module. ## Summary of Changes For this we need the `Value` and `NeonWalRecord` types accessible there, so: 1. Move `Value` and `NeonWalRecord` to `pageserver::value` and `pageserver::record` respectively. 2. Get rid of `pageserver::repository` (follow up from (1)) 3. Move PG specific WAL record types to `postgres_ffi::walrecord`. In theory they could live in `wal_decoder`, but it would create a circular dependency between `wal_decoder` and `postgres_ffi`. Long term it makes sense for those types to be PG version specific, so that will work out nicely. 4. Move higher level WAL record types (to be ingested by pageserver) into `wal_decoder::models` Related: #9335 Epic: #9329
- Loading branch information
Showing
45 changed files
with
1,024 additions
and
905 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
//! This module defines the WAL record format used within the pageserver. | ||
use bytes::Bytes; | ||
use postgres_ffi::walrecord::{describe_postgres_wal_record, MultiXactMember}; | ||
use postgres_ffi::{MultiXactId, MultiXactOffset, TimestampTz, TransactionId}; | ||
use serde::{Deserialize, Serialize}; | ||
use utils::bin_ser::DeserializeError; | ||
|
||
/// Each update to a page is represented by a NeonWalRecord. It can be a wrapper | ||
/// around a PostgreSQL WAL record, or a custom neon-specific "record". | ||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] | ||
pub enum NeonWalRecord { | ||
/// Native PostgreSQL WAL record | ||
Postgres { will_init: bool, rec: Bytes }, | ||
|
||
/// Clear bits in heap visibility map. ('flags' is bitmap of bits to clear) | ||
ClearVisibilityMapFlags { | ||
new_heap_blkno: Option<u32>, | ||
old_heap_blkno: Option<u32>, | ||
flags: u8, | ||
}, | ||
/// Mark transaction IDs as committed on a CLOG page | ||
ClogSetCommitted { | ||
xids: Vec<TransactionId>, | ||
timestamp: TimestampTz, | ||
}, | ||
/// Mark transaction IDs as aborted on a CLOG page | ||
ClogSetAborted { xids: Vec<TransactionId> }, | ||
/// Extend multixact offsets SLRU | ||
MultixactOffsetCreate { | ||
mid: MultiXactId, | ||
moff: MultiXactOffset, | ||
}, | ||
/// Extend multixact members SLRU. | ||
MultixactMembersCreate { | ||
moff: MultiXactOffset, | ||
members: Vec<MultiXactMember>, | ||
}, | ||
/// Update the map of AUX files, either writing or dropping an entry | ||
AuxFile { | ||
file_path: String, | ||
content: Option<Bytes>, | ||
}, | ||
|
||
/// A testing record for unit testing purposes. It supports append data to an existing image, or clear it. | ||
#[cfg(feature = "testing")] | ||
Test { | ||
/// Append a string to the image. | ||
append: String, | ||
/// Clear the image before appending. | ||
clear: bool, | ||
/// Treat this record as an init record. `clear` should be set to true if this field is set | ||
/// to true. This record does not need the history WALs to reconstruct. See [`NeonWalRecord::will_init`] and | ||
/// its references in `timeline.rs`. | ||
will_init: bool, | ||
}, | ||
} | ||
|
||
impl NeonWalRecord { | ||
/// Does replaying this WAL record initialize the page from scratch, or does | ||
/// it need to be applied over the previous image of the page? | ||
pub fn will_init(&self) -> bool { | ||
// If you change this function, you'll also need to change ValueBytes::will_init | ||
match self { | ||
NeonWalRecord::Postgres { will_init, rec: _ } => *will_init, | ||
#[cfg(feature = "testing")] | ||
NeonWalRecord::Test { will_init, .. } => *will_init, | ||
// None of the special neon record types currently initialize the page | ||
_ => false, | ||
} | ||
} | ||
|
||
#[cfg(feature = "testing")] | ||
pub fn wal_append(s: impl AsRef<str>) -> Self { | ||
Self::Test { | ||
append: s.as_ref().to_string(), | ||
clear: false, | ||
will_init: false, | ||
} | ||
} | ||
|
||
#[cfg(feature = "testing")] | ||
pub fn wal_clear() -> Self { | ||
Self::Test { | ||
append: "".to_string(), | ||
clear: true, | ||
will_init: false, | ||
} | ||
} | ||
|
||
#[cfg(feature = "testing")] | ||
pub fn wal_init() -> Self { | ||
Self::Test { | ||
append: "".to_string(), | ||
clear: true, | ||
will_init: true, | ||
} | ||
} | ||
} | ||
|
||
/// Build a human-readable string to describe a WAL record | ||
/// | ||
/// For debugging purposes | ||
pub fn describe_wal_record(rec: &NeonWalRecord) -> Result<String, DeserializeError> { | ||
match rec { | ||
NeonWalRecord::Postgres { will_init, rec } => Ok(format!( | ||
"will_init: {}, {}", | ||
will_init, | ||
describe_postgres_wal_record(rec)? | ||
)), | ||
_ => Ok(format!("{:?}", rec)), | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
07b9744
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
5362 tests run: 5129 passed, 1 failed, 232 skipped (full report)
Failures on Postgres 16
test_compaction_l0_memory[github-actions-selfhosted]
: release-x86-64Code coverage* (full report)
functions
:31.3% (7682 of 24572 functions)
lines
:48.7% (60384 of 123980 lines)
* collected from Rust tests only
07b9744 at 2024-10-29T11:33:31.314Z :recycle: