diff --git a/src/Voron/Impl/FreeSpace/FreeSpaceHandling.cs b/src/Voron/Impl/FreeSpace/FreeSpaceHandling.cs index ecae4358902d..310568eaade5 100644 --- a/src/Voron/Impl/FreeSpace/FreeSpaceHandling.cs +++ b/src/Voron/Impl/FreeSpace/FreeSpaceHandling.cs @@ -366,7 +366,7 @@ public int GetFreePagesCount(LowLevelTransaction tx) { var stream = it.CreateReaderForCurrent(); var current = new StreamBitArray(stream); - count += current.GetNumberOfSetBits(); + count += current.SetCount; } while (it.MoveNext()); diff --git a/src/Voron/Impl/FreeSpace/StreamBitArray.cs b/src/Voron/Impl/FreeSpace/StreamBitArray.cs index da10ba61a95c..258bdb983dec 100644 --- a/src/Voron/Impl/FreeSpace/StreamBitArray.cs +++ b/src/Voron/Impl/FreeSpace/StreamBitArray.cs @@ -35,7 +35,6 @@ using System; using System.Diagnostics; using System.IO; -using System.Numerics; using Sparrow.Server; namespace Voron.Impl.FreeSpace @@ -111,18 +110,6 @@ public bool Get(int index) return (_inner[index >> 5] & (1 << (index & 31))) != 0; } - public int GetNumberOfSetBits() - { - var count = 0; - - for (int i = 0; i < _inner.Length; i++) - { - count += BitOperations.PopCount((uint)_inner[i]); - } - - return count; - } - public void Set(int index, bool value) { if (value) diff --git a/src/Voron/StorageEnvironment.cs b/src/Voron/StorageEnvironment.cs index acd45445077c..38f59ca6551f 100644 --- a/src/Voron/StorageEnvironment.cs +++ b/src/Voron/StorageEnvironment.cs @@ -1032,7 +1032,7 @@ private long GetNumberOfAllocatedPages() public StorageReport GenerateReport(Transaction tx) { var numberOfAllocatedPages = GetNumberOfAllocatedPages(); - var numberOfFreePages = _freeSpaceHandling.AllPages(tx.LowLevelTransaction).Count; + var numberOfFreePages = _freeSpaceHandling.GetFreePagesCount(tx.LowLevelTransaction); var countOfTrees = 0; var countOfTables = 0; @@ -1106,7 +1106,7 @@ public unsafe DetailedStorageReport GenerateDetailedReport(Transaction tx, bool public unsafe DetailedReportInput CreateDetailedReportInput(Transaction tx, bool includeDetails) { var numberOfAllocatedPages = Math.Max(_dataPager.NumberOfAllocatedPages, NextPageNumber - 1); // async apply to data file task - var numberOfFreePages = _freeSpaceHandling.AllPages(tx.LowLevelTransaction).Count; + var numberOfFreePages = _freeSpaceHandling.GetFreePagesCount(tx.LowLevelTransaction); var totalCryptoBufferSize = GetTotalCryptoBufferSize(); diff --git a/test/FastTests/Voron/Trees/FreeSpaceTest.cs b/test/FastTests/Voron/Trees/FreeSpaceTest.cs index 78f2e5a8ca12..ccb71f309913 100644 --- a/test/FastTests/Voron/Trees/FreeSpaceTest.cs +++ b/test/FastTests/Voron/Trees/FreeSpaceTest.cs @@ -239,6 +239,8 @@ public void CanGetListOfAllFreedPages(int maxPageNumber, int numberOfFreedPages, using (var tx = Env.WriteTransaction()) { var retrievedFreePages = Env.FreeSpaceHandling.AllPages(tx.LowLevelTransaction); + var freePagesCount = Env.FreeSpaceHandling.GetFreePagesCount(tx.LowLevelTransaction); + Assert.Equal(freePagesCount, retrievedFreePages.Count); freedPages.ExceptWith(Env.FreeSpaceHandling.GetFreePagesOverheadPages(tx.LowLevelTransaction)); // need to take into account that some of free pages might be used for free space handling var sorted = freedPages.OrderBy(x => x).ToList();