Basic partition indexing system
parent
8c59e825f8
commit
b25983dcd6
|
@ -24,19 +24,22 @@ It's identified simply by numerical order.
|
|||
const BOOT_SIZE: u64; // How large the BOOT partition will be
|
||||
const LABEL_SIZE: u64; // Number of characters that can be used in the partition label
|
||||
|
||||
let NUM_CHUNLKS: u64; // Number of chunks in a specific partition
|
||||
struct PartitionHeader {
|
||||
boot: bool, // Boot flag
|
||||
label: [char; LABEL_SIZE], // Human-readable label. Not UTF-8 though :/
|
||||
num_chunks: u64, // Chunks in this partition
|
||||
index: [(u64, Uuid); NUM_CHUNKS], // Array of tuples mapping Actor UUID's to chunk indexes
|
||||
// TODO: What if a Uuid is on multiple chunks?
|
||||
num_chunks: NUM_CHUNKS, // Chunks in this partition
|
||||
}
|
||||
```
|
||||
|
||||
### Chunk
|
||||
Small pieces that each partition is split into.
|
||||
Contains fixed-length metadata (checksum, extension flag, uuid) at the beginning, and then arbitrary data afterwards.
|
||||
Contains fixed-length metadata (checksum, extension flag) at the beginning, and then arbitrary data afterwards.
|
||||
If the saved data exceeds past a single chunk, the `extends` flag is set.
|
||||
|
||||
Additionally, it has a **UUID** generated via [lolid](https://lib.rs/crates/lolid) to enable identifying a specific chunk.
|
||||
<!-- Additionally, it has a **UUID** generated via [lolid](https://lib.rs/crates/lolid) to enable identifying a specific chunk. -->
|
||||
|
||||
```rust
|
||||
const CHUNK_SIZE: u64; // Example static chunk size
|
||||
|
@ -45,7 +48,6 @@ struct ChunkHeader {
|
|||
checksum: u64,
|
||||
extends: bool,
|
||||
encrypted: bool,
|
||||
uuid: Uuid,
|
||||
modified: u64, // Timestamp of last modified
|
||||
}
|
||||
|
||||
|
@ -75,6 +77,7 @@ Basically, `part1_offset = BOOT_PARTITION_SIZE`, `part1_data_start = part1_offse
|
|||
### Writing
|
||||
Writing uses a similar process. An *Actor* can request to write data. If it has proper capabilties, we serialize the data, allocate a free chunk[^free_chunk], and write to it.
|
||||
We *hash* the data first to generate a checksum, and set proper metadata if the data extends past the `CHUNK_SIZE`.
|
||||
Then the `ParitionHeader` *index* is updated to contain the new chunk(s) being used.
|
||||
|
||||
### Permissions
|
||||
Again, whether actors can:
|
||||
|
@ -116,6 +119,6 @@ struct PackedExecutable {
|
|||
|
||||
[^encryption]: Specific details to be figured out later
|
||||
|
||||
[^find_chunk]: Currently via magic. I have no idea how to do this other than a simple search. Maybe generate an index, or use a **UUID**?
|
||||
[^find_chunk]: The `PartitionHeader` has a tuple `(Uuid, u64)` which maps each `Actor` to a chunk number, allowing for easy finding of a specific chunk from an actor-provided `Uuid`.
|
||||
|
||||
[^free_chunk]: Again, no idea how.
|
||||
[^free_chunk]: Because we know which chunks are used, we know which ones aren't.
|
||||
|
|
Loading…
Reference in New Issue