• v0.5.5 a22988d556

    MyFSIO v0.5.5 Beta Pre-Release

    kqjy released this 2026-07-02 07:38:11 +00:00 | 14 commits to main since this release

    Highlights

    This release introduces a new completed-multipart storage layout that makes CompleteMultipartUpload an O(metadata) operation on any filesystem, alongside a round of UI security hardening (XSS fixes), observability corrections, and object-browser reliability fixes.

    New Features

    Segment-based multipart object layout (MULTIPART_OBJECT_LAYOUT=segments, now the default)

    • Completed multipart objects are stored as immutable per-part segment files with a sparse stub at the object's key path, instead of concatenating all parts into a single file.
    • CompleteMultipartUpload becomes an O(metadata) operation — no full-object copy — so large multipart completes are fast on any filesystem.
    • Enables zero-copy versioned overwrites.
    • All read paths are layout-aware: GET, Range GET, partNumber GET, server-side copy, replication, and S3 Select all transparently handle both the new segments layout and the legacy concat layout.
    • CompleteMultipartUpload now returns x-amz-version-id.
    • Garbage collection sweeps orphaned segment directories (GC_SEGMENT_MAX_AGE_HOURS, default 24).

    Compatibility note: Only new completes use the segments layout; existing objects are untouched and readers handle both layouts indefinitely. Set MULTIPART_OBJECT_LAYOUT=concat to retain the legacy single-file assembly. Older server binaries cannot read segments-layout objects — upgrade all nodes before enabling.

    Security

    • Fixed UI cross-site scripting (XSS) vulnerabilities:
      • Corrected a no-op escapeHtml helper that was failing to escape output.
      • Closed a JSON-island <script> breakout in embedded page data.
      • Swept the remaining json_encode | safe template patterns.
    • Vendored Chart.js locally instead of loading it from a third-party origin.

    Improvements

    • Cluster resilience: Cluster overview auto-refresh now recovers after peer outages via a shared PollingManager, and offline-peer cards recover instead of staying stuck.
    • Scan pollers back off and retry instead of giving up with stale failure counters.
    • Static assets: ETags are memoized with vendor caching for cheaper conditional responses.
    • Object browser: Object timestamp display is now unified across the browser UI, and folder navigation syncs to a ?prefix= URL for deep links and working back/forward navigation.
    • Chart.js load failures are now surfaced to the user instead of failing silently.

    Bug Fixes

    • GC freed-bytes accounting: GC now emits an accurate total_bytes_freed and counts quarantined files, fixing a persistent undercount.
    • Object browser virtualizer: Fixed folder-checkbox selection desyncing on scroll, and the virtual list now measures actual row height instead of hardcoding 53px.
    • Removed dead bucket-detail modules and hardened poller guards and the Connections edit/refresh flow.

    Configuration

    Variable Default Description
    MULTIPART_OBJECT_LAYOUT segments Completed MPU storage layout: segments (immutable part segments + sparse stub) or concat (legacy single-file assembly). Affects new completes only.
    GC_SEGMENT_MAX_AGE_HOURS 24 Age before orphaned multipart segment directories are GC-swept.
    Downloads