ops: set provenance and timestamp on delete and rename tombstones
delete_node and rename_node were cloning the previous node version for the tombstone/rename entry without updating provenance or timestamp. This made it impossible to tell who deleted a node or when — the tombstone just inherited whatever the last write had. Now both operations derive provenance from POC_PROVENANCE env var (same as upsert) and set timestamp to now. Co-Authored-By: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
81fec99767
commit
199c415cf2
1 changed files with 14 additions and 0 deletions
|
|
@ -76,11 +76,17 @@ impl Store {
|
||||||
let _lock = StoreLock::acquire()?;
|
let _lock = StoreLock::acquire()?;
|
||||||
self.refresh_nodes()?;
|
self.refresh_nodes()?;
|
||||||
|
|
||||||
|
let prov = Provenance::from_env()
|
||||||
|
.map(|p| p.label().to_string())
|
||||||
|
.unwrap_or_else(|| "manual".to_string());
|
||||||
|
|
||||||
let node = self.nodes.get(key)
|
let node = self.nodes.get(key)
|
||||||
.ok_or_else(|| format!("No node '{}'", key))?;
|
.ok_or_else(|| format!("No node '{}'", key))?;
|
||||||
let mut deleted = node.clone();
|
let mut deleted = node.clone();
|
||||||
deleted.deleted = true;
|
deleted.deleted = true;
|
||||||
deleted.version += 1;
|
deleted.version += 1;
|
||||||
|
deleted.provenance = prov;
|
||||||
|
deleted.timestamp = now_epoch();
|
||||||
self.append_nodes_unlocked(std::slice::from_ref(&deleted))?;
|
self.append_nodes_unlocked(std::slice::from_ref(&deleted))?;
|
||||||
self.nodes.remove(key);
|
self.nodes.remove(key);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -109,15 +115,23 @@ impl Store {
|
||||||
.ok_or_else(|| format!("No node '{}'", old_key))?
|
.ok_or_else(|| format!("No node '{}'", old_key))?
|
||||||
.clone();
|
.clone();
|
||||||
|
|
||||||
|
let prov = Provenance::from_env()
|
||||||
|
.map(|p| p.label().to_string())
|
||||||
|
.unwrap_or_else(|| "manual".to_string());
|
||||||
|
|
||||||
// New version under the new key
|
// New version under the new key
|
||||||
let mut renamed = node.clone();
|
let mut renamed = node.clone();
|
||||||
renamed.key = new_key.to_string();
|
renamed.key = new_key.to_string();
|
||||||
renamed.version += 1;
|
renamed.version += 1;
|
||||||
|
renamed.provenance = prov.clone();
|
||||||
|
renamed.timestamp = now_epoch();
|
||||||
|
|
||||||
// Deletion record for the old key (same UUID, independent version counter)
|
// Deletion record for the old key (same UUID, independent version counter)
|
||||||
let mut tombstone = node.clone();
|
let mut tombstone = node.clone();
|
||||||
tombstone.deleted = true;
|
tombstone.deleted = true;
|
||||||
tombstone.version += 1;
|
tombstone.version += 1;
|
||||||
|
tombstone.provenance = prov;
|
||||||
|
tombstone.timestamp = now_epoch();
|
||||||
|
|
||||||
// Collect affected relations and update their debug key strings
|
// Collect affected relations and update their debug key strings
|
||||||
let updated_rels: Vec<_> = self.relations.iter()
|
let updated_rels: Vec<_> = self.relations.iter()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue