Skip to main content

loonfs_core/commit/
plan.rs

1//! [`CommitPlan`]: the output of validation — every op checked and
2//! resolved, ready to materialize into WAL deltas.
3
4#[cfg(test)]
5use crate::metadata::MetadataState;
6#[cfg(test)]
7use loonfs_api::wire::control::HeadState;
8use loonfs_api::{
9    ChangeSeq, CommitId, ContentRef, DisplayName, InodeId, NameKey, NamespaceId, RevisionNo,
10};
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct CommitPlan {
15    pub namespace_id: NamespaceId,
16    pub commit_id: CommitId,
17    pub apply_after_seq: ChangeSeq,
18    pub assigned_seq: ChangeSeq,
19    pub(crate) validated_ops: Vec<ValidatedOp>,
20    pub resulting_next_inode_id: InodeId,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
24pub struct ResolvedBinding {
25    pub parent_inode_id: InodeId,
26    pub name_key: NameKey,
27    pub display_name: DisplayName,
28    pub child_inode_id: InodeId,
29    pub bind_seq: ChangeSeq,
30    pub bind_delta_index: u32,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub(crate) enum ValidatedOp {
35    CreateDir {
36        op_index: u32,
37        parent_inode_id: InodeId,
38        display_name: DisplayName,
39        name_key: NameKey,
40        child_inode_id: InodeId,
41        create_inode_delta_index: u32,
42        bind_delta_index: u32,
43    },
44    CreateFile {
45        op_index: u32,
46        parent_inode_id: InodeId,
47        display_name: DisplayName,
48        name_key: NameKey,
49        child_inode_id: InodeId,
50        content_ref: ContentRef,
51        create_inode_delta_index: u32,
52        bind_delta_index: u32,
53        revision_delta_index: u32,
54    },
55    ReplaceFile {
56        op_index: u32,
57        inode_id: InodeId,
58        revision_no: RevisionNo,
59        content_ref: ContentRef,
60        revision_delta_index: u32,
61    },
62    RestoreRevision {
63        op_index: u32,
64        inode_id: InodeId,
65        source_revision_no: RevisionNo,
66        revision_no: RevisionNo,
67        content_ref: ContentRef,
68        revision_delta_index: u32,
69    },
70    DeleteFile {
71        op_index: u32,
72        inode_id: InodeId,
73        source_binding: ResolvedBinding,
74        unbind_delta_index: u32,
75        tombstone_delta_index: u32,
76    },
77    Rename {
78        op_index: u32,
79        inode_id: InodeId,
80        source_binding: ResolvedBinding,
81        new_parent_inode_id: InodeId,
82        new_display_name: DisplayName,
83        new_name_key: NameKey,
84        unbind_delta_index: u32,
85        bind_delta_index: u32,
86    },
87    DeleteSubtree {
88        op_index: u32,
89        root_inode_id: InodeId,
90        source_binding: ResolvedBinding,
91        unbind_delta_index: u32,
92        tombstone_delta_index: u32,
93    },
94    Undelete {
95        op_index: u32,
96        inode_id: InodeId,
97        parent_inode_id: InodeId,
98        display_name: DisplayName,
99        name_key: NameKey,
100        /// The exact deletion generation validation resolved and pinned:
101        /// the active tombstone's own event coordinates.
102        target_seq: ChangeSeq,
103        target_delta_index: u32,
104        revoke_tombstone_delta_index: u32,
105        bind_delta_index: u32,
106    },
107}
108
109/// The base state a store-free validation pass runs against.
110#[cfg(test)]
111#[derive(Debug, Clone)]
112pub(crate) struct CommitValidationContext<'a> {
113    pub head: HeadState,
114    pub metadata_state: &'a MetadataState,
115}