From 93ca4b74e22c1572111b12b0354ff7d978a417b7 Mon Sep 17 00:00:00 2001 From: Ruslan Cheremin Date: Fri, 24 May 2024 21:00:03 +0200 Subject: [PATCH] [indexes] extracted statistics access interface for BlobStorage GitOrigin-RevId: c67e4d95318d0b9f7a0392d9b432da4240b2e57b --- .../StreamlinedBlobStorageHelper.java | 14 ++++--- .../io/blobstorage/BlobStorageStatistics.java | 38 +++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 platform/util/src/com/intellij/util/io/blobstorage/BlobStorageStatistics.java diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/dev/blobstorage/StreamlinedBlobStorageHelper.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/dev/blobstorage/StreamlinedBlobStorageHelper.java index a1f4ff2fcbe4..ceaa8007909d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/dev/blobstorage/StreamlinedBlobStorageHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/dev/blobstorage/StreamlinedBlobStorageHelper.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.vfs.newvfs.persistent.dev.blobstorage; import com.intellij.openapi.util.IntRef; @@ -8,10 +8,7 @@ import com.intellij.platform.diagnostic.telemetry.TelemetryManager; import com.intellij.util.io.ClosedStorageException; import com.intellij.util.io.CorruptedException; import com.intellij.util.io.IOUtil; -import com.intellij.util.io.blobstorage.ByteBufferReader; -import com.intellij.util.io.blobstorage.ByteBufferWriter; -import com.intellij.util.io.blobstorage.SpaceAllocationStrategy; -import com.intellij.util.io.blobstorage.StreamlinedBlobStorage; +import com.intellij.util.io.blobstorage.*; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.BatchCallback; import io.opentelemetry.api.metrics.Meter; @@ -39,7 +36,7 @@ import static com.intellij.platform.diagnostic.telemetry.PlatformScopesKt.Storag * of responsibilities -- i.e. extracting all storage-specific functionality under common interface, * and implement adapters for different storages. */ -public abstract class StreamlinedBlobStorageHelper implements StreamlinedBlobStorage { +public abstract class StreamlinedBlobStorageHelper implements StreamlinedBlobStorage, BlobStorageStatistics { /** First header int32, used to recognize this storage's file type */ protected static final int MAGIC_WORD = IOUtil.asciiToMagicWord("SBlS"); @@ -260,22 +257,27 @@ public abstract class StreamlinedBlobStorageHelper implements StreamlinedBlobSto return recordsAllocated.get() - recordsDeleted.get() - recordsRelocated.get(); } + @Override public int recordsAllocated() { return recordsAllocated.get(); } + @Override public int recordsRelocated() { return recordsRelocated.get(); } + @Override public int recordsDeleted() { return recordsDeleted.get(); } + @Override public long totalLiveRecordsPayloadBytes() { return totalLiveRecordsPayloadBytes.get(); } + @Override public long totalLiveRecordsCapacityBytes() { return totalLiveRecordsCapacityBytes.get(); } diff --git a/platform/util/src/com/intellij/util/io/blobstorage/BlobStorageStatistics.java b/platform/util/src/com/intellij/util/io/blobstorage/BlobStorageStatistics.java new file mode 100644 index 000000000000..ee087972cbda --- /dev/null +++ b/platform/util/src/com/intellij/util/io/blobstorage/BlobStorageStatistics.java @@ -0,0 +1,38 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.util.io.blobstorage; + +import org.jetbrains.annotations.ApiStatus; + +/** + * Provides access to storage internal statistics. + * If storage provides access to such a statistics -- it must implement this interface + */ +@ApiStatus.Internal +public interface BlobStorageStatistics { + + /** records currently alive (=allocated-relocated-deleted) */ + int liveRecordsCount(); + + /** records allocated since storage creation (including deleted/relocated) */ + int recordsAllocated(); + + /** records re-allocated -- i.e. recordId is accessible, but the access redirects to another (actual) record */ + int recordsRelocated(); + + /** records deleted, i.e. un-accessible anymore */ + int recordsDeleted(); + + + /** + * Total size (bytes) occupied by storage data. + * Includes all the overhead of file/records header, alignment, etc. + * Could be <= file size, if e.g. file is expanded in advance. + */ + long sizeInBytes(); + + /** Total size of all alive records' payload, i.e. 'useful size', without any overhead */ + long totalLiveRecordsPayloadBytes(); + + /** Total size of all alive records' capacity */ + long totalLiveRecordsCapacityBytes(); +}