| // 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 <minfs/minfs.h> |
| |
| #include "minfs-private.h" |
| #ifdef FS_WITH_METRICS |
| #include <minfs/metrics.h> |
| #include <storage-metrics/storage-metrics.h> |
| #endif |
| |
| namespace minfs { |
| |
| #ifdef FS_WITH_METRICS |
| MinfsMetrics::MinfsMetrics(const 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(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 |