aboutsummaryrefslogtreecommitdiffstats
path: root/src/access
diff options
context:
space:
mode:
Diffstat (limited to 'src/access')
-rw-r--r--src/access/screen.rs8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/access/screen.rs b/src/access/screen.rs
index b1318ea..3ea03e0 100644
--- a/src/access/screen.rs
+++ b/src/access/screen.rs
@@ -147,8 +147,9 @@ impl Screening {
/// Whether `doc` holds a policy, known or not, or did since this node took it up:
/// then what it receives is judged (`apply`), each change by the policy at its
/// dependencies, though the policy is gone or unknown now; changes written under it
- /// may still come. Not across a restart: a node that starts with no policy in its
- /// document judges as one that never had one.
+ /// may still come. Kept across a swap of the document (a drop, a switch, a rejoin,
+ /// `of`); not across a restart: a node that starts with no policy in its document
+ /// judges as one that never had one.
pub(crate) fn policed(&mut self, doc: &Document) -> bool {
self.policed |= !matches!(super::policy::of(doc), super::policy::Policy::Open);
self.policed
@@ -156,9 +157,12 @@ impl Screening {
pub(crate) fn of(&mut self, epoch_seq: u32) -> &mut Self {
if self.epoch_seq != epoch_seq {
+ // The root pin and whether a policy was held go on; what belongs to the old
+ // document (changes waiting, refusals, drops held) doesn't.
*self = Screening {
epoch_seq,
root_pin: std::mem::take(&mut self.root_pin),
+ policed: self.policed,
..Screening::default()
};
}