blob: 637a4640b3caf759dcaf907a3b5c1ab845f168e2 [file] [log] [blame]
// Copyright 2019 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.
#include <optional>
#include "src/storage/minfs/minfs.h"
#include "src/storage/minfs/minfs_private.h"
#ifdef FS_WITH_METRICS
#include <storage-metrics/storage-metrics.h>
#include "src/storage/minfs/metrics.h"
#endif
namespace minfs {
#ifdef FS_WITH_METRICS
MinfsMetrics::MinfsMetrics(const ::llcpp::fuchsia::minfs::Metrics* metrics)
: FsMetrics::FsMetrics(&metrics->fs_metrics) {
initialized_vmos = metrics->initialized_vmos;
init_dnum_count = metrics->init_dnum_count;
init_inum_count = metrics->init_inum_count;
init_dinum_count = metrics->init_dinum_count;
init_user_data_size = metrics->init_user_data_size;
init_user_data_ticks = metrics->init_user_data_ticks;
vnodes_opened_cache_hit = metrics->vnodes_opened_cache_hit;
}
void MinfsMetrics::CopyToFidl(::llcpp::fuchsia::minfs::Metrics* metrics) const {
FsMetrics::CopyToFidl(&metrics->fs_metrics);
metrics->initialized_vmos = initialized_vmos.load();
metrics->init_dnum_count = init_dnum_count.load();
metrics->init_inum_count = init_inum_count.load();
metrics->init_dinum_count = init_dinum_count.load();
metrics->init_user_data_size = init_user_data_size.load();
metrics->init_user_data_ticks = init_user_data_ticks.load();
metrics->vnodes_opened_cache_hit = vnodes_opened_cache_hit.load();
}
void MinfsMetrics::Dump(FILE* stream, std::optional<bool> success) const {
FsMetrics::Dump(stream, success);
fprintf(stream, "initialized VMOs: %lu\n", initialized_vmos.load());
fprintf(stream, "initialized direct blocks: %u\n", init_dnum_count.load());
fprintf(stream, "initialized indirect blocks: %u\n", init_inum_count.load());
fprintf(stream, "initialized doubly indirect blocks: %u\n", init_dinum_count.load());
fprintf(stream, "bytes of files initialized: %lu\n", init_user_data_size.load());
fprintf(stream, "ticks during initialization: %lu\n", init_user_data_ticks.load());
fprintf(stream, "vnodes open cache hits: %lu\n", vnodes_opened_cache_hit.load());
}
#endif // FS_WITH_METRICS
void Minfs::UpdateInitMetrics(uint32_t dnum_count, uint32_t inum_count, uint32_t dinum_count,
uint64_t user_data_size, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
if (metrics_.Enabled()) {
metrics_.initialized_vmos++;
metrics_.init_user_data_size += user_data_size;
metrics_.init_user_data_ticks += duration.get();
metrics_.init_dnum_count += dnum_count;
metrics_.init_inum_count += inum_count;
metrics_.init_dinum_count += dinum_count;
}
#endif
}
void Minfs::UpdateLookupMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateLookupStat(success, duration.get(), uint64_t(0));
#endif
}
void Minfs::UpdateCreateMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateCreateStat(success, duration.get(), 0);
#endif
}
void Minfs::UpdateReadMetrics(uint64_t size, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateReadStat(true, duration.get(), size);
#endif
}
void Minfs::UpdateWriteMetrics(uint64_t size, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateWriteStat(true, duration.get(), size);
#endif
}
void Minfs::UpdateTruncateMetrics(const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateTruncateStat(true, duration.get(), 0);
#endif
}
void Minfs::UpdateUnlinkMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateUnlinkStat(success, duration.get(), 0);
#endif
}
void Minfs::UpdateRenameMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateRenameStat(success, duration.get(), 0);
#endif
}
void Minfs::UpdateOpenMetrics(bool cache_hit, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
metrics_.UpdateOpenStat(true, duration.get(), minfs::kMinfsBlockSize);
metrics_.vnodes_opened_cache_hit += cache_hit ? 1 : 0;
#endif
}
} // namespace minfs