// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.minfs;

using zx;

// Describes metrics about the running Minfs instance.
struct Metrics {
    uint64 create_calls;
    uint64 create_calls_success;
    uint64 create_ticks;

    uint64 read_calls;
    uint64 read_size;
    uint64 read_ticks;

    uint64 write_calls;
    uint64 write_size;
    uint64 write_ticks;

    uint64 truncate_calls;
    uint64 truncate_ticks;

    uint64 unlink_calls;
    uint64 unlink_calls_success;
    uint64 unlink_ticks;

    uint64 rename_calls;
    uint64 rename_calls_success;
    uint64 rename_ticks;

    // Minfs initializes entire VMOs at once.
    // The following fields track this information.

    uint64 initialized_vmos;
    uint32 init_dnum_count; // Top-level direct blocks only
    uint32 init_inum_count; // Top-level indirect blocks only
    uint32 init_dinum_count;
    uint64 init_user_data_size;
    uint64 init_user_data_ticks;

    // Minfs looks up Vnodes by ino internally (using "VnodeGet").
    // The following fields track this information.

    uint64 vnodes_opened;
    uint64 vnodes_opened_cache_hit;
    uint64 vnode_open_ticks;

    // Minfs may look up Vnodes by name (using "LookupInternal").
    // The following fields track this information.

    uint64 lookup_calls;
    uint64 lookup_calls_success;
    uint64 lookup_ticks;
};

[Layout="Simple"]
interface Minfs {
    // Acquires metrics about the currently running filesystem.
    GetMetrics() -> (zx.status status, Metrics? metrics);

    // Toggle the metrics collection system on or off.
    ToggleMetrics(bool enable) -> (zx.status status);
};
