REVERT ME. Add unlink test and a bunch of debug printlns

This commit is contained in:
anastasia
2021-09-01 18:28:51 +03:00
parent 8c46178256
commit 5e91d15f06
5 changed files with 130 additions and 22 deletions

View File

@@ -583,7 +583,7 @@ impl Timeline for LayeredTimeline {
}
fn list_rels(&self, spcnode: u32, dbnode: u32, lsn: Lsn) -> Result<HashSet<RelTag>> {
trace!("list_rels called at {}", lsn);
println!("list_rels called at {}", lsn);
// List all rels in this timeline, and all its ancestors.
let mut all_rels = HashSet::new();
@@ -987,7 +987,7 @@ impl LayeredTimeline {
if prev_layer.get_timeline_id() != self.timelineid {
// First modification on this timeline
start_lsn = self.ancestor_lsn;
trace!(
println!(
"creating file for write for {} at branch point {}/{}",
seg,
self.timelineid,
@@ -995,14 +995,14 @@ impl LayeredTimeline {
);
} else {
start_lsn = prev_layer.get_end_lsn();
trace!(
println!(
"creating file for write for {} after previous layer {}/{}",
seg,
self.timelineid,
start_lsn
);
}
trace!(
println!(
"prev layer is at {}/{} - {}",
prev_layer.get_timeline_id(),
prev_layer.get_start_lsn(),
@@ -1018,7 +1018,7 @@ impl LayeredTimeline {
)?;
} else {
// New relation.
trace!(
println!(
"creating layer for write for new rel {} at {}/{}",
seg,
self.timelineid,
@@ -1030,6 +1030,7 @@ impl LayeredTimeline {
}
let mut layers = self.layers.lock().unwrap();
println!("before layers.insert_open {:?}", layer.filename());
let layer_rc: Arc<InMemoryLayer> = Arc::new(layer);
layers.insert_open(Arc::clone(&layer_rc));
@@ -1090,7 +1091,7 @@ impl LayeredTimeline {
prev: prev_record_lsn,
} = self.last_record_lsn.load();
trace!(
println!(
"checkpointing timeline {} at {}",
self.timelineid,
last_record_lsn

View File

@@ -241,8 +241,8 @@ impl Layer for InMemoryLayer {
.unwrap_or_default();
println!(
"----- in-memory layer for {} {}-{} ----",
self.seg, self.start_lsn, end_str
"----- in-memory layer for tli {} seg {} {}-{} ----",
self.timelineid, self.seg, self.start_lsn, end_str
);
for (k, v) in inner.segsizes.iter() {
@@ -273,7 +273,7 @@ impl InMemoryLayer {
start_lsn: Lsn,
oldest_pending_lsn: Lsn,
) -> Result<InMemoryLayer> {
trace!(
println!(
"initializing new empty InMemoryLayer for writing {} on timeline {} at {}",
seg,
timelineid,
@@ -327,7 +327,7 @@ impl InMemoryLayer {
pub fn put_page_version(&self, blknum: u32, lsn: Lsn, pv: PageVersion) -> Result<()> {
assert!(self.seg.blknum_in_seg(blknum));
trace!(
println!(
"put_page_version blk {} of {} at {}/{}",
blknum,
self.seg.rel,
@@ -354,7 +354,7 @@ impl InMemoryLayer {
// which we've just acquired above
let oldsize = inner.get_seg_size(lsn);
if newsize > oldsize {
trace!(
println!(
"enlarging segment {} from {} to {} blocks at {}",
self.seg,
oldsize,
@@ -388,7 +388,35 @@ impl InMemoryLayer {
assert!(inner.drop_lsn.is_none());
inner.drop_lsn = Some(lsn);
info!("dropped segment {} at {}", self.seg, lsn);
println!("dropped segment {} at {}", self.seg, lsn);
let end_str = inner
.drop_lsn
.as_ref()
.map(|drop_lsn| drop_lsn.to_string())
.unwrap_or_default();
{
let mut result = format!(
"----- inmemory layer tli {} for {} {}-{} ----\n",
self.timelineid, self.seg, self.start_lsn, end_str
);
for (k, v) in inner.segsizes.iter() {
result += &format!("{}: {}\n", k, v);
}
for (k, v) in inner.page_versions.iter() {
result += &format!(
"blk {} at {}: {}/{}\n",
k.0,
k.1,
v.page_image.is_some(),
v.record.is_some()
);
}
println!("{}", result);
}
Ok(())
}
@@ -407,7 +435,7 @@ impl InMemoryLayer {
) -> Result<InMemoryLayer> {
let seg = src.get_seg_tag();
trace!(
println!(
"initializing new InMemoryLayer for writing {} on timeline {} at {}",
seg,
timelineid,
@@ -457,7 +485,7 @@ impl InMemoryLayer {
// This is needed just to call materialize_page()
timeline: &LayeredTimeline,
) -> Result<(Vec<Arc<dyn Layer>>, Option<Arc<InMemoryLayer>>)> {
info!(
println!(
"freezing in memory layer for {} on timeline {} at {}",
self.seg, self.timelineid, cutoff_lsn
);
@@ -533,7 +561,7 @@ impl InMemoryLayer {
)?;
let delta_layer_rc: Arc<dyn Layer> = Arc::new(delta_layer);
frozen_layers.push(delta_layer_rc);
trace!(
println!(
"freeze: created delta layer {} {}-{}",
self.seg,
self.start_lsn,
@@ -549,7 +577,7 @@ impl InMemoryLayer {
let imgfile = ImageLayer::create_from_src(self.conf, timeline, self, end_lsn)?;
let imgfile_rc: Arc<dyn Layer> = Arc::new(imgfile);
frozen_layers.push(Arc::clone(&imgfile_rc));
trace!("freeze: created image layer {} at {}", self.seg, end_lsn);
println!("freeze: created image layer {} at {}", self.seg, end_lsn);
// If there were any page versions newer than the cutoff, initialize a new in-memory
// layer to hold them
@@ -566,7 +594,7 @@ impl InMemoryLayer {
new_inner.page_versions.append(&mut after_page_versions);
new_inner.segsizes.append(&mut after_segsizes);
drop(new_inner);
trace!("freeze: created new in-mem layer {} {}-", self.seg, end_lsn);
println!("freeze: created new in-mem layer {} {}-", self.seg, end_lsn);
new_open_rc = Some(Arc::new(new_open))
}
@@ -578,13 +606,22 @@ impl InMemoryLayer {
/// debugging function to print out the contents of the layer
#[allow(unused)]
pub fn dump(&self) -> String {
let mut result = format!(
"----- inmemory layer for {} {}-> ----\n",
self.seg, self.start_lsn
);
let inner = self.inner.lock().unwrap();
let end_str = inner
.drop_lsn
.as_ref()
.map(|drop_lsn| drop_lsn.to_string())
.unwrap_or_default();
let mut result = format!(
"----- dump inmemory layer for tli {} seg {} {}-{} ----",
self.timelineid, self.seg, self.start_lsn, end_str
);
for (k, v) in inner.segsizes.iter() {
result += &format!("{}: {}\n", k, v);
}
@@ -598,6 +635,8 @@ impl InMemoryLayer {
);
}
println!("inner println {}", result);
result
}
}

View File

@@ -149,6 +149,7 @@ impl LayerMap {
if let Some(segentry) = self.segs.get_mut(&tag) {
if let Some(_old) = &segentry.open {
// FIXME: shouldn't exist, but check
println!("insert_open() // FIXME: shouldn't exist, but check");
}
segentry.open = Some(Arc::clone(&layer));
} else {
@@ -220,6 +221,8 @@ impl LayerMap {
pub fn list_rels(&self, spcnode: u32, dbnode: u32, lsn: Lsn) -> Result<HashSet<RelTag>> {
let mut rels: HashSet<RelTag> = HashSet::new();
println!("layer list_rels()");
for (seg, segentry) in self.segs.iter() {
if let RelishTag::Relation(reltag) = seg.rel {
if (spcnode == 0 || reltag.spcnode == spcnode)
@@ -227,16 +230,32 @@ impl LayerMap {
{
// Add only if it exists at the requested LSN.
if let Some(open) = &segentry.open {
println!("explore segentry.open {:?}", open.filename());
if open.get_end_lsn() > lsn && open.get_start_lsn() <= lsn {
rels.insert(reltag);
println!("found rel {} at lsn {} in open layer start_lsn {} end lsn {}",
reltag, lsn, open.get_start_lsn(), open.get_end_lsn());
println!("{}", open.dump());
}
else
{
println!("found DROPPED rel {} at lsn {} in open layer start_lsn {} end lsn {}",
reltag, lsn, open.get_start_lsn(), open.get_end_lsn());
println!("{}", open.dump());
}
} else if let Some((l_start_lsn, layer)) = segentry
.historic
.range((Included(Lsn(0)), Included(lsn)))
.next_back()
{
println!("explore historic segment {:?}", layer.filename());
if !layer.is_dropped() && l_start_lsn <= &lsn {
rels.insert(reltag);
println!("found rel {} in historic layer", reltag);
layer.dump()?;
}
}
}

View File

@@ -24,7 +24,7 @@ pub fn init_logging(
if record.level().is_at_least(slog::Level::Info) {
return true;
}
false
true
});
let drain = std::sync::Mutex::new(drain).fuse();
let logger = slog::Logger::root(

View File

@@ -228,6 +228,8 @@ mod tests {
forknum: 0,
});
const TESTDB: u32 = 111;
/// Convenience function to create a page image with given string as the only content
#[allow(non_snake_case)]
fn TEST_IMG(s: &str) -> Bytes {
@@ -416,6 +418,53 @@ mod tests {
Ok(())
}
///
/// Test list_rels() function, with branches and unlinking
///
#[test]
fn test_list_rels_and_unlink() -> Result<()> {
let repo = get_test_repo("test_unlink")?;
let timelineid = ZTimelineId::from_str("11223344556677881122334455667788").unwrap();
let tline = repo.create_empty_timeline(timelineid, Lsn(0x00))?;
// Import initial dummy checkpoint record, otherwise the get_timeline() call
// after branching fails below
tline.put_page_image(RelishTag::Checkpoint, 0, Lsn(0x10), ZERO_PAGE.clone())?;
// Create a relation on the timeline
tline.put_page_image(TESTREL_A, 0, Lsn(0x20), TEST_IMG("foo blk 0 at 2"))?;
// Check that list_rels() lists it after LSN 2, but no before it.
let reltag = match TESTREL_A {
RelishTag::Relation(reltag) => reltag,
_ => panic!("unexpected relish")
};
assert!(!tline.list_rels(0, TESTDB, Lsn(0x10))?.contains(&reltag));
assert!(tline.list_rels(0, TESTDB, Lsn(0x20))?.contains(&reltag));
assert!(tline.list_rels(0, TESTDB, Lsn(0x30))?.contains(&reltag));
// Create a branch, check that the relation is visible there
let newtimelineid = ZTimelineId::from_str("AA223344556677881122334455667788").unwrap();
repo.branch_timeline(timelineid, newtimelineid, Lsn(0x30))?;
let newtline = repo.get_timeline(newtimelineid)?;
assert!(newtline.list_rels(0, TESTDB, Lsn(0x30))?.contains(&reltag));
// Unlink it on the branch
newtline.drop_relish(TESTREL_A, Lsn(0x40))?;
// Check that it's no longer listed on the branch after the point where it was unlinked
assert!(newtline.list_rels(0, TESTDB, Lsn(0x30))?.contains(&reltag));
assert!(!newtline.list_rels(0, TESTDB, Lsn(0x40))?.contains(&reltag));
// Run checkpoint and garbage collection and check that it's still not visible
newtline.checkpoint()?;
repo.gc_iteration(Some(newtimelineid), 0, true)?;
assert!(!newtline.list_rels(0, TESTDB, Lsn(0x40))?.contains(&reltag));
Ok(())
}
///
/// Test branch creation
///