mirror of
https://github.com/ipfs/kubo.git
synced 2025-10-19 20:53:04 +08:00
unixfs: integrate pb.Data
into FSNode
To avoid duplicating fields and making the code easier to follow. Remove all of `FSNode` previous fields in favor on a single `pb.Data` structure that is not exported. Accessor methods are added only for the necessary internal fields. This takes up more memory, `pb.Data` is always created inside `FSNode` and it stays there instead of just being created and destroyed during the (un)marshal operations. The removed fields `Data`, `blocksizes` and `Type` had a direct counterpart in the embedded `pb.Data` structure, in contrast (only) the `subtotal` field doesn't have one, it was used as a temporary accumulator to track the `Filesize`, which is now being kept updated on every modification (to ensure the entire `FSNode` is always at a valid state), so `subtotal` could just be removed without the addition of any other field (this temporary accumulator was obscuring how `Filesize` was computed). To keep `Filesize` up to date a method was added (`UpdateFilesize()`) to adjust its value in the two places where the file size could be modified, when changing its data (in `SetData()`, accessor method added) and when adding or removing child nodes (in `AddBlockSize()` and `RemoveBlockSize()`). A constructor method was added (`NewFSNode()`) to initialize the required fields, like `Type` which is explicitly set, this deprecates the previous methodology of just calling `new(FSNode)` and relying in the default value of `pb.Data_DataType` (`Data_Raw`) to avoid an explicit assignment. Also, `Filesize` is initialized to avoid being left with a `nil` value before marshaling empty nodes, which would result in a different hash from previous versions, to be backwards compatible. Previous versions of `GetBytes()` always set the `Filesize` value, even though it is reflected as an `optional` field in the `.proto` file (this may be an inaccurate field rule). Without the duplicated fields the functions `GetBytes()` and `FSNodeFromBytes()` are now reduced to simple `Marshal()` and `Unmarshal()` operations respectively. License: MIT Signed-off-by: Lucas Molas <schomatis@gmail.com>
This commit is contained in:
@ -10,14 +10,13 @@ import (
|
||||
)
|
||||
|
||||
func TestFSNode(t *testing.T) {
|
||||
fsn := new(FSNode)
|
||||
fsn.Type = TFile
|
||||
fsn := NewFSNode(TFile)
|
||||
for i := 0; i < 16; i++ {
|
||||
fsn.AddBlockSize(100)
|
||||
}
|
||||
fsn.RemoveBlockSize(15)
|
||||
|
||||
fsn.Data = make([]byte, 128)
|
||||
fsn.SetData(make([]byte, 128))
|
||||
|
||||
b, err := fsn.GetBytes()
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user