Skip to content
  • Klaus Post's avatar
    Improve performance on multiple versions (#13573) · faf013ec
    Klaus Post authored
    Existing:
    
    ```go
    type xlMetaV2 struct {
        Versions []xlMetaV2Version `json:"Versions" msg:"Versions"`
    }
    ```
    
    Serialized as regular MessagePack.
    
    ```go
    //msgp:tuple xlMetaV2VersionHeader
    type xlMetaV2VersionHeader struct {
    	VersionID [16]byte
    	ModTime   int64
    	Type      VersionType
    	Flags     xlFlags
    }
    ```
    
    Serialize as streaming MessagePack, format:
    
    ```
    int(headerVersion)
    int(xlmetaVersion)
    int(nVersions)
    for each version {
        binary blob, xlMetaV2VersionHeader, serialized
        binary blob, xlMetaV2Version, serialized.
    }
    ```
    
    xlMetaV2VersionHeader is <= 30 bytes serialized. Deserialized struct 
    can easily be reused and does not contain pointers, so efficient as a 
    slice (single allocation)
    
    This allows quickly parsing everything as slices of bytes (no copy).
    
    Versions are always *saved* sorted by modTime, newest *first*. 
    No more need to sort on load.
    
    * Allows checking if a version exists.
    * Allows reading single version without unmarshal all.
    * Allows reading latest version of type without unmarshal all.
    * Allows reading latest version without unmarshal of all.
    * Allows checking if the latest is deleteMarker by reading first entry.
    * Allows adding/updating/deleting a version with only header deserialization.
    * Reduces allocations on conversion to FileInfo(s).
    faf013ec