Microsoft Garnet, an Open-Source Redis drop-in replacment

Published: Apr 18, 2024 by Isaac Johnson

Continuing our trend from last time, let’s look at another Redis fork/option. This one comes from Microsoft and is named Garnet. Like Valkey, it’s compliant with existing Redis clients.

Unlike Valkey, this is not just a fork of the (formerly) Open-source project, rather a rebuild from Microsoft Research that is written in .NET and claims to have improved throughput and lower latency.

Installation

Let’s start with local builds.

We can clone the Github repo

Because it’s dotnet, we need to ensure we have the dotnet libraries installed

builder@LuiGi:~/Workspaces/garnet$ sudo snap install dotnet-sdk --classic
dotnet-sdk 8.0.202 from Microsoft .NET Core (dotnetcore✓) installed

We can now build with dotnet build

builder@LuiGi:~/Workspaces/garnet$ dotnet build

Welcome to .NET 8.0!
---------------------
SDK Version: 8.0.202

Telemetry
---------
The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

----------------
Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate, view the instructions: https://aka.ms/dotnet-https-linux

----------------
Write your first app: https://aka.ms/dotnet-hello-world
Find out what's new: https://aka.ms/dotnet-whats-new
Explore documentation: https://aka.ms/dotnet-docs
Report issues and find source on GitHub: https://github.com/dotnet/core
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
An issue was encountered verifying workloads. For more information, run "dotnet workload update".
MSBuild version 17.9.6+a4ecab324 for .NET
  Determining projects to restore...
  Restored /home/builder/Workspaces/garnet/playground/GarnetClientStress/GarnetClientStress.csproj (in 11.11 sec).
  Restored /home/builder/Workspaces/garnet/playground/Bitmap/Bitmap.csproj (in 18.14 sec).
  Restored /home/builder/Workspaces/garnet/samples/MetricsMonitor/MetricsMonitor.csproj (in 18.18 sec).
  Restored /home/builder/Workspaces/garnet/samples/GarnetClientSample/GarnetClientSample.csproj (in 3 ms).
  Restored /home/builder/Workspaces/garnet/metrics/HdrHistogram/HdrHistogram.csproj (in 19.82 sec).
  Restored /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/Tsavorite.core.csproj (in 19.82 sec).
  Restored /home/builder/Workspaces/garnet/libs/client/Garnet.client.csproj (in 19.82 sec).
  Restored /home/builder/Workspaces/garnet/libs/common/Garnet.common.csproj (in 19.82 sec).
  Restored /home/builder/Workspaces/garnet/libs/cluster/Garnet.cluster.csproj (in 19.84 sec).
  Restored /home/builder/Workspaces/garnet/libs/server/Garnet.server.csproj (in 19.84 sec).
  Restored /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/Tsavorite.devices.AzureStorageDevice.csproj (in 19.83 sec).
  Restored /home/builder/Workspaces/garnet/libs/host/Garnet.host.csproj (in 19.84 sec).
  Restored /home/builder/Workspaces/garnet/test/Garnet.test.cluster/Garnet.test.cluster.csproj (in 21.58 sec).
  Restored /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/Resp.benchmark.csproj (in 4.31 sec).
  Restored /home/builder/Workspaces/garnet/playground/ClusterStress/ClusterStress.csproj (in 22.47 sec).
  Restored /home/builder/Workspaces/garnet/main/GarnetServer/GarnetServer.csproj (in 22.46 sec).
  Restored /home/builder/Workspaces/garnet/playground/Embedded.perftest/Embedded.perftest.csproj (in 22.47 sec).
  Restored /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/BDN.benchmark.csproj (in 31.63 sec).
  Restored /home/builder/Workspaces/garnet/playground/TstRunner/TstRunner.csproj (in 14.03 sec).
  Restored /home/builder/Workspaces/garnet/test/Garnet.test/Garnet.test.csproj (in 21.14 sec).
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Debug/net7.0/HdrHistogram.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Debug/net6.0/HdrHistogram.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Debug/net6.0/Garnet.common.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Debug/net8.0/HdrHistogram.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Debug/net7.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Debug/net8.0/Garnet.common.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Debug/net7.0/BDN.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Debug/net6.0/BDN.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Debug/net8.0/BDN.benchmark.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Debug/net6.0/Tsavorite.core.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Debug/net7.0/Tsavorite.core.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Debug/net8.0/Tsavorite.core.dll
  Bitmap -> /home/builder/Workspaces/garnet/playground/Bitmap/bin/Debug/net7.0/Bitmap.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Debug/net7.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Debug/net8.0/Garnet.client.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Debug/net6.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Debug/net6.0/Garnet.client.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Debug/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  GarnetClientSample -> /home/builder/Workspaces/garnet/samples/GarnetClientSample/bin/Debug/net8.0/GarnetClientSample.dll
  GarnetClientStress -> /home/builder/Workspaces/garnet/playground/GarnetClientStress/bin/Debug/net8.0/GarnetClientStress.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Debug/net8.0/Resp.benchmark.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Debug/net8.0/ClusterStress.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Debug/net7.0/Garnet.client.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Debug/net6.0/ClusterStress.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Debug/net7.0/ClusterStress.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Debug/net7.0/Resp.benchmark.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Debug/net6.0/Garnet.server.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Debug/net8.0/Garnet.server.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Debug/net6.0/Garnet.cluster.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Debug/net6.0/Resp.benchmark.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Debug/net7.0/Garnet.server.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Debug/net6.0/Garnet.host.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Debug/net8.0/Garnet.cluster.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Debug/net6.0/Garnet.test.cluster.dll
  MetricsMonitor -> /home/builder/Workspaces/garnet/samples/MetricsMonitor/bin/Debug/net7.0/MetricsMonitor.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Debug/net6.0/GarnetServer.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Debug/net7.0/Garnet.cluster.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Debug/net6.0/Embedded.perftest.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Debug/net8.0/Garnet.host.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Debug/net7.0/Garnet.host.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Debug/net6.0/Garnet.test.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Debug/net7.0/GarnetServer.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Debug/net8.0/Embedded.perftest.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Debug/net7.0/Garnet.test.cluster.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Debug/net8.0/Garnet.test.cluster.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Debug/net7.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Debug/net7.0/Garnet.test.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Debug/net8.0/GarnetServer.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Debug/net8.0/Garnet.test.dll
  TstRunner -> /home/builder/Workspaces/garnet/playground/TstRunner/bin/Debug/net7.0/TstRunner.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:01:43.47

We can be explicit and build the Release profile instead

builder@LuiGi:~/Workspaces/garnet$ dotnet build -c Release
MSBuild version 17.9.6+a4ecab324 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net7.0/HdrHistogram.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net6.0/HdrHistogram.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net8.0/HdrHistogram.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net8.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net6.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net7.0/Garnet.common.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net7.0/BDN.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net6.0/BDN.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net8.0/BDN.benchmark.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net8.0/Tsavorite.core.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net7.0/Tsavorite.core.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net6.0/Tsavorite.core.dll
  Bitmap -> /home/builder/Workspaces/garnet/playground/Bitmap/bin/Release/net7.0/Bitmap.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net7.0/Tsavorite.devices.AzureStorageDevice.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net7.0/Garnet.client.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net8.0/Garnet.client.dll
  GarnetClientStress -> /home/builder/Workspaces/garnet/playground/GarnetClientStress/bin/Release/net8.0/GarnetClientStress.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net7.0/Resp.benchmark.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net6.0/Tsavorite.devices.AzureStorageDevice.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net7.0/ClusterStress.dll
  GarnetClientSample -> /home/builder/Workspaces/garnet/samples/GarnetClientSample/bin/Release/net8.0/GarnetClientSample.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net8.0/ClusterStress.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net8.0/Resp.benchmark.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net7.0/Garnet.server.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net6.0/Garnet.client.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net8.0/Garnet.server.dll
  MetricsMonitor -> /home/builder/Workspaces/garnet/samples/MetricsMonitor/bin/Release/net7.0/MetricsMonitor.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net7.0/Garnet.cluster.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net8.0/Garnet.cluster.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net7.0/Garnet.host.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net6.0/Garnet.server.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net6.0/Resp.benchmark.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net7.0/GarnetServer.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net6.0/ClusterStress.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net6.0/Garnet.cluster.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net7.0/Garnet.test.cluster.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net6.0/Garnet.host.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net7.0/Garnet.test.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net6.0/GarnetServer.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net7.0/Embedded.perftest.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net6.0/Garnet.test.cluster.dll
  TstRunner -> /home/builder/Workspaces/garnet/playground/TstRunner/bin/Release/net7.0/TstRunner.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net6.0/Garnet.test.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net6.0/Embedded.perftest.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net8.0/Garnet.host.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/GarnetServer.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net8.0/Embedded.perftest.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:26.69

Since I’m running .NET 8 as you saw with the snap install (and the output paths above), I’ll use that to test

builder@LuiGi:~/Workspaces/garnet$ dotnet test -c Release -f net8.0 -l "console;verbosity=detailed"
  Determining projects to restore...
  All projects are up-to-date for restore.
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net8.0/HdrHistogram.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net8.0/Garnet.common.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net8.0/Tsavorite.core.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net8.0/Garnet.client.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net8.0/Garnet.server.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net8.0/Garnet.cluster.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net8.0/Garnet.host.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll
Test run for /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll (.NETCoreApp,Version=v8.0)
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll
Test run for /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll (.NETCoreApp,Version=v8.0)
Microsoft (R) Test Execution Command Line Tool Version 17.9.0 (x64)
Copyright (c) Microsoft Corporation.  All rights reserved.

Microsoft (R) Test Execution Command Line Tool Version 17.9.0 (x64)
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll
A total of 1 test files matched the specified pattern.
/home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll
NUnit Adapter 4.5.0.0: Test execution started
NUnit Adapter 4.5.0.0: Test execution started
Running all tests in /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll
Running all tests in /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll
   NUnit3TestExecutor discovered 206 of 206 NUnit test cases using Current Discovery mode, Non-Explicit run
   NUnit3TestExecutor discovered 635 of 635 NUnit test cases using Current Discovery mode, Non-Explicit run
  Passed HeapSizeValidationTest [343 ms]
  Passed ClusterBasicACLTest(True) [3 s]
  Passed ClusterBasicACLTest(False) [3 s]
  Passed ClusterStartupWithoutAuthCreds(True) [1 s]
  Passed ClusterStartupWithoutAuthCreds(False) [1 s]
  Passed IncreaseEmptyPageCountTest [10 s]
  Passed ClusterReplicationAuth [1 s]
  Passed BitmapSetBitResponseTest [80 ms]
  Passed BitmapGetBitResponseTest [53 ms]
  Passed BitmapSetGetBitResponseTest [948 ms]
  Passed BitmapSimpleSetGet_PCT(10) [43 ms]
  Passed BitmapSimpleSetGet_PCT(20) [27 ms]
  Passed BitmapSimpleSetGet_PCT(30) [39 ms]
  Passed ClusterSimpleFailoverAuth [2 s]
  Passed BitmapSetGetBitTest_LTM(False) [1 s]
[000.2024-04-06 12:19:11.3401.(errr)] |ClusterSimpleACLReload| <ClusterManager-127.0.0.1:7000> System.Exception: NOAUTH Authentication required.
   at Garnet.client.GarnetClient.ExecuteForMemoryResultWithCancellationAsync(Memory`1 respOp, ICollection`1 args, CancellationToken token) in /home/builder/Workspaces/garnet/libs/client/GarnetClientAPI/GarnetClientExecuteAPI.cs:line 478
   at Garnet.cluster.GarnetServerNode.TryMeet(Byte[] configByteArray) in /home/builder/Workspaces/garnet/libs/cluster/Server/GarnetServerNode.cs:line 120
   at Garnet.cluster.ClusterManager.Meet(String address, Int32 port) in /home/builder/Workspaces/garnet/libs/cluster/Server/Gossip.cs:line 264 ^Meet terminated with error^
[000.2024-04-06 12:19:11.3401.(errr)] |ClusterSimpleACLReload| <ClusterManager-127.0.0.1:7000> System.Exception: NOAUTH Authentication required.
   at Garnet.client.GarnetClient.ExecuteForMemoryResultWithCancellationAsync(Memory`1 respOp, ICollection`1 args, CancellationToken token) in /home/builder/Workspaces/garnet/libs/client/GarnetClientAPI/GarnetClientExecuteAPI.cs:line 478
   at Garnet.cluster.GarnetServerNode.TryMeet(Byte[] configByteArray) in /home/builder/Workspaces/garnet/libs/cluster/Server/GarnetServerNode.cs:line 120
   at Garnet.cluster.ClusterManager.Meet(String address, Int32 port) in /home/builder/Workspaces/garnet/libs/cluster/Server/Gossip.cs:line 264 ^Meet terminated with error^
  Passed BitmapSetGetBitTest_LTM(True) [1 s]
[000.2024-04-06 12:19:12.2968.(errr)] |ClusterSimpleACLReload| <ClusterManager-127.0.0.1:7001> System.Exception: WRONGPASS Invalid username/password combination
   at Garnet.client.GarnetClient.ConnectAsync(CancellationToken token) in /home/builder/Workspaces/garnet/libs/client/GarnetClient.cs:line 234 ^AUTH returned error^
[000.2024-04-06 12:19:13.2928.(errr)] |ClusterSimpleACLReload| <ClusterManager-127.0.0.1:7001> System.Exception: WRONGPASS Invalid username/password combination
   at Garnet.client.GarnetClient.ConnectAsync(CancellationToken token) in /home/builder/Workspaces/garnet/libs/client/GarnetClient.cs:line 234 ^AUTH returned error^
  Passed BitmapSimpleBitCountTest [341 ms]
  Passed BitmapBitCountBetweenOffsetsTest [985 ms]
  Passed BitmapBitCountBetweenOffsetsTestV2 [62 ms]
  Passed BitmapBitCountNegativeOffsets [80 ms]
[000.2024-04-06 12:19:14.2984.(errr)] |ClusterSimpleACLReload| <ClusterManager-127.0.0.1:7001> System.Exception: WRONGPASS Invalid username/password combination
   at Garnet.client.GarnetClient.ConnectAsync(CancellationToken token) in /home/builder/Workspaces/garnet/libs/client/GarnetClient.cs:line 234 ^AUTH returned error^
  Passed ClusterSimpleACLReload [4 s]
  Passed BitmapBitCountTest_LTM [457 ms]
  Passed BitmapSimpleBITCOUNT_PCT(10) [17 ms]
  Passed BitmapSimpleBITCOUNT_PCT(20) [54 ms]
  Passed BitmapSimpleBITCOUNT_PCT(30) [14 ms]
  Passed ClusterSlotsTest(0,16383) [1 s]
  Passed BitmapSimpleBitPosTests [1 s]
  Passed BitmapBitPosOffsetsTest [68 ms]
  Passed BitmapBitPosTest_LTM [406 ms]
  Passed BitmapSimpleBITPOS_PCT(10) [16 ms]
  Passed BitmapSimpleBITPOS_PCT(20) [41 ms]
  Passed BitmapSimpleBITPOS_PCT(30) [14 ms]
  Passed BitmapSimpleBITOP_PCT(100) [217 ms]
[000.2024-04-06 12:19:16.5237.(crit)] |ClusterSlotsTest(1234,5678)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7001] [127.0.0.1:34198] [03441AE0] ProcessMessages threw exception^
  Passed ClusterSlotsTest(1234,5678) [1 s]
  Passed BitmapSimpleBitOpTests [843 ms]
  Passed BitmapSimpleVarLenBitOpTests [473 ms]
  Passed BitmapBitOpNotTest [69 ms]
  Passed BitmapSimpleBitOpVarLenGrowingSizeTests [229 ms]
  Passed ClusterSlotRangesTest [1 s]
  Passed ClusterForgetTest [1 s]
  Passed ClusterResetTest [2 s]
  Passed ClusterSimpleInitialize [1 s]
  Passed ClusterSimpleSlotInfo [1 s]
  Passed ClusterAddDelSlots [122 ms]
  Passed ClusterSlotChangeStatus [1 s]
  Passed ClusterRedirectMessage [116 ms]
  Passed BitmapBitfieldGetTest [8 s]
  Passed ClusterSimpleMigrateSlots [1 s]
  Passed BitmapBitfieldGetTest_PCT(100) [4 s]
  Passed ClusterSimpleMigrateSlotsExpiry [6 s]
  Passed BitmapBitfieldGetTest_LTM [2 s]
  Passed ClusterSimpleMigrateSlotsWithObjects [1 s]
  Passed BitmapBitfieldSetTest_PCT(100) [1 s]
  Passed BitmapBitfieldSetTest [1 s]
  Passed ClusterSimpleMigrateKeys [3 s]
  Passed ClusterSimpleMigrateKeysWithObjects [2 s]
  Passed ClusterSimpleMigrateWithReadWrite [1 s]
  Passed ClusterSimpleTxn [1 s]
  Passed ClusterSimpleMigrateSlotsRanges(System.Collections.Generic.List`1[System.Int32]) [1 s]
  Passed ClusterSimpleMigrateSlotsRanges(System.Collections.Generic.List`1[System.Int32]) [1 s]
  Passed ClusterSimpleMigrateWithAuth(System.Collections.Generic.List`1[System.Int32]) [1 s]
  Passed ClusterSimpleMigrateWithAuth(System.Collections.Generic.List`1[System.Int32]) [1 s]
  Passed ClusterSingleKeyRedirectionTests [7 s]
  Passed ClusterMultiKeyRedirectionTests [2 s]
  Passed ClusterSRTest(True) [1 s]
  Passed ClusterSRTest(False) [1 s]
  Passed ClusterSRNoCheckpointRestartSecondary(True,True) [4 s]
  Passed BitmapBitfieldSetTest_LTM [28 s]
  Passed BitmapBitfieldSignedIncrTest_PCT(10) [1 s]
  Passed ClusterSRNoCheckpointRestartSecondary(True,False) [5 s]
  Passed BitmapBitfieldSignedIncrTest_PCT(50) [1 s]
  Passed BitmapBitfieldSignedIncrTest_PCT(90) [1 s]
  Passed BitmapBitfieldSignedIncrTest_PCT(100) [1 s]
  Passed ClusterSRNoCheckpointRestartSecondary(False,True) [4 s]
  Passed BitmapBitfieldSignedIncrTest [2 s]
  Passed ClusterSRNoCheckpointRestartSecondary(False,False) [4 s]
  Passed ClusterSRPrimaryCheckpoint(True,True) [4 s]
  Passed ClusterSRPrimaryCheckpoint(True,False) [4 s]
  Passed ClusterSRPrimaryCheckpoint(False,True) [4 s]
  Passed ClusterSRPrimaryCheckpoint(False,False) [4 s]
  Passed ClusterCheckpointRetrieveDisableStorageTier(True,True) [2 s]
  Passed BitmapBitfieldIncrTest_LTM [25 s]
  Passed ClusterCheckpointRetrieveDisableStorageTier(True,False) [2 s]
  Passed BitmapBitfieldUnsignedIncrTest [1 s]
  Passed ClusterCheckpointRetrieveDisableStorageTier(False,True) [2 s]
  Passed ClusterCheckpointRetrieveDisableStorageTier(False,False) [2 s]
  Passed BitmapBitfieldGrowingTest [6 s]
  Passed BitmapCmdsProcedureTest [39 ms]
  Passed BitmapBitCountSimpleTest [27 ms]
  Passed BitmapBitPosFixedTests [29 ms]
  Passed CanDoBulkDeleteTests(True) [92 ms]
  Passed CanDoBulkDeleteTests(False) [83 ms]
  Passed CanUseMGetTests(True) [74 ms]
  Passed CanUseMGetTests(False) [55 ms]
  Passed CanUseSetNxStringResultAsync [24 ms]
  Passed SetGetWithCallback(True) [172 ms]
  Passed SetGetWithCallback(False) [30 ms]
  Passed SimpleDecrTest(True) [45 ms]
  Passed SimpleDecrTest(False) [22 ms]
  Passed SimpleIncrTest(True) [21 ms]
  Passed SimpleIncrTest(False) [26 ms]
  Passed SimpleMetricsTest(True) [56 ms]
  Passed SimpleMetricsTest(False) [50 ms]
  Passed SimpleNoArgsTest [22 ms]
  Passed SimpleStringArrayTest(True) [16 ms]
  Passed ClusterCheckpointRetrieveDelta(True) [3 s]
  Passed SimpleStringArrayTest(False) [20 ms]
  Passed CopyUpdate [180 ms]
  Passed WriteCheckpointRead [752 ms]
  Passed WriteRead [41 ms]
  Passed DefaultConfigurationOptionsCoverage [20 ms]
  Passed ImportExportConfigAzure [3 ms]
  Passed ImportExportConfigLocal [193 ms]
  Passed ImportExportRedisConfigLocal [36 ms]
  Passed CanRunHLLProcedureTest [20 ms]
  Passed HyperLogLogArraySimple_PCT(5) [24 ms]
  Passed HyperLogLogArraySimple_PCT(10) [20 ms]
  Passed HyperLogLogArraySimple_PCT(20) [14 ms]
  Passed HyperLogLogMultiCountTest [25 ms]
  Passed HyperLogLogMultiValueUpdateReturnTest [123 ms]
  Passed HyperLogLogPFADD_LTM(32) [715 ms]
  Passed ClusterCheckpointRetrieveDelta(False) [3 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,True,True,True) [3 s]
  Passed HyperLogLogPFADD_LTM(4096) [5 s]
  Passed HyperLogLogPFMerge_MultiHLLMergeV2 [63 ms]
  Passed HyperLogLogSimple_PCT(5) [22 ms]
  Passed HyperLogLogSimple_PCT(10) [19 ms]
  Passed HyperLogLogSimple_PCT(20) [18 ms]
  Passed HyperLogLogSimpleInvalidHLLTypeTest [28 ms]
  Passed HyperLogLogTestPFADD_DuplicatesV2 [60 ms]
  Passed HyperLogLogTestPFADDV2 [512 ms]
  Passed HyperLogLogTestPFMERGE_DenseToDenseV2 [53 ms]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,True,True,False) [3 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,True,False,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,True,False,False) [2 s]
  Passed HyperLogLogTestPFMERGE_LTM_DenseToDense [9 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,False,True,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,False,True,False) [2 s]
  Passed HyperLogLogTestPFMERGE_LTM_SparseToDense(False) [4 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,False,False,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(True,False,False,False) [2 s]
  Passed HyperLogLogTestPFMERGE_LTM_SparseToDense(True) [5 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,True,True,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,True,True,False) [3 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,True,False,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,True,False,False) [2 s]
  Passed HyperLogLogTestPFMERGE_LTM_SparseToSparse [11 s]
  Passed HyperLogLogTestPFMERGE_SparseToDenseV2 [40 ms]
  Passed HyperLogLogTestPFMERGE_SparseToSparseV2 [24 ms]
  Passed HyperLogLogUpdateReturnTest [80 ms]
  Passed SimpleHyperLogLogAddCount [26 ms]
  Passed SimpleHyperLogLogMerge [29 ms]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,False,True,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,False,True,False) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,False,False,True) [2 s]
  Passed ClusterSRPrimaryCheckpointRetrieve(False,False,False,False) [2 s]
  Passed IndexGrowthTest [10 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(True,True,True) [2 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(True,True,False) [1 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(True,False,True) [1 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(True,False,False) [1 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(False,True,True) [1 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(False,True,False) [1 s]
  Passed IndexGrowthTestWithDiskReadAndCheckpoint [10 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(False,False,True) [1 s]
  Passed ClusterSRAddReplicaAfterPrimaryCheckpoint(False,False,False) [1 s]
  Passed ClusterSRPrimaryRestart(True,True) [1 s]
  Passed ClusterSRPrimaryRestart(True,False) [1 s]
  Passed ClusterSRPrimaryRestart(False,True) [1 s]
  Passed ClusterSRPrimaryRestart(False,False) [1 s]
[000.2024-04-06 12:21:55.8625.(crit)] |ClusterSRRedirectWrites| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:58770] [00D0CEDC] ProcessMessages threw exception^
  Passed ClusterSRRedirectWrites [1 s]
  Passed ClusterSRReplicaOfTest(True) [481 ms]
  Passed ClusterSRReplicaOfTest(False) [257 ms]
  Passed ObjectStoreIndexGrowthTest [10 s]
  Passed ClusterReplicationSimpleFailover(True,True) [2 s]
  Passed ClusterReplicationSimpleFailover(True,False) [2 s]
  Passed ClusterReplicationSimpleFailover(False,True) [2 s]
  Passed ClusterReplicationSimpleFailover(False,False) [2 s]
  Passed ObjectStoreIndexGrowthTestWithDiskReadAndCheckpoint [10 s]
  Passed CanUseGETWithLeftOverBuffer(100) [23 ms]
  Passed CanUseGETWithLeftOverBuffer(131042) [23 ms]
  Passed CanUseGETWithLeftOverBuffer(131049) [14 ms]
  Passed CanUseGETWithLeftOverBuffer(131056) [17 ms]
  Passed CanUseGETWithLeftOverBuffer(131061) [32 ms]
  Passed CanUseHGETWithLeftOverBuffer(100) [31 ms]
  Passed CanUseHGETWithLeftOverBuffer(131042) [22 ms]
  Passed CanUseHGETWithLeftOverBuffer(131049) [29 ms]
  Passed CanUseHGETWithLeftOverBuffer(131056) [15 ms]
  Passed CanUseHGETWithLeftOverBuffer(131061) [19 ms]
  Passed CanUseHKEYSWithLeftOverBuffer(100) [16 ms]
  Passed CanUseHKEYSWithLeftOverBuffer(131042) [14 ms]
  Passed CanUseHKEYSWithLeftOverBuffer(131049) [26 ms]
  Passed CanUseHKEYSWithLeftOverBuffer(131056) [32 ms]
  Passed CanUseHKEYSWithLeftOverBuffer(131061) [12 ms]
  Passed CanUseLPOPWithLeftOverBuffer(100) [18 ms]
  Passed CanUseLPOPWithLeftOverBuffer(131042) [14 ms]
  Passed CanUseLPOPWithLeftOverBuffer(131049) [11 ms]
  Passed CanUseLPOPWithLeftOverBuffer(131056) [12 ms]
  Passed CanUseLPOPWithLeftOverBuffer(131061) [13 ms]
  Passed CanUseLRangeWithLeftOverBuffer(100) [36 ms]
  Passed CanUseLRangeWithLeftOverBuffer(131042) [31 ms]
  Passed CanUseLRangeWithLeftOverBuffer(131049) [30 ms]
  Passed CanUseLRangeWithLeftOverBuffer(131056) [27 ms]
  Passed CanUseLRangeWithLeftOverBuffer(131061) [29 ms]
  Passed CanUseSMembersWithLeftOverBuffer(100) [20 ms]
  Passed CanUseSMembersWithLeftOverBuffer(131042) [33 ms]
  Passed CanUseSMembersWithLeftOverBuffer(131049) [35 ms]
  Passed CanUseSMembersWithLeftOverBuffer(131056) [17 ms]
  Passed CanUseSMembersWithLeftOverBuffer(131061) [19 ms]
  Passed CanUseZPopMaxWithLeftOverBuffer(100) [25 ms]
  Passed CanUseZPopMaxWithLeftOverBuffer(131042) [16 ms]
  Passed CanUseZPopMaxWithLeftOverBuffer(131049) [12 ms]
  Passed CanUseZPopMaxWithLeftOverBuffer(131056) [14 ms]
  Passed CanUseZPopMaxWithLeftOverBuffer(131061) [13 ms]
  Passed CanUseZRangeWithLeftOverBuffer(100) [23 ms]
  Passed CanUseZRangeWithLeftOverBuffer(131042) [13 ms]
  Passed CanUseZRangeWithLeftOverBuffer(131049) [14 ms]
  Passed CanUseZRangeWithLeftOverBuffer(131056) [17 ms]
  Passed CanUseZRangeWithLeftOverBuffer(131061) [12 ms]
  Passed AclLoad [37 ms]
  Passed AclLoadErrors [16 ms]
  Passed BadInputMalformedStatement [13 ms]
  Passed BadInputNonexistingFile [11 ms]
  Passed DuplicateUserNames [12 ms]
  Passed ClusterFailoverAttachReplicas(True,True,True,True) [3 s]
  Passed EmptyInput [13 ms]
  Passed NoDefaultRule [14 ms]
  Passed WithDefaultRule [14 ms]
  Passed BasicListTest [13 ms]
  Passed BasicUsersTest [22 ms]
  Passed BasicWhoamiTest [15 ms]
  Passed InvalidSubcommand [13 ms]
  Passed DeleteDefaultUser [18 ms]
  Passed DeleteMultipleUser [19 ms]
  Passed ClusterFailoverAttachReplicas(True,True,True,False) [3 s]
  Passed DeleteNonexistingUser [18 ms]
  Passed DeleteNoUser [14 ms]
  Passed DeleteSingleUser [19 ms]
  Passed ParallelAuthTest(128,2048) [5 s]
  Passed ParallelPasswordHashTest(128,2048) [137 ms]
  Passed AddAndRemoveCategoryTest [23 ms]
  Passed AddDuplicatePasswordTest [23 ms]
  Passed AddPasswordFromCleartextTest [21 ms]
  Passed AddPasswordFromHashTest [21 ms]
  Passed BadInputEmpty [34 ms]
  Passed BadInputUnknownOperation [28 ms]
  Passed EnableAndDisableUsers [22 ms]
  Passed KeyPatternsWildcard [27 ms]
  Passed PasswordlessDefaultUserTest [20 ms]
  Passed PasswordlessUserTest [20 ms]
  Passed ProtectedDefaultUserErrorHandlingTest [18 ms]
  Passed ProtectedDefaultUserLoginExplicitTest [18 ms]
  Passed ProtectedDefaultUserLoginImplicitTest [18 ms]
  Passed RemovePasswordFromCleartextTest [19 ms]
  Passed RemovePasswordFromHashTest [20 ms]
  Passed ResetPasswordsTest [28 ms]
  Passed ResetUser [35 ms]
  Passed EchoTwoCommandsTest [88 ms]
  Passed EchoWithMessagesReturnErrorTest [27 ms]
  Passed EchoWithMessageTest [18 ms]
  Passed EchoWithNoMessageReturnErrorTest [17 ms]
  Passed PingErrorMessageTest [32 ms]
  Passed PingMessageTest [41 ms]
  Passed PingTest [40 ms]
  Passed SeAofRecoverTest [185 ms]
  Passed SeEchoWithMessageTest [43 ms]
  Passed SeEchoWithNoMessageReturnErrorTest [24 ms]
  Passed SeFlushDatabaseTest [27 ms]
  Passed SeFlushDBTest(True,True) [26 ms]
  Passed SeFlushDBTest(True,False) [22 ms]
  Passed SeFlushDBTest(False,True) [21 ms]
  Passed SeFlushDBTest(False,False) [31 ms]
  Passed SePingErrorMessageTest [28 ms]
  Passed SePingMessageTest [17 ms]
SeSaveRecoverTest(True,True): Environment variable RunAzureTests is not defined
SeSaveRecoverTest(False,True): Environment variable RunAzureTests is not defined
  Passed SePingTest [20 ms]
  Passed SeSaveRecoverObjectTest [137 ms]
  Skipped SeSaveRecoverTest(True,True) [40 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Passed SeSaveRecoverTest(True,False) [139 ms]
  Skipped SeSaveRecoverTest(False,True) [17 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Passed SeSaveRecoverTest(False,False) [148 ms]
  Passed SeSaveTest [150 ms]
  Passed SeTimeCommandTest [23 ms]
  Passed SeTimeWithReturnErrorTest [22 ms]
AofDeleteObjectStoreRecoverTest: Environment variable RunAzureTests is not defined
AofDeleteStoreRecoverTest: Environment variable RunAzureTests is not defined
AofExpiryRMWStoreRecoverTest: Environment variable RunAzureTests is not defined
AofMultiRMWStoreCkptRecoverTest: Environment variable RunAzureTests is not defined
AofRMWObjectStoreCopyUpdateRecoverTest: Environment variable RunAzureTests is not defined
AofRMWObjectStoreRecoverTest: Environment variable RunAzureTests is not defined
AofRMWStoreRecoverTest: Environment variable RunAzureTests is not defined
  Passed TimeCommandTest [17 ms]
  Passed TimeWithReturnErrorTest [16 ms]
  Skipped AofDeleteObjectStoreRecoverTest [2 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofDeleteStoreRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofExpiryRMWStoreRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofMultiRMWStoreCkptRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofRMWObjectStoreCopyUpdateRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofRMWObjectStoreRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofRMWStoreRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

AofUpsertStoreAutoCommitCommitWaitRecoverTest: Environment variable RunAzureTests is not defined
AofUpsertStoreAutoCommitRecoverTest: Environment variable RunAzureTests is not defined
AofUpsertStoreCkptRecoverTest: Environment variable RunAzureTests is not defined
AofUpsertStoreRecoverTest: Environment variable RunAzureTests is not defined
  Passed ClusterFailoverAttachReplicas(True,True,False,True) [4 s]
  Skipped AofUpsertStoreAutoCommitCommitWaitRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofUpsertStoreAutoCommitRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofUpsertStoreCkptRecoverTest [2 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Skipped AofUpsertStoreRecoverTest [1 ms]
  Error Message:
   Environment variable RunAzureTests is not defined
  Standard Output Messages:
 Environment variable RunAzureTests is not defined

  Passed AofDeleteObjectStoreRecoverTest [93 ms]
  Passed AofDeleteStoreRecoverTest [79 ms]
  Passed AofExpiryRMWStoreRecoverTest [2 s]
  Passed AofListObjectStoreRecoverTest [60 ms]
  Passed AofMultiRMWStoreCkptRecoverTest [1 s]
  Passed AofRMWObjectStoreCopyUpdateRecoverTest [211 ms]
  Passed AofRMWObjectStoreRecoverTest [58 ms]
  Passed AofRMWStoreRecoverTest [80 ms]
  Passed AofUpsertCustomObjectRecoverTest [107 ms]
  Passed AofUpsertObjectStoreRecoverTest [78 ms]
  Passed AofUpsertStoreAutoCommitCommitWaitRecoverTest [88 ms]
  Passed AofUpsertStoreAutoCommitRecoverTest [70 ms]
  Passed AofUpsertStoreCkptRecoverTest [125 ms]
  Passed ClusterFailoverAttachReplicas(True,True,False,False) [3 s]
  Passed AofUpsertStoreRecoverTest [55 ms]
  Passed CustomCommandSetAfterKeyDeletedWithTtlTest [2 s]
  Passed CustomCommandSetFollowedByTtlTestAsync [23 ms]
  Passed ClusterFailoverAttachReplicas(True,False,True,True) [3 s]
  Passed ClusterFailoverAttachReplicas(True,False,True,False) [3 s]
  Passed CustomCommandSetWhileKeyHasTtlTest [6 s]
  Passed ClusterFailoverAttachReplicas(True,False,False,True) [3 s]
  Passed CustomCommandSetWithCustomExpirationTestAsync [5 s]
  Passed ClusterFailoverAttachReplicas(True,False,False,False) [3 s]
  Passed CustomCommandTest1 [25 ms]
  Passed CustomCommandTest2 [39 ms]
  Passed CustomCommandTest3 [1 s]
  Passed CustomCommandTest4 [39 ms]
  Passed CustomCommandTest5 [43 ms]
  Passed CustomCommandTest6 [42 ms]
  Passed CustomObjectCommandTest1 [42 ms]
  Passed CustomObjectCommandTest2 [1 s]
  Passed ClusterFailoverAttachReplicas(False,True,True,True) [3 s]
  Passed RegisterCustomCommandErrorConditionsTest [2 s]
  Passed RegisterCustomCommandTest [502 ms]
  Passed ScatterGatherGet [60 ms]
  Passed CanDeleleteMultipleFields [8 ms]
  Passed CanDeleleteMultipleFieldsWithNonExistingField [6 ms]
  Passed CanDeleteOnepairLC [5 ms]
  Passed CanDelSingleField [8 ms]
  Passed CanDoGetAll [9 ms]
  Passed CanDoGetAllLC [11 ms]
  Passed CanDoHashDecrement [24 ms]
  Passed CanDoHashScan [35 ms]
  Passed CanDoHashScanWithCursor [45 ms]
  Passed CanDoHashSetWithNX [13 ms]
  Passed CanDoHExists [14 ms]
  Passed CanDoHExistsLC [6 ms]
  Passed CanDoHGETALL [11 ms]
  Passed CanDoHIncrBy [11 ms]
  Passed CanDoHIncrByLTM [136 ms]
  Passed CanDoHKeys [8 ms]
  Passed CanDoHLen [9 ms]
  Passed CanDoHMGET [10 ms]
  Passed CanDoHMSETMultipleTimes [13 ms]
  Passed CanDoHRANDFIELDCommandLC [23 ms]
  Passed CanDoHSETNXCommand [30 ms]
  Passed CanDoHSETWhenAlwaysAsync [17 ms]
  Passed CanDoHStrLen [14 ms]
  Passed CanDoHStrLenLC [10 ms]
  Passed CanDoHVals [21 ms]
  Passed CanDoIncrByFloatLC [18 ms]
  Passed CanDoIncrByLC [6 ms]
  Passed CanDoKeyNotFoundCommandLC [9 ms]
  Passed CanDoNotFoundSKeyInHRANDFIELDLC [4 ms]
  Passed CanDoNOTFOUNDSKeyInHVALSLC [8 ms]
  Passed CanDoNOTFOUNDSSKEYLC [12 ms]
  Passed CanDoWrongNumOfParametersInHINCRBYFLOATLC [4 ms]
  Passed CanDoWrongNumOfParametersInHINCRBYLC [12 ms]
  Passed CanDoWrongParametersNumberHRANDFIELDLC [9 ms]
  Passed CanFailWhenUseMultiWatchTest [24 ms]
  Passed CanSetAndGetMultiPair [138 ms]
  Passed CanSetAndGetMultiplepairandAllChunks(10) [8 ms]
  Passed CanSetAndGetMultiplepairandAllChunks(50) [11 ms]
  Passed CanSetAndGetMultiplepairLC(30) [6 ms]
  Passed CanSetAndGetMultiplepairLC(50) [4 ms]
  Passed CanSetAndGetMultiplepairLC(100) [3 ms]
  Passed CanSetAndGetMultiplePairs [7 ms]
  Passed CanSetAndGetMultiplePairsSecondUseCaseLC [9 ms]
  Passed ClusterFailoverAttachReplicas(False,True,True,False) [2 s]
  Passed CanSetAndGetOnePair [8 ms]
  Passed CanSetAndGetOnePairLarge [9 ms]
  Passed CanSetAndGetOnepairLC(50) [3 ms]
  Passed HashRandomFieldEmptyHash [8 ms]
  Passed CanCreateJobQueue [102 ms]
  Passed BasicLPUSHAndLPOP [9 ms]
  Passed BasicLPUSHAndLRANGE [8 ms]
  Passed BasicLPUSHAndLTRIM [10 ms]
  Passed BasicRPUSHAndLINDEX [11 ms]
  Passed BasicRPUSHAndLINSERT [15 ms]
  Passed BasicRPUSHAndLREM [11 ms]
  Passed BasicRPUSHAndRPOP [6 ms]
  Passed CanDoLInsertBeforeAndAfterLC [13 ms]
  Passed CanDoLInsertWithNoElementLC [5 ms]
  Passed CanDoLMoveChunks(10) [7 ms]
  Passed CanDoLMoveChunks(24) [9 ms]
  Passed CanDoLMoveChunks(100) [7 ms]
  Passed CanDoLPopMultipleValues [13 ms]
  Passed CanDoLPushxRPushx [8 ms]
  Passed CanDoLPushXRpushX [15 ms]
  Passed CanDoLRANGEbasic [15 ms]
  Passed CanDoLRANGEcorrect [17 ms]
  Passed CanDoPushAndTrimLC [6 ms]
  Passed CanDoRPopLPush [17 ms]
  Passed CanDoRPopLPushGC [12 ms]
  Passed ClusterFailoverAttachReplicas(False,True,False,True) [3 s]
  Passed CanHandleNoPrexistentKey [1 s]
  Passed CanReturnEmptyArrayinListLC [15 ms]
  Passed CanReturnErrorWhenMissingParametersLC [3 ms]
  Passed CanReturnNilWhenNonExistingListLC [3 ms]
  Passed CanSendErrorInWrongTypeLC [5 ms]
  Passed CanUseLMoveGC [16 ms]
  Passed CanUseLMoveWithCancellationTokenGC [12 ms]
  Passed ListPushPopStressTest [3 s]
  Passed MultiLPUSHAndLLENWithPendingStatus [26 ms]
  Passed MultiLPUSHAndLPOPV1 [14 ms]
  Passed MultiLPUSHAndLPOPV2 [7 ms]
  Passed MultiLPUSHAndLTRIM [14 ms]
  Passed MultiRPUSHAndRPOP [12 ms]
  Passed MetricsDisabledTest [64 ms]
  Passed ClusterFailoverAttachReplicas(False,True,False,False) [3 s]
  Passed MetricsEnabledTest [2 s]
  Passed BasicPSUBSCRIBE [23 ms]
  Passed BasicSUBSCRIBE [38 ms]
  Passed CanDoMemoryUsage [32 ms]
  Passed CanGetKeyType [22 ms]
  Passed CanUsePatternsInKeysTest [244 ms]
  Passed CanUsePatternsInKeysTestLC [35 ms]
  Passed CanUseScanAllKeys [150 ms]
  Passed CanUseScanKeysAndObjects [212 ms]
  Passed CanUseScanKeysCountAndStringType [92 ms]
  Passed CanUseScanKeysCountAndTypeWithObjects [133 ms]
  Passed CanUseScanKeysTypeAndMatch [136 ms]
  Passed CanUseScanKeysWithCount [136 ms]
  Passed CanUseScanKeysWithMatchAndCount [105 ms]
  Passed CanUseScanWithEmptyStore [18 ms]
  Passed CanUseScanWithMatch [18 ms]
  Passed CustomObjectScanCommandTest [24 ms]
  Passed SeDbsizeTest [36 ms]
  Passed SeKeysPatternMatchingTest [122 ms]
  Passed SeKeysPatternMatchingTestVerbatim [174 ms]
  Passed SeKeysPatternTest [45 ms]
  Passed SeKeysTest [156 ms]
  Passed CanAddAndGetAllMembersWithPendingStatus [27 ms]
  Passed CanAddAndListMembers [6 ms]
  Passed CanAddAndListMembersLC [3 ms]
  Passed CanCheckIfMemberExistsInSet [10 ms]
  Passed CanCheckIfMemberExistsInSetLC [7 ms]
  Passed CanDoSCARDCommandLC [4 ms]
  Passed ClusterFailoverAttachReplicas(False,False,True,True) [3 s]
  Passed CanDoSCARDCommandsLC [2 ms]
  Passed CanDoSCARDCommandWhenKeyDoesNotExistLC [2 ms]
  Passed CanDoSPOPCommandLC [12 ms]
  Passed CanDoSPOPCommandWhenKeyDoesNotExistLC [3 ms]
  Passed CanDoSPOPWithCountCommandLC [37 ms]
  Passed CanDoSREMLC [5 ms]
  Passed CanDoSScanWithCursor [45 ms]
  Passed CanRemoveField [13 ms]
  Passed CanReturnEmptySet [6 ms]
  Passed CanReturnEmptySetLC [2 ms]
  Passed CanUseNotExistingSetwithSMembers [2 ms]
  Passed CanUseSScanNoParameters [9 ms]
  Passed CanUseSScanWithCollection [7 ms]
  Passed CanUseSScanWithMatch [7 ms]
  Passed MultiWithNonExistingSet [7 ms]
  Passed CanDoExecuteForStringResultCallback [21 ms]
  Passed CanDoZAddGarnetAsync [23 ms]
  Passed CanDoZAddGarnetCallback [31 ms]
  Passed ClusterFailoverAttachReplicas(False,False,True,False) [2 s]
  Passed ClusterFailoverAttachReplicas(False,False,False,True) [2 s]
  Passed ClusterFailoverAttachReplicas(False,False,False,False) [2 s]
  Passed CanDoZAddGarnetMultithread [9 s]
  Passed CanDoZCardGarnetUsingMemoryResultAsync [22 ms]
  Passed CanGarnetClientUseZaddZrem [21 ms]
  Passed CanGarnetClientUseZaddZremWithCallback [25 ms]
  Passed CanGarnetClientUseZCard [29 ms]
  Passed CanUseExecuteForMemoryResultArrayWithCancellationTokenAsync [30 ms]
  Passed CanUseExecuteForMemoryResultWithCancellationTokenAsync [42 ms]
  Passed CanUseExecuteForStringArrayResult [30 ms]
  Passed CanUseExecuteForStringResultAsync [41 ms]
  Passed CanContinueWhenInvalidPairInGeoAdd(10) [6 ms]
  Passed CanContinueWhenInvalidPairInGeoAdd(50) [3 ms]
  Passed CanContinueWhenInvalidPairInGeoAdd(100) [3 ms]
  Passed CanContinueWhenNotEnoughParametersInGeoAdd(10) [2 ms]
  Passed CanContinueWhenNotEnoughParametersInGeoAdd(50) [2 ms]
  Passed CanContinueWhenNotEnoughParametersInGeoAdd(100) [5 ms]
  Passed CanDoGeoAddWhenInvalidPairLC(10) [7 ms]
  Passed CanDoGeoAddWhenInvalidPairLC(50) [7 ms]
  Passed CanDoGeoAddWhenInvalidPairLC(100) [5 ms]
  Passed CanDoGeoAddWhenInvalidPairLC(1000) [7 ms]
  Passed ClusterReplicationCheckpointCleanupTest(True,True,True) [1 s]
  Passed CanEncodeAndDecodeCoordinates [14 ms]
  Passed CanEncodeAndDecodeCoordinatesWithGeoHashCode [16 ms]
  Passed CanReturnNullGeoDistLC(10) [6 ms]
  Passed CanReturnNullGeoDistLC(50) [31 ms]
  Passed CanReturnNullGeoDistLC(100) [4 ms]
  Passed CanUseGeoAdd [8 ms]
  Passed CanUseGeoAddWhenLTM [2 s]
  Passed CanUseGeoDist(10) [7 ms]
  Passed CanUseGeoDist(50) [6 ms]
  Passed CanUseGeoDist(100) [9 ms]
  Passed CanUseGeoHash(10) [11 ms]
  Passed CanUseGeoHash(50) [5 ms]
  Passed CanUseGeoHash(100) [5 ms]
  Passed CanUseGeoPos [23 ms]
  Passed CanUseGeoPosLC(10) [10 ms]
  Passed CanUseGeoPosLC(40) [10 ms]
  Passed CanUseGeoPosLC(100) [5 ms]
  Passed CanUseGeoSearchWithCities(10) [74 ms]
  Passed CanUseGeoSearchWithCities(50) [13 ms]
  Passed CanUseGeoSearchWithCities(100) [14 ms]
  Passed CanValidateUnknownWithNotSupportedOptions [18 ms]
  Passed AddAndLength [20 ms]
  Passed AddPopDesc [26 ms]
  Passed AddRemove [34 ms]
  Passed AddScore [13 ms]
  Passed CanAddDuplicateScoreLC(10) [23 ms]
  Passed CanAddDuplicateScoreLC(50) [4 ms]
  Passed CanAddDuplicateScoreLC(100) [7 ms]
  Passed CanContinueOnInvalidInput [9 ms]
  Passed CanCreateLeaderBoard [12 ms]
  Passed CanCreateNewSortedSetWithIncrbyLC(10) [9 ms]
  Passed CanCreateNewSortedSetWithIncrbyLC(30) [5 ms]
  Passed CanCreateNewSortedSetWithIncrbyLC(100) [4 ms]
  Passed CandDoZIncrby [10 ms]
  Passed CanDoIncrByLC(10) [9 ms]
  Passed CanDoIncrByLC(30) [8 ms]
  Passed CanDoIncrByLC(100) [7 ms]
  Passed CanDoZCountLC(10) [7 ms]
  Passed CanDoZCountLC(30) [5 ms]
  Passed CanDoZCountLC(100) [8 ms]
  Passed CanDoZMScore [20 ms]
  Passed CanDoZMScoreLC [6 ms]
  Passed CanDoZRangeByIndexLC(10) [13 ms]
  Passed CanDoZRangeByIndexLC(30) [29 ms]
  Passed CanDoZRangeByIndexLC(100) [9 ms]
  Passed CanDoZRangeByIndexReverse(10) [10 ms]
  Passed CanDoZRangeByIndexReverse(50) [9 ms]
  Passed CanDoZRangeByIndexReverse(100) [5 ms]
  Passed CanDoZRangeByLex [11 ms]
  Passed CanDoZRangeByLexWithLimit [5 ms]
  Passed CanDoZRangeByScoreLC(10) [4 ms]
  Passed CanDoZRangeByScoreLC(50) [5 ms]
  Passed CanDoZRangeByScoreLC(100) [5 ms]
  Passed CanDoZRangeByScoreWithLimitLC(2) [5 ms]
  Passed CanDoZRangeByScoreWithLimitLC(10) [7 ms]
  Passed CanDoZRangeByScoreWithLimitLC(50) [5 ms]
  Passed CanDoZRangeByScoreWithLimitLC(100) [5 ms]
  Passed CanDoZRankLC(10) [8 ms]
  Passed CanDoZRankLC(30) [6 ms]
  Passed CanDoZRankLC(100) [4 ms]
  Passed CanDoZRemRangeByLexLC(10) [8 ms]
  Passed CanDoZRemRangeByLexLC(30) [5 ms]
  Passed CanDoZRemRangeByLexLC(100) [5 ms]
  Passed CanDoZRemRangeByRank(10) [31 ms]
  Passed CanDoZRemRangeByRank(50) [11 ms]
  Passed CanDoZRemRangeByRank(100) [10 ms]
  Passed CanDoZRemRangeByScore(10) [6 ms]
  Passed CanDoZRemRangeByScore(50) [6 ms]
  Passed CanDoZRemRangeByScore(100) [6 ms]
  Passed CanDoZRevRankLC(10) [7 ms]
  Passed CanDoZRevRankLC(30) [9 ms]
  Passed CanDoZRevRankLC(100) [5 ms]
  Passed CanDoZScanWithCursor [49 ms]
  Passed CanFailWhenUseMultiWatchTest [13 ms]
  Passed CanFastForwardExtraArguments [7 ms]
  Passed CanGetScoresZCount [10 ms]
  Passed CanHaveEqualScores [5 ms]
  Passed CanManageAddAndDelete [12 ms]
  Passed CanManageErrorsInZCountLC(10) [9 ms]
  Passed CanManageErrorsInZCountLC(30) [8 ms]
  Passed CanManageErrorsInZCountLC(100) [10 ms]
  Passed CanManageExistingKeyButOtherTypeLC(10) [4 ms]
  Passed CanManageExistingKeyButOtherTypeLC(30) [8 ms]
  Passed CanManageExistingKeyButOtherTypeLC(100) [6 ms]
  Passed CanManageKeyAbscentInCommands [11 ms]
  Passed CanManageNoParametersInZIncrbyLC [4 ms]
  Passed CanManageNotExistingKeySE [20 ms]
  Passed CanManageNotExistingKeySortedSetCommandsReadOps [17 ms]
  Passed CanManageNotExistingKeySortedSetCommandsRMWOps [21 ms]
  Passed CanManageRMWAndReadInCommands [6 ms]
  Passed CanSendErrorZRangeWithLimit(10) [5 ms]
  Passed CanSendErrorZRangeWithLimit(50) [6 ms]
  Passed CanSendErrorZRangeWithLimit(100) [5 ms]
  Passed CanUseMultiTest [6 ms]
  Passed CanUseZDiff(10) [6 ms]
  Passed CanUseZDiff(30) [5 ms]
  Passed CanUseZDiff(100) [6 ms]
  Passed CanUseZDiffMultipleKeys(10) [7 ms]
  Passed CanUseZDiffMultipleKeys(30) [6 ms]
  Passed CanUseZDiffMultipleKeys(100) [26 ms]
  Passed CanUseZDiffWithNull [5 ms]
  Passed CanUseZLexCount(10) [7 ms]
  Passed CanUseZLexCount(30) [8 ms]
  Passed CanUseZLexCount(100) [7 ms]
  Passed CanUseZPopMin(10) [6 ms]
  Passed ClusterReplicationCheckpointCleanupTest(True,True,False) [2 s]
  Passed CanUseZPopMin(30) [5 ms]
  Passed CanUseZPopMin(100) [5 ms]
  Passed CanUseZRandMember(10) [19 ms]
  Passed CanUseZRandMember(30) [9 ms]
  Passed CanUseZRandMember(100) [9 ms]
  Passed CanUseZRandMemberWithSE [19 ms]
  Passed CanUseZRangeByScoreWithSE [14 ms]
  Passed CanUseZRevRange [11 ms]
  Passed CanUseZRevRangeCitiesCommandInChunksLC(10) [9 ms]
  Passed CanUseZRevRangeCitiesCommandInChunksLC(50) [4 ms]
  Passed CanUseZRevRangeCitiesCommandInChunksLC(100) [7 ms]
  Passed CanUseZScanNoParameters [16 ms]
  Passed CanUseZScanWithCollection [16 ms]
  Passed CanUseZScanWithDoubleDifferentFormats [14 ms]
  Passed CanUseZScanWithMatch [10 ms]
  Passed CanValidateInvalidParamentersZCountLC(10) [8 ms]
  Passed CanValidateInvalidParamentersZCountLC(50) [10 ms]
  Passed CanValidateInvalidParamentersZCountLC(100) [9 ms]
  Passed ClusterReplicationCheckpointCleanupTest(True,False,True) [1 s]
  Passed CreateLeaderBoardWithZADDWithStatusPending [125 ms]
  Passed AppendTest [41 ms]
  Passed AskingTest [32 ms]
  Passed ClusterReplicationCheckpointCleanupTest(True,False,False) [917 ms]
  Passed CanDoCommandsInChunks(10) [2 s]
[000.2024-04-06 12:23:05.8984.(crit)] |ClusterReplicationCheckpointCleanupTest(False,True,True)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:34620] [03F7A345] ProcessMessages threw exception^
[000.2024-04-06 12:23:05.9001.(errr)] |ClusterReplicationCheckpointCleanupTest(False,True,True)| <ClusterManager-127.0.0.1:7000>  ^OverlappedStream GetQueuedCompletionStatus error: 4294967295 msg: Unknown error -1^
[000.2024-04-06 12:23:05.9019.(crit)] |ClusterReplicationCheckpointCleanupTest(False,True,True)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:34608] [023FE564] ProcessMessages threw exception^
  Passed ClusterReplicationCheckpointCleanupTest(False,True,True) [1 s]
  Passed ClusterReplicationCheckpointCleanupTest(False,True,False) [1 s]
  Passed CanDoCommandsInChunks(50) [2 s]
  Passed ClusterReplicationCheckpointCleanupTest(False,False,True) [1 s]
  Passed CanDoCommandsInChunks(100) [2 s]
  Passed ClusterReplicationCheckpointCleanupTest(False,False,False) [882 ms]
  Passed CanSelectCommand [17 ms]
  Passed CanSelectCommandLC [19 ms]
  Passed CanSetGetCommandsChunks(10) [36 ms]
  Passed CanSetGetCommandsChunks(50) [35 ms]
  Passed CanSetGetCommandsChunks(100) [36 ms]
  Passed GetDelTest [39 ms]
  Passed GetSliceTest [27 ms]
[000.2024-04-06 12:23:11.6640.(errr)] |ClusterDontKnowReplicaFailTest(True,True,True,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: faa3df81aef8fd2916f10dfa5c9c9d129bf4ebbb^
[000.2024-04-06 12:23:11.6643.(errr)] |ClusterDontKnowReplicaFailTest(True,True,True,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: faa3df81aef8fd2916f10dfa5c9c9d129bf4ebbb
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterMainMemoryReplicationAttachReplicas [2 s]
  Passed KeepTtlTest [3 s]
  Passed KeyExpireObjectTest("EXPIRE") [1 s]
  Passed KeyExpireObjectTest("PEXPIRE") [1 s]
  Passed KeyExpireOptionsTest("EXPIRE") [22 ms]
  Passed KeyExpireOptionsTest("PEXPIRE") [26 ms]
  Passed ClusterDontKnowReplicaFailTest(True,True,True,True) [6 s]
  Passed KeyExpireStringTest("EXPIRE") [1 s]
[000.2024-04-06 12:23:18.5640.(errr)] |ClusterDontKnowReplicaFailTest(True,True,True,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: ddcbf20b0f9cd283427979c6572202d384776e8e^
[000.2024-04-06 12:23:18.5644.(errr)] |ClusterDontKnowReplicaFailTest(True,True,True,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: ddcbf20b0f9cd283427979c6572202d384776e8e
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed KeyExpireStringTest("PEXPIRE") [1 s]
  Passed LargeSetGet [34 ms]
  Passed LockTakeRelease [2 s]
  Passed MultiKeyDelete(True) [32 ms]
  Passed MultiKeyDelete(False) [29 ms]
  Passed MultiKeyDeleteObjectStore [29 ms]
  Passed MultiKeyUnlink(True) [49 ms]
  Passed MultiKeyUnlink(False) [32 ms]
  Passed MultiKeyUnlinkObjectStore [23 ms]
  Passed MultipleExistsKeysAndObjects [16 ms]
  Passed MultiSetGet [211 ms]
  Passed ObjectTTLTest [16 ms]
  Passed PersistTest [15 ms]
  Passed PersistTTLTest [3 s]
  Passed ClusterDontKnowReplicaFailTest(True,True,True,False) [6 s]
[000.2024-04-06 12:23:25.2952.(errr)] |ClusterDontKnowReplicaFailTest(True,True,False,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 167c60a43fcc011cb1f6ee4f57fbcbbebe139428^
[000.2024-04-06 12:23:25.2954.(errr)] |ClusterDontKnowReplicaFailTest(True,True,False,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 167c60a43fcc011cb1f6ee4f57fbcbbebe139428
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed PingTest [28 ms]
  Passed SetExpiry [2 s]
  Passed SetExpiryHighPrecision [3 s]
  Passed ClusterDontKnowReplicaFailTest(True,True,False,True) [6 s]
[000.2024-04-06 12:23:31.9558.(errr)] |ClusterDontKnowReplicaFailTest(True,True,False,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 712ddab4d4a46ebd814395735f540ec4b927d7e5^
[000.2024-04-06 12:23:31.9560.(errr)] |ClusterDontKnowReplicaFailTest(True,True,False,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 712ddab4d4a46ebd814395735f540ec4b927d7e5
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed SetExpiryIncr [5 s]
  Passed SetExpiryNx [4 s]
  Passed ClusterDontKnowReplicaFailTest(True,True,False,False) [6 s]
[000.2024-04-06 12:23:38.6695.(errr)] |ClusterDontKnowReplicaFailTest(True,False,True,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 66a04d66b87997e97015203d089db28d40b9fdbc^
[000.2024-04-06 12:23:38.6699.(errr)] |ClusterDontKnowReplicaFailTest(True,False,True,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 66a04d66b87997e97015203d089db28d40b9fdbc
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed SetGet [20 ms]
  Passed SetOptionsCaseSensitivityTest [6 s]
  Passed SetRangeTest [30 ms]
  Passed SetXx [19 ms]
  Passed SingleAsciiSetGetGarnetClient [30 ms]
  Passed SingleDecr("key1",1000) [30 ms]
  Passed SingleDecrBy(-1000,100) [41 ms]
  Passed SingleDecrBy(-1000,-9000) [17 ms]
  Passed SingleDecrBy(-10000,9000) [16 ms]
  Passed SingleDecrBy(9000,10000) [15 ms]
  Passed SingleDecrByNoKey [20 ms]
  Passed ClusterDontKnowReplicaFailTest(True,False,True,True) [6 s]
[000.2024-04-06 12:23:45.3802.(errr)] |ClusterDontKnowReplicaFailTest(True,False,True,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: a480cc8f0e5d4058f6069c3fc442958cc4f9fc87^
[000.2024-04-06 12:23:45.3804.(errr)] |ClusterDontKnowReplicaFailTest(True,False,True,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: a480cc8f0e5d4058f6069c3fc442958cc4f9fc87
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed SingleDelete [13 ms]
  Passed SingleDeleteWithObjectStoreDisable_LTM [55 ms]
  Passed SingleDeleteWithObjectStoreDisabled [35 ms]
  Passed SingleExists(True) [57 ms]
  Passed SingleExists(False) [29 ms]
  Passed SingleExistsObject [47 ms]
  Passed SingleIncr(10) [13 ms]
  Passed SingleIncr(50) [15 ms]
  Passed SingleIncr(100) [12 ms]
  Passed SingleIncrBy(9999,10) [14 ms]
  Passed SingleIncrBy(9999,50) [15 ms]
  Passed SingleIncrBy(9999,100) [14 ms]
  Passed SingleIncrNoKey [24 ms]
  Passed SingleRename [26 ms]
  Passed SingleRenameKeyEdgeCase(True) [50 ms]
  Passed SingleRenameKeyEdgeCase(False) [126 ms]
  Passed SingleRenameObjectStore [219 ms]
  Passed SingleSetGet [127 ms]
  Passed SingleUnicodeSetGetGarnetClient [231 ms]
  Passed StrlenTest [16 ms]
  Passed TTLTestMilliseconds [3 s]
  Passed UniqueRespCommandIds [22 ms]
  Passed SingleUnicodeSetGetGarnetClient [30 ms]
  Passed ClusterDontKnowReplicaFailTest(True,False,True,False) [6 s]
[000.2024-04-06 12:23:52.0591.(errr)] |ClusterDontKnowReplicaFailTest(True,False,False,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 27baf7ace7362d9025ca32f7cee3dd510d5e3118^
[000.2024-04-06 12:23:52.0594.(errr)] |ClusterDontKnowReplicaFailTest(True,False,False,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 27baf7ace7362d9025ca32f7cee3dd510d5e3118
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed TlsCanDoCommandsInChunks(10) [2 s]
  Passed TlsCanDoCommandsInChunks(50) [2 s]
  Passed TlsCanDoCommandsInChunks(100) [2 s]
  Passed TlsCanSelectCommand [52 ms]
  Passed TlsCanSelectCommandLC [45 ms]
  Passed TlsCanSetGetCommandsChunks(10) [23 ms]
  Passed TlsCanSetGetCommandsChunks(50) [26 ms]
  Passed TlsCanSetGetCommandsChunks(100) [21 ms]
  Passed TlsLargeSetGet [28 ms]
  Passed TlsLockTakeRelease [2 s]
  Passed TlsMultiSetGet [93 ms]
  Passed ClusterDontKnowReplicaFailTest(True,False,False,True) [6 s]
[000.2024-04-06 12:23:58.7309.(errr)] |ClusterDontKnowReplicaFailTest(True,False,False,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 5694962a04b7ca6cc81bbc75bdb27f88ec1ac6a5^
[000.2024-04-06 12:23:58.7311.(errr)] |ClusterDontKnowReplicaFailTest(True,False,False,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 5694962a04b7ca6cc81bbc75bdb27f88ec1ac6a5
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed TlsSetExpiry [2 s]
  Passed TlsSetExpiryIncr [5 s]
  Passed ClusterDontKnowReplicaFailTest(True,False,False,False) [6 s]
[000.2024-04-06 12:24:05.3658.(errr)] |ClusterDontKnowReplicaFailTest(False,True,True,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: a16aaae7082e830ff2cac39807cf3518f7d4da31^
[000.2024-04-06 12:24:05.3659.(errr)] |ClusterDontKnowReplicaFailTest(False,True,True,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: a16aaae7082e830ff2cac39807cf3518f7d4da31
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed TlsSetExpiryNx [4 s]
  Passed TlsSetXx [30 ms]
  Passed TlsSingleDecr("key1",1000) [31 ms]
  Passed TlsSingleDecrBy(-1000,100) [42 ms]
  Passed TlsSingleDecrBy(-1000,-9000) [24 ms]
  Passed TlsSingleDecrBy(-10000,9000) [20 ms]
  Passed TlsSingleDecrBy(9000,10000) [25 ms]
  Passed TlsSingleDelete [21 ms]
  Passed TlsSingleExists [21 ms]
  Passed TlsSingleIncrNoKey [23 ms]
  Passed TlsSingleRename [25 ms]
  Passed TlsSingleSetGet [23 ms]
  Passed TlsSingleSetGetGarnetClient [23 ms]
  Passed TransactionDeleteProcTest [15 ms]
  Passed TransactionHashProcTest [17 ms]
  Passed TransactionListsOperTest [15 ms]
  Passed TransactionObjectExpiryProcTest [1 s]
  Passed TransactionObjectsOperTest [30 ms]
  Passed TransactionProcFinalizeTest [28 ms]
  Passed TransactionProcSampleDeleteTest [37 ms]
  Passed TransactionProcSampleUpdateTest [19 ms]
  Passed TransactionProcTest1 [17 ms]
  Passed TransactionProcTest2 [16 ms]
  Passed TransactionSetProcTest [17 ms]
  Passed TransactionSortedSetRemoveProcTest [14 ms]
  Passed TransactionWriteExpiryProcTest [36 ms]
  Passed LargeTxn(512) [210 ms]
  Passed LargeTxn(2048) [896 ms]
  Passed ClusterDontKnowReplicaFailTest(False,True,True,True) [6 s]
[000.2024-04-06 12:24:11.9324.(errr)] |ClusterDontKnowReplicaFailTest(False,True,True,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 1d05cbb3edd1040ffd1f8976ce53d552ff00c7f0^
[000.2024-04-06 12:24:11.9326.(errr)] |ClusterDontKnowReplicaFailTest(False,True,True,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 1d05cbb3edd1040ffd1f8976ce53d552ff00c7f0
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed LargeTxn(8192) [3 s]
  Passed LargeTxnWatch(512) [211 ms]
  Passed LargeTxnWatch(2048) [811 ms]
  Passed LargeTxnWatch(4096) [1 s]
  Passed SimpleWatchTest [20 ms]
  Passed TxnGetSetTest [27 ms]
  Passed TxnGetTest [19 ms]
  Passed TxnSetTest [15 ms]
NUnit Adapter 4.5.0.0: Test execution complete
  Passed WatchKeyFromDisk [627 ms]
  Passed WatchNonExistentKey [13 ms]

Test Run Successful.
Total tests: 635
     Passed: 622
    Skipped: 13
 Total time: 5.3679 Minutes
  Passed ClusterDontKnowReplicaFailTest(False,True,True,False) [6 s]
[000.2024-04-06 12:24:18.4555.(errr)] |ClusterDontKnowReplicaFailTest(False,True,False,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 7a99c0e8575d1f1da7256d1d54f6233b376dc1f9^
[000.2024-04-06 12:24:18.4557.(errr)] |ClusterDontKnowReplicaFailTest(False,True,False,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 7a99c0e8575d1f1da7256d1d54f6233b376dc1f9
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterDontKnowReplicaFailTest(False,True,False,True) [6 s]
[000.2024-04-06 12:24:24.9842.(errr)] |ClusterDontKnowReplicaFailTest(False,True,False,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 2fd78efe46bb07c9f6bec82373fd8d26c63a8709^
[000.2024-04-06 12:24:24.9845.(errr)] |ClusterDontKnowReplicaFailTest(False,True,False,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 2fd78efe46bb07c9f6bec82373fd8d26c63a8709
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterDontKnowReplicaFailTest(False,True,False,False) [6 s]
[000.2024-04-06 12:24:31.4676.(errr)] |ClusterDontKnowReplicaFailTest(False,False,True,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: abc7c8127812ebf179eb6bdc6eb0220a8e29cbe0^
[000.2024-04-06 12:24:31.4679.(errr)] |ClusterDontKnowReplicaFailTest(False,False,True,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: abc7c8127812ebf179eb6bdc6eb0220a8e29cbe0
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterDontKnowReplicaFailTest(False,False,True,True) [6 s]
[000.2024-04-06 12:24:37.9862.(errr)] |ClusterDontKnowReplicaFailTest(False,False,True,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: feac72b6b65f2fe5ff26f08732cc66abaa935e7b^
[000.2024-04-06 12:24:37.9866.(errr)] |ClusterDontKnowReplicaFailTest(False,False,True,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: feac72b6b65f2fe5ff26f08732cc66abaa935e7b
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterDontKnowReplicaFailTest(False,False,True,False) [6 s]
[000.2024-04-06 12:24:44.5198.(errr)] |ClusterDontKnowReplicaFailTest(False,False,False,True)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 560c37c985de5b8427c8c6f8f8dcc4d6c43b3e2b^
[000.2024-04-06 12:24:44.5200.(errr)] |ClusterDontKnowReplicaFailTest(False,False,False,True)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 560c37c985de5b8427c8c6f8f8dcc4d6c43b3e2b
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterDontKnowReplicaFailTest(False,False,False,True) [6 s]
[000.2024-04-06 12:24:51.0495.(errr)] |ClusterDontKnowReplicaFailTest(False,False,False,False)| <StoreWrapper>  ^-PRIMARY-ERR don't know about replicaId: 36b93d3995ec51121ee64c5ec41ab38dbc98305c^
[000.2024-04-06 12:24:51.0497.(errr)] |ClusterDontKnowReplicaFailTest(False,False,False,False)| <StoreWrapper> System.Exception: PRIMARY-ERR don't know about replicaId: 36b93d3995ec51121ee64c5ec41ab38dbc98305c
   at Garnet.cluster.ReplicationManager.InitiateReplicaSync() in /home/builder/Workspaces/garnet/libs/cluster/Server/Replication/ReplicaOps/ReplicaReceiveCheckpoint.cs:line 140 ^An error occurred at ReplicationManager.RetrieveStoreCheckpoint^
  Passed ClusterDontKnowReplicaFailTest(False,False,False,False) [6 s]
  Passed ClusterDivergentReplicasTest(True,True,True) [3 s]
  Passed ClusterDivergentReplicasTest(True,True,False) [3 s]
  Passed ClusterDivergentReplicasTest(True,False,True) [3 s]
  Passed ClusterDivergentReplicasTest(True,False,False) [3 s]
  Passed ClusterDivergentReplicasTest(False,True,True) [3 s]
  Passed ClusterDivergentReplicasTest(False,True,False) [3 s]
  Passed ClusterDivergentReplicasTest(False,False,True) [3 s]
  Passed ClusterDivergentReplicasTest(False,False,False) [3 s]
  Passed ClusterDivergentCheckpointTest(True,True) [3 s]
[000.2024-04-06 12:25:28.5201.(errr)] |ClusterDivergentCheckpointTest(True,False)| <TsavoriteLog [aof]>  ^AsyncFlushPageCallback error: 4294967295^
[000.2024-04-06 12:25:29.4826.(errr)] |ClusterDivergentCheckpointTest(True,False)| <TsavoriteLog [aof]>  ^AsyncFlushPageCallback error: 4294967295^
  Passed ClusterDivergentCheckpointTest(True,False) [3 s]
  Passed ClusterDivergentCheckpointTest(False,True) [3 s]
  Passed ClusterDivergentCheckpointTest(False,False) [3 s]
  Passed ClusterDivergentReplicasMMTest(True,True,True) [3 s]
  Passed ClusterDivergentReplicasMMTest(True,True,False) [3 s]
  Passed ClusterDivergentReplicasMMTest(True,False,True) [3 s]
  Passed ClusterDivergentReplicasMMTest(True,False,False) [3 s]
  Passed ClusterDivergentReplicasMMTest(False,True,True) [3 s]
  Passed ClusterDivergentReplicasMMTest(False,True,False) [3 s]
  Passed ClusterDivergentReplicasMMTest(False,False,True) [3 s]
  Passed ClusterDivergentReplicasMMTest(False,False,False) [3 s]
  Passed ClusterDivergentCheckpointMMTest(True,True) [3 s]
  Passed ClusterDivergentCheckpointMMTest(True,False) [3 s]
  Passed ClusterDivergentCheckpointMMTest(False,True) [3 s]
  Passed ClusterDivergentCheckpointMMTest(False,False) [3 s]
  Passed ClusterDivergentCheckpointMMFastCommitTest(True,True) [3 s]
  Passed ClusterDivergentCheckpointMMFastCommitTest(True,False) [3 s]
  Passed ClusterDivergentCheckpointMMFastCommitTest(False,True) [3 s]
[000.2024-04-06 12:26:27.7034.(errr)] |ClusterDivergentCheckpointMMFastCommitTest(False,False)| <TsavoriteLog [aof]>  ^AsyncFlushPageCallback error: 4294967295^
  Passed ClusterDivergentCheckpointMMFastCommitTest(False,False) [3 s]
[000.2024-04-06 12:26:28.8200.(crit)] |ClusterTLSInitialize| <Session> System.IO.IOException: The write operation failed, see inner exception.
 ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
   at Garnet.networking.NetworkHandler`2.NetworkHandlerStream.Write(ReadOnlySpan`1 buffer) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandlerStream.cs:line 98
   at System.Net.Security.SslStream.WriteSingleChunk[TIOAdapter](ReadOnlyMemory`1 buffer, CancellationToken cancellationToken)
   at System.Net.Security.SslStream.WriteAsyncInternal[TIOAdapter](ReadOnlyMemory`1 buffer, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Security.SslStream.WriteAsyncInternal[TIOAdapter](ReadOnlyMemory`1 buffer, CancellationToken cancellationToken)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7001] [127.0.0.1:57862] [008859E5] ProcessMessages threw exception^
  Passed ClusterTLSInitialize [1 s]
[000.2024-04-06 12:26:30.3491.(warn)] |ClusterTLSSlotChangeStatus| <GarnetServer>  ^ClientCertificateRequired is true and IssuerCertificatePath is not provided. The remote certificate chain will not be validated against issuer.^
[000.2024-04-06 12:26:30.3759.(warn)] |ClusterTLSSlotChangeStatus| <GarnetServer>  ^ClientCertificateRequired is true and IssuerCertificatePath is not provided. The remote certificate chain will not be validated against issuer.^
[000.2024-04-06 12:26:30.4071.(warn)] |ClusterTLSSlotChangeStatus| <GarnetServer>  ^ClientCertificateRequired is true and IssuerCertificatePath is not provided. The remote certificate chain will not be validated against issuer.^
  Passed ClusterTLSSlotInfo [1 s]
  Passed ClusterTLSAddDelSlots [268 ms]
[000.2024-04-06 12:26:31.4641.(warn)] |ClusterTLSSlotChangeStatus| <ClusterManager-127.0.0.1:7000>  ^GossipMain terminated with error A task was canceled.^
[000.2024-04-06 12:26:31.4645.(warn)] |ClusterTLSSlotChangeStatus| <ClusterManager-127.0.0.1:7001>  ^GossipMain terminated with error A task was canceled.^
[000.2024-04-06 12:26:31.4646.(warn)] |ClusterTLSSlotChangeStatus| <ClusterManager-127.0.0.1:7002>  ^GossipMain terminated with error A task was canceled.^
  Passed ClusterTLSSlotChangeStatus [1 s]
  Passed ClusterTLSRedirectMessage [254 ms]
  Passed ClusterTLSMigrateSlots [1 s]
  Passed ClusterTLSMigrateSlotsExpiry [6 s]
  Passed ClusterTLSMigrateSlotsWithObjects [1 s]
  Passed ClusterTLSMigrateKeys [3 s]
  Passed ClusterTLSMigrateKeysWithObjects [2 s]
  Passed ClusterTLSMigratetWithReadWrite [1 s]
  Passed ClusterTLSR(True) [1 s]
  Passed ClusterTLSR(False) [1 s]
[000.2024-04-06 12:26:53.5230.(errr)] |ClusterTLSRCheckpointRestartSecondary(True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRCheckpointRestartSecondary(True,True) [4 s]
[000.2024-04-06 12:26:57.8296.(errr)] |ClusterTLSRCheckpointRestartSecondary(True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRCheckpointRestartSecondary(True,False) [4 s]
[000.2024-04-06 12:27:02.0385.(errr)] |ClusterTLSRCheckpointRestartSecondary(False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRCheckpointRestartSecondary(False,True) [3 s]
[000.2024-04-06 12:27:06.0201.(errr)] |ClusterTLSRCheckpointRestartSecondary(False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRCheckpointRestartSecondary(False,False) [3 s]
[000.2024-04-06 12:27:10.3223.(errr)] |ClusterTLSRPrimaryCheckpoint(True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpoint(True,True) [4 s]
[000.2024-04-06 12:27:15.2179.(errr)] |ClusterTLSRPrimaryCheckpoint(True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpoint(True,False) [4 s]
[000.2024-04-06 12:27:19.7575.(errr)] |ClusterTLSRPrimaryCheckpoint(False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpoint(False,True) [4 s]
[000.2024-04-06 12:27:24.3441.(errr)] |ClusterTLSRPrimaryCheckpoint(False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpoint(False,False) [4 s]
[000.2024-04-06 12:27:26.1194.(crit)] |ClusterTLSRPrimaryCheckpointRetrieve(True,True,True,True)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:43966] [024ECB42] ProcessMessages threw exception^
[000.2024-04-06 12:27:27.1209.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,True,True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,True,True,True) [3 s]
[000.2024-04-06 12:27:30.1611.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,True,True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,True,True,False) [2 s]
[000.2024-04-06 12:27:32.9982.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,True,False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,True,False,True) [2 s]
[000.2024-04-06 12:27:35.7081.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,True,False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,True,False,False) [2 s]
[000.2024-04-06 12:27:38.4767.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,False,True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,False,True,True) [2 s]
[000.2024-04-06 12:27:41.2265.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,False,True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,False,True,False) [2 s]
[000.2024-04-06 12:27:43.9113.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,False,False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,False,False,True) [2 s]
[000.2024-04-06 12:27:46.3892.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(True,False,False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(True,False,False,False) [2 s]
[000.2024-04-06 12:27:47.8748.(crit)] |ClusterTLSRPrimaryCheckpointRetrieve(False,True,True,True)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:35912] [012C15C1] ProcessMessages threw exception^
[000.2024-04-06 12:27:48.8768.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,True,True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,True,True,True) [2 s]
[000.2024-04-06 12:27:51.5603.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,True,True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,True,True,False) [2 s]
[000.2024-04-06 12:27:54.2811.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,True,False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,True,False,True) [2 s]
[000.2024-04-06 12:27:55.8198.(crit)] |ClusterTLSRPrimaryCheckpointRetrieve(False,True,False,False)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:44434] [024CDEDA] ProcessMessages threw exception^
[000.2024-04-06 12:27:56.8217.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,True,False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,True,False,False) [2 s]
[000.2024-04-06 12:27:58.3889.(crit)] |ClusterTLSRPrimaryCheckpointRetrieve(False,False,True,True)| <Session> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.server.RespServerSession.ProcessMessages() in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 321
   at Garnet.server.RespServerSession.TryConsumeMessages(Byte* reqBuffer, Int32 bytesReceived) in /home/builder/Workspaces/garnet/libs/server/Resp/RespServerSession.cs:line 213 ^[127.0.0.1:7000] [127.0.0.1:44476] [02E08130] ProcessMessages threw exception^
[000.2024-04-06 12:27:59.3914.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,False,True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,False,True,True) [2 s]
[000.2024-04-06 12:28:02.0707.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,False,True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,False,True,False) [2 s]
[000.2024-04-06 12:28:04.7378.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,False,False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,False,False,True) [2 s]
[000.2024-04-06 12:28:07.2504.(errr)] |ClusterTLSRPrimaryCheckpointRetrieve(False,False,False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSRPrimaryCheckpointRetrieve(False,False,False,False) [2 s]
[000.2024-04-06 12:28:09.8113.(errr)] |ClusterTLSCheckpointRetrieveDisableStorageTier(True,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSCheckpointRetrieveDisableStorageTier(True,True) [2 s]
[000.2024-04-06 12:28:12.4776.(errr)] |ClusterTLSCheckpointRetrieveDisableStorageTier(True,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSCheckpointRetrieveDisableStorageTier(True,False) [2 s]
[000.2024-04-06 12:28:14.8783.(errr)] |ClusterTLSCheckpointRetrieveDisableStorageTier(False,True)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSCheckpointRetrieveDisableStorageTier(False,True) [2 s]
[000.2024-04-06 12:28:17.1885.(errr)] |ClusterTLSCheckpointRetrieveDisableStorageTier(False,False)| <StoreWrapper> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Security.SslStream'.
   at System.Net.Security.SslStream.<ThrowIfExceptional>g__ThrowExceptional|126_0(ExceptionDispatchInfo e)
   at System.Net.Security.SslStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at Garnet.networking.NetworkHandler`2.SendResponse(Int32 offset, Int32 size) in /home/builder/Workspaces/garnet/libs/common/Networking/NetworkHandler.cs:line 547
   at Garnet.client.GarnetClientSession.Flush() in /home/builder/Workspaces/garnet/libs/client/ClientSession/GarnetClientSession.cs:line 402 ^Exception calling networkSender.SendResponse in GarnetClientSession.Flush^
  Passed ClusterTLSCheckpointRetrieveDisableStorageTier(False,False) [2 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(True,True,True) [2 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(True,True,False) [1 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(True,False,True) [1 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(True,False,False) [1 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(False,True,True) [1 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(False,True,False) [1 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(False,False,True) [1 s]
  Passed ClusterTLSRAddReplicaAfterPrimaryCheckpoint(False,False,False) [1 s]
  Passed ClusterTLSRPrimaryRestart(True,True) [1 s]
  Passed ClusterTLSRPrimaryRestart(True,False) [1 s]
  Passed ClusterTLSRPrimaryRestart(False,True) [1 s]
  Passed ClusterTLSRPrimaryRestart(False,False) [1 s]
NUnit Adapter 4.5.0.0: Test execution complete
  Passed ClusterTLSRRedirectWrites [1 s]
  Passed ClusterTLSRReplicaOfTest(True) [405 ms]
  Passed ClusterTLSRReplicaOfTest(False) [256 ms]

Test Run Successful.
Total tests: 206
     Passed: 206
 Total time: 9.7025 Minutes

We can now try running it locally

builder@LuiGi:~/Workspaces/garnet$ cd main/GarnetServer/
builder@LuiGi:~/Workspaces/garnet/main/GarnetServer$ dotnet run -c Release -f net8.0
    _________
   /_||___||_\      Garnet 1.0.4 64 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

* Ready to accept connections

I actually kind of dig the low res ASCII art

/content/images/2024/04/garnet-01.png

Let’s now test our local server

$ redis-cli -p 3278

Other than running on a different port (3278), it behaved just like any other Redis server

/content/images/2024/04/garnet-02.png

If we want a bit more debug info, such as to see the connections, we can set that in the garnet.conf file (eg loglevel):

Cbuilder@LuiGi:~/Workspaces/garnet/main/GarnetServer$ cat garnet.conf
{
   "loglevel": "debug"
        /**********************************************************************************************************/
        /*                                      Garnet Configuration File                                         */
        /**********************************************************************************************************/
    /* Use this file to configure any values different from the defaults specified in libs/host/defaults.conf */
        /*                                                                                                        */
        /* Example:                                                                                               */
        /* "Port" : 1234,                                                                                         */
        /* "Address" : "1.2.3.4",                                                                                 */
        /* "MemorySize" : "32g",                                                                                  */
        /* ...                                                                                                    */
        /*                                                                                                        */
        /* In order to use this file, run GarnetServer with the --config-import-path command line argument        */
        /* (e.g. GarnetServer.exe --config-import-path /path/to/garnet.conf).                                     */
    /**********************************************************************************************************/
}

Then invoke the server with that config file loaded:

builder@LuiGi:~/Workspaces/garnet/main/GarnetServer$ dotnet run -c Debug -f net8.0 --config-import-path /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
    _________
   /_||___||_\      Garnet 1.0.4 64 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

07::38::39 info: GarnetServer[0] Garnet 1.0.4 64 bit; standalone mode; Port: 3278
07::38::39 info: ArgParser[0] Configuration import from embedded resource succeeded. Path: defaults.conf.
07::38::39 info: ArgParser[0] Configuration import from local machine succeeded. Path: /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf.
07::38::39 info: Options[0] [Store] Using page size of 32m
07::38::39 info: Options[0] [Store] Using log memory size of 16g
07::38::39 info: Options[0] [Store] There are 512 log pages in memory
07::38::39 info: Options[0] [Store] Using disk segment size of 1g
07::38::39 info: Options[0] [Store] Using hash index size of 8g (128m cache lines)
07::38::39 info: Options[0] [Store] Using log mutable percentage of 90%
07::38::39 info: Options[0] [Store] Not using Revivification
07::38::39 info: Options[0] [Object Store] Using page size of 1m
07::38::39 info: Options[0] [Object Store] Each page can hold ~43690 key-value pairs of objects
07::38::39 info: Options[0] [Object Store] Using log memory size of 32m
07::38::39 info: Options[0] [Object Store] This can hold ~1398101 key-value pairs of objects in memory total
07::38::39 info: Options[0] [Object Store] There are 32 log pages in memory
07::38::39 info: Options[0] [Object Store] Using disk segment size of 32m
07::38::39 info: Options[0] [Object Store] Using hash index size of 1g (16m cache lines)
07::38::39 info: Options[0] [Object Store] Using log mutable percentage of 90%
07::38::39 info: Options[0] [Object Store] Total memory size including heap objects is unlimited
07::38::39 info: Options[0] [Object Store] Not using Revivification
07::38::39 info: StoreWrapper[0] Local endpoint: 172.19.76.98:3278
* Ready to accept connections

/content/images/2024/04/garnet-03.png

Container

There are a few containerized options we can see at the root of the Garnet repo

builder@LuiGi:~/Workspaces/garnet$ ls
CODE_OF_CONDUCT.md     Dockerfile              Dockerfile.chiseled    Dockerfile.ubuntu  Garnet.sln  LICENSE    README.md    SUPPORT.md  docker-compose.yml  main     playground  test
Directory.Build.props  Dockerfile.cbl-mariner  Dockerfile.nanoserver  Garnet.nuspec      Garnet.snk  NOTICE.md  SECURITY.md  benchmark   libs                metrics  samples     website

Let’s build the base Dockerfile

builder@LuiGi:~/Workspaces/garnet$ cat Dockerfile
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG TARGETARCH
WORKDIR /source

# Copy files
COPY . .
WORKDIR /source/main/GarnetServer

RUN dotnet restore -a $TARGETARCH
RUN dotnet build -a $TARGETARCH -c Release

# Copy and publish app and libraries
RUN dotnet publish -a $TARGETARCH -c Release -o /app --self-contained false -f net8.0

# Final stage/image
FROM mcr.microsoft.com/dotnet/runtime:8.0
WORKDIR /app
COPY --from=build /app .

# For inter-container communication.
EXPOSE 6379

# Run GarnetServer with an index size of 128MB
ENTRYPOINT ["/app/GarnetServer", "-i", "128m", "--port", "6379"]builder@LuiGi:~/Workspaces/garnet$
builder@LuiGi:~/Workspaces/garnet$ docker build -t mygarnet .
[+] Building 173.5s (16/16) FINISHED                                                                                                                                                       docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                 0.1s
 => => transferring dockerfile: 665B                                                                                                                                                                 0.0s
 => [internal] load metadata for mcr.microsoft.com/dotnet/runtime:8.0                                                                                                                                1.8s
 => [internal] load metadata for mcr.microsoft.com/dotnet/sdk:8.0                                                                                                                                    1.8s
 => [internal] load .dockerignore                                                                                                                                                                    0.1s
 => => transferring context: 2B                                                                                                                                                                      0.0s
 => [stage-1 1/3] FROM mcr.microsoft.com/dotnet/runtime:8.0@sha256:c9804086710f1325e63cf2ed3f83deb10a3a5d07cc0e762b3bb27f0d8b7d6a7b                                                                 20.6s
 => => resolve mcr.microsoft.com/dotnet/runtime:8.0@sha256:c9804086710f1325e63cf2ed3f83deb10a3a5d07cc0e762b3bb27f0d8b7d6a7b                                                                          0.1s
 => => sha256:0ec618b2858b74f706d739b90bd036b1b6b4105a111edcd3bbe7a4000bd76475 1.37kB / 1.37kB                                                                                                       0.0s
 => => sha256:5882bc22c462701ab76894b2f2f8fa04fc3babf7afb90ef8c122164d6b3abf4e 2.28kB / 2.28kB                                                                                                       0.0s
 => => sha256:a903092de2dbe1032be255f6aa13a67ae083a3f265fd27233b508751272f445a 18.72MB / 18.72MB                                                                                                    12.0s
 => => sha256:c9804086710f1325e63cf2ed3f83deb10a3a5d07cc0e762b3bb27f0d8b7d6a7b 1.08kB / 1.08kB                                                                                                       0.0s
 => => sha256:a487f961ec6db6d8f7ddb5e2530d7ff34c3d9e00e1b7bac6c88a7b23ac1d3486 3.28kB / 3.28kB                                                                                                       0.5s
 => => sha256:03ed6a6adf56f6f715105f0deee0751926934d40efc896e37dedb449be4fff73 32.23MB / 32.23MB                                                                                                    19.0s
 => => sha256:2900f7703f33131b08a583655daea49aaabb3922640bc9ec2f0bb47bbce0ae34 155B / 155B                                                                                                           1.1s
 => => extracting sha256:a903092de2dbe1032be255f6aa13a67ae083a3f265fd27233b508751272f445a                                                                                                            0.4s
 => => extracting sha256:a487f961ec6db6d8f7ddb5e2530d7ff34c3d9e00e1b7bac6c88a7b23ac1d3486                                                                                                            0.0s
 => => extracting sha256:03ed6a6adf56f6f715105f0deee0751926934d40efc896e37dedb449be4fff73                                                                                                            1.1s
 => => extracting sha256:2900f7703f33131b08a583655daea49aaabb3922640bc9ec2f0bb47bbce0ae34                                                                                                            0.0s
 => [build 1/7] FROM mcr.microsoft.com/dotnet/sdk:8.0@sha256:249a78aa4ce22ab872d0dff0490a6389e7bc087d2c080c4ffc7569b49cf0e23b                                                                       68.1s
 => => resolve mcr.microsoft.com/dotnet/sdk:8.0@sha256:249a78aa4ce22ab872d0dff0490a6389e7bc087d2c080c4ffc7569b49cf0e23b                                                                              0.1s
 => => sha256:249a78aa4ce22ab872d0dff0490a6389e7bc087d2c080c4ffc7569b49cf0e23b 1.08kB / 1.08kB                                                                                                       0.0s
 => => sha256:7dd073a82957f9f311bf3631a8e706df9a7173d521994326386a2453def7550d 5.67kB / 5.67kB                                                                                                       0.0s
 => => sha256:58e41940df879930c36ef23f37afe774831dfa15c67e3fc788808d9e1fb78494 2.22kB / 2.22kB                                                                                                       0.0s
 => => sha256:a903092de2dbe1032be255f6aa13a67ae083a3f265fd27233b508751272f445a 18.72MB / 18.72MB                                                                                                    12.0s
 => => sha256:a487f961ec6db6d8f7ddb5e2530d7ff34c3d9e00e1b7bac6c88a7b23ac1d3486 3.28kB / 3.28kB                                                                                                       0.5s
 => => sha256:03ed6a6adf56f6f715105f0deee0751926934d40efc896e37dedb449be4fff73 32.23MB / 32.23MB                                                                                                    19.0s
 => => sha256:2900f7703f33131b08a583655daea49aaabb3922640bc9ec2f0bb47bbce0ae34 155B / 155B                                                                                                           1.1s
 => => sha256:1764125ee6d60582da2a93872439a6170cc1f7cda6a3e446cdc9d229a2ede0d2 11.02MB / 11.02MB                                                                                                     5.3s
 => => sha256:fd11341df62770f82c1a47525639eac60f39d0d9690dcdc18cd98bc17fd76b3e 30.69MB / 30.69MB                                                                                                    19.7s
 => => sha256:7a3936380e1e9a612f41403125971948e725b5de22a2ac34339b50a43ea8ff0f 187.59MB / 187.59MB                                                                                                  63.4s
 => => extracting sha256:a903092de2dbe1032be255f6aa13a67ae083a3f265fd27233b508751272f445a                                                                                                          159.3s
 => => extracting sha256:a487f961ec6db6d8f7ddb5e2530d7ff34c3d9e00e1b7bac6c88a7b23ac1d3486                                                                                                            0.0s
 => => extracting sha256:03ed6a6adf56f6f715105f0deee0751926934d40efc896e37dedb449be4fff73                                                                                                          152.3s
 => => sha256:c092aced01925a96404610e38c62c20b40d185f344f848d7dc20ef0240636db9 15.70MB / 15.70MB                                                                                                    27.1s
 => => extracting sha256:1764125ee6d60582da2a93872439a6170cc1f7cda6a3e446cdc9d229a2ede0d2                                                                                                            0.4s
 => => extracting sha256:fd11341df62770f82c1a47525639eac60f39d0d9690dcdc18cd98bc17fd76b3e                                                                                                            1.4s
 => => extracting sha256:7a3936380e1e9a612f41403125971948e725b5de22a2ac34339b50a43ea8ff0f                                                                                                            3.8s
 => => extracting sha256:c092aced01925a96404610e38c62c20b40d185f344f848d7dc20ef0240636db9                                                                                                            0.3s
 => [internal] load build context                                                                                                                                                                    7.0s
 => => transferring context: 1.60GB                                                                                                                                                                  6.9s
 => [stage-1 2/3] WORKDIR /app                                                                                                                                                                       0.3s
 => [build 2/7] WORKDIR /source                                                                                                                                                                      0.2s
 => [build 3/7] COPY . .                                                                                                                                                                             6.0s
 => [build 4/7] WORKDIR /source/main/GarnetServer                                                                                                                                                    0.1s
 => [build 5/7] RUN dotnet restore -a amd64                                                                                                                                                         35.3s
 => [build 6/7] RUN dotnet build -a amd64 -c Release                                                                                                                                                47.8s
 => [build 7/7] RUN dotnet publish -a amd64 -c Release -o /app --self-contained false -f net8.0                                                                                                     12.7s
 => [stage-1 3/3] COPY --from=build /app .                                                                                                                                                           0.1s
 => exporting to image                                                                                                                                                                               0.1s
 => => exporting layers                                                                                                                                                                              0.1s
 => => writing image sha256:0f8f3ade06de5566d0870ffe227d8dd323afc38c2c8c3cd3e2aed264b092e42f                                                                                                         0.0s
 => => naming to docker.io/library/mygarnet                                                                                                                                                          0.0s

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

I can now easily test it

/content/images/2024/04/garnet-04.png

Kubernetes

I’m willing to be we can just substitute in this container image into the Bitnami Redis deployment we did last time to test Valkey

builder@LuiGi:~/Workspaces/garnet$ helm list -n valkeytest
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
my-redis        valkeytest      1               2024-04-04 20:35:00.993913459 -0500 CDT deployed        redis-19.0.2    7.2.4

builder@LuiGi:~/Workspaces/garnet$ helm get values my-redis -n valkeytest
USER-SUPPLIED VALUES:
image:
  repository: idjohnson/myvalkey-server
  tag: latest

I’ll tag and push to Dockerhub

builder@LuiGi:~/Workspaces/garnet$ docker tag mygarnet:latest idjohnson/mygarnet:latest
builder@LuiGi:~/Workspaces/garnet$ docker push idjohnson/mygarnet:latest
The push refers to repository [docker.io/idjohnson/mygarnet]
5c8272b6134e: Pushed
063f1e5dfbfb: Pushed
9ca27d82a225: Pushed
6e6aed7ced0d: Pushed
a80e3c10ac79: Pushed
0f0ebfa56a19: Pushed
a483da8ab3e9: Mounted from idjohnson/myvalkey-server
latest: digest: sha256:8e932af414f3fe18ff6ba05e16ee2929abe344e2dced43760f070ca5f36ee1ea size: 1785

I’ll pull the values and swap them:

builder@LuiGi:~/Workspaces/garnet$ helm get values my-redis -n valkeytest -o yaml > myredis.values.yaml
builder@LuiGi:~/Workspaces/garnet$ helm get values my-redis -n valkeytest -o yaml > myredis.values.yaml.bak
builder@LuiGi:~/Workspaces/garnet$ vi myredis.values.yaml
builder@LuiGi:~/Workspaces/garnet$ diff myredis.values.yaml myredis.values.yaml.bak
2c2
<   repository: idjohnson/mygarnet
---
>   repository: idjohnson/myvalkey-server

Then use them to ‘upgrade’ the helm deployment

builder@LuiGi:~/Workspaces/garnet$ helm upgrade my-redis -n valkeytest -f ./myredis.values.yaml bitnami/redis
Release "my-redis" has been upgraded. Happy Helming!
NAME: my-redis
LAST DEPLOYED: Sat Apr  6 07:56:05 2024
NAMESPACE: valkeytest
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION: 19.0.2
APP VERSION: 7.2.4

** Please be patient while the chart is being deployed **

Redis&reg; can be accessed on the following DNS names from within your cluster:

    my-redis-master.valkeytest.svc.cluster.local for read/write operations (port 6379)
    my-redis-replicas.valkeytest.svc.cluster.local for read-only operations (port 6379)



To get your password run:

    export REDIS_PASSWORD=$(kubectl get secret --namespace valkeytest my-redis -o jsonpath="{.data.redis-password}" | base64 -d)

To connect to your Redis&reg; server:

1. Run a Redis&reg; pod that you can use as a client:

   kubectl run --namespace valkeytest redis-client --restart='Never'  --env REDIS_PASSWORD=$REDIS_PASSWORD  --image docker.io/idjohnson/mygarnet:latest --command -- sleep infinity

   Use the following command to attach to the pod:

   kubectl exec --tty -i redis-client \
   --namespace valkeytest -- bash

2. Connect using the Redis&reg; CLI:
   REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-redis-master
   REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-redis-replicas

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace valkeytest svc/my-redis-master 6379:6379 &
    REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
  - master.resources
  - replica.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

Ah, that will not work

builder@LuiGi:~/Workspaces/garnet$ kubectl get pods -n valkeytest
NAME                  READY   STATUS             RESTARTS          AGE
redis-client          1/1     Running            0                 35h
my-redis-replicas-0   0/1     CrashLoopBackOff   419 (2m41s ago)   35h
my-redis-master-0     0/1     CrashLoopBackOff   4 (26s ago)       2m6s
builder@LuiGi:~/Workspaces/garnet$ kubectl logs my-redis-master-0 -n valkeytest
/opt/bitnami/scripts/start-scripts/start-master.sh: line 15: exec: redis-server: not found

I think I’ll have to hack it much the same way to yank out the probles and the arg/cmd invokations.

builder@LuiGi:~/Workspaces/garnet$ kubectl get statefulset -n valkeytest my-redis-master -o yaml > myredismaster.bak
builder@LuiGi:~/Workspaces/garnet$ kubectl get statefulset -n valkeytest my-redis-master -o yaml > myredismaster.yaml
builder@LuiGi:~/Workspaces/garnet$ vi myredismaster.yaml
builder@LuiGi:~/Workspaces/garnet$ diff myredismaster.yaml myredismaster.bak
59c59,64
<       - env:
---
>       - args:
>         - -c
>         - /opt/bitnami/scripts/start-scripts/start-master.sh
>         command:
>         - /bin/bash
>         env:
76a82,92
>         livenessProbe:
>           exec:
>             command:
>             - sh
>             - -c
>             - /health/ping_liveness_local.sh 5
>           failureThreshold: 5
>           initialDelaySeconds: 20
>           periodSeconds: 5
>           successThreshold: 1
>           timeoutSeconds: 6
81a98,108
>         readinessProbe:
>           exec:
>             command:
>             - sh
>             - -c
>             - /health/ping_readiness_local.sh 1
>           failureThreshold: 5
>           initialDelaySeconds: 20
>           periodSeconds: 5
>           successThreshold: 1
>           timeoutSeconds: 2
builder@LuiGi:~/Workspaces/garnet$ kubectl apply -f ./myredismaster.yaml -n valkeytest
Warning: resource statefulsets/my-redis-master is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
statefulset.apps/my-redis-master configured

Not sure why the apply didn’t take, but i edited it with the same thing directly

$ kubectl edit statefulset -n valkeytest my-redis-master
statefulset.apps/my-redis-master edited

However, it seemed to quickly run out of memory

builder@LuiGi:~/Workspaces/garnet$ kubectl get pods -n valkeytest
NAME                  READY   STATUS             RESTARTS          AGE
redis-client          1/1     Running            0                 35h
my-redis-replicas-0   0/1     CrashLoopBackOff   421 (3m27s ago)   35h
my-redis-master-0     0/1     Completed          2 (24s ago)       34s

builder@LuiGi:~/Workspaces/garnet$ kubectl logs my-redis-master-0 -n valkeytest
    _________
   /_||___||_\      Garnet 1.0.4 64 bit; standalone mode
   '. \   / .'      Port: 6379
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

Unable to initialize server due to exception: Exception of type 'System.OutOfMemoryException' was thrown.

I’ll up the memory a bit

    resources:
          limits:
            cpu: 150m
            ephemeral-storage: 1Gi
            memory: 512Mi
          requests:
            cpu: 100m
            ephemeral-storage: 50Mi
            memory: 256Mi

I actually pulled the memory limit all-together and then it worked

builder@LuiGi:~/Workspaces/garnet$ kubectl edit statefulset -n valkeytest my-redis-master
statefulset.apps/my-redis-master edited
builder@LuiGi:~/Workspaces/garnet$ kubectl delete pod my-redis-master-0 -n valkeytest
pod "my-redis-master-0" deleted
builder@LuiGi:~/Workspaces/garnet$ kubectl get pods -n valkeytest
NAME                  READY   STATUS             RESTARTS        AGE
redis-client          1/1     Running            0               35h
my-redis-replicas-0   0/1     CrashLoopBackOff   422 (52s ago)   35h
my-redis-master-0     1/1     Running            0               3s

I can now test the with the client pod

$ kubectl run --namespace valkeytest redis-client --restart='Never'  --env REDIS_PASSWORD=$REDIS_PASSWORD  --image docker.io/idjohnson/mygarnet:latest --command -- sleep infinity

You’ll notice that even to my STS told garnet to use a password

      containers:
      - env:
        - name: BITNAMI_DEBUG
          value: "false"
        - name: REDIS_REPLICATION_MODE
          value: master
        - name: ALLOW_EMPTY_PASSWORD
          value: "no"
        - name: REDIS_PASSWORD
          valueFrom:
            secretKeyRef:
              key: redis-password
              name: my-redis

At least, from what I can tell, that does not trigger Garnet to use passwords. The following shows it clearly is set to run passwordless:

$ kubectl exec --tty -i redis-client  --namespace valkeytest -- bash
root@redis-client:/data# REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-redis-master
AUTH failed: ERR Client sent AUTH, but configured authenticator does not accept passwords
my-redis-master:6379> quit
root@redis-client:/data# redis-cli -h my-redis-master
my-redis-master:6379> get testkey
(nil)
my-redis-master:6379> set testkey garnetinkubernetes
OK
my-redis-master:6379> get testkey
"garnetinkubernetes"
my-redis-master:6379> exit
root@redis-client:/data# exit
exit

Presently, in the Github Repo, Onboarding Docs and Releases, I see no info on Kubernetes manifests or Helm.

Pi 3

I had the wild idea of trying to get this to build and run on some Raspberry Pi 3’s I had.

First, I needed to install Amr32 dotnet:

builder@pi3green:~ $ curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel STS
dotnet-install: Attempting to download using aka.ms link https://dotnetcli.azureedge.net/dotnet/Sdk/7.0.407/dotnet-sdk-7.0.407-linux-arm.tar.gz
dotnet-install: Remote file https://dotnetcli.azureedge.net/dotnet/Sdk/7.0.407/dotnet-sdk-7.0.407-linux-arm.tar.gz size is 213907524 bytes.
dotnet-install: Extracting archive from https://dotnetcli.azureedge.net/dotnet/Sdk/7.0.407/dotnet-sdk-7.0.407-linux-arm.tar.gz
dotnet-install: Downloaded file size is 213907524 bytes.
dotnet-install: The remote and local file sizes are equal.
dotnet-install: Installed version is 7.0.407
dotnet-install: Adding to current process PATH: `/home/builder/.dotnet`. Note: This change will be visible only when sourcing script.
dotnet-install: Note that the script does not resolve dependencies during installation.
dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
dotnet-install: Installation finished successfully.

Then we clone the repo

builder@pi3green:~/Workspaces $ git clone https://github.com/microsoft/garnet.git
Cloning into 'garnet'...
remote: Enumerating objects: 12434, done.
remote: Total 12434 (delta 0), reused 0 (delta 0), pack-reused 12434
Receiving objects: 100% (12434/12434), 18.27 MiB | 3.22 MiB/s, done.
Resolving deltas: 100% (8992/8992), done.

I’ll hop into Garnet and run a build command

builder@pi3green:~/Workspaces/garnet $ export PATH=/home/builder/.dotnet:$PATH
builder@pi3green:~/Workspaces/garnet $ dotnet build -c Release

Welcome to .NET 7.0!
---------------------
SDK Version: 7.0.407

Telemetry
---------
The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

----------------
Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
Learn about HTTPS: https://aka.ms/dotnet-https
----------------
Write your first app: https://aka.ms/dotnet-hello-world
Find out what's new: https://aka.ms/dotnet-whats-new
Explore documentation: https://aka.ms/dotnet-docs
Report issues and find source on GitHub: https://github.com/dotnet/core
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
MSBuild version 17.7.4+3ebbd7c49 for .NET
  Determining projects to restore...

This highlighted that the project really needs .NET 8.0

builder@pi3green:~/Workspaces/garnet $ dotnet build -c Release

Welcome to .NET 7.0!
---------------------
SDK Version: 7.0.407

Telemetry
---------
The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

----------------
Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
Learn about HTTPS: https://aka.ms/dotnet-https
----------------
Write your first app: https://aka.ms/dotnet-hello-world
Find out what's new: https://aka.ms/dotnet-whats-new
Explore documentation: https://aka.ms/dotnet-docs
Report issues and find source on GitHub: https://github.com/dotnet/core
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
MSBuild version 17.7.4+3ebbd7c49 for .NET
  Determining projects to restore...
/home/builder/.dotnet/sdk/7.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/home/builder/Workspaces/garnet/samples/GarnetClientSample/GarnetClientSample.csproj]
/home/builder/.dotnet/sdk/7.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/home/builder/Workspaces/garnet/playground/GarnetClientStress/GarnetClientStress.csproj]

Build FAILED.

/home/builder/.dotnet/sdk/7.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/home/builder/Workspaces/garnet/samples/GarnetClientSample/GarnetClientSample.csproj]
/home/builder/.dotnet/sdk/7.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(160,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0.  Either target .NET 7.0 or lower, or use a version of the .NET SDK that supports .NET 8.0. Download the .NET SDK from https://aka.ms/dotnet/download [/home/builder/Workspaces/garnet/playground/GarnetClientStress/GarnetClientStress.csproj]
    0 Warning(s)
    2 Error(s)

Time Elapsed 00:00:38.46

I decided to get the latest .NET (8.0) and try again

builder@pi3green:~/Workspaces/garnet $ curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin
dotnet-install: Attempting to download using aka.ms link https://dotnetcli.azureedge.net/dotnet/Sdk/8.0.203/dotnet-sdk-8.0.203-linux-arm.tar.gz
dotnet-install: Remote file https://dotnetcli.azureedge.net/dotnet/Sdk/8.0.203/dotnet-sdk-8.0.203-linux-arm.tar.gz size is 221422071 bytes.
dotnet-install: Extracting archive from https://dotnetcli.azureedge.net/dotnet/Sdk/8.0.203/dotnet-sdk-8.0.203-linux-arm.tar.gz
cp: cannot create regular file '/home/builder/.dotnet/dotnet': Text file busy
dotnet-install: Downloaded file size is 221422071 bytes.
dotnet-install: The remote and local file sizes are equal.
dotnet-install: Installed version is 8.0.203
dotnet-install: Adding to current process PATH: `/home/builder/.dotnet`. Note: This change will be visible only when sourcing script.
dotnet-install: Note that the script does not resolve dependencies during installation.
dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
dotnet-install: Installation finished successfully.

That worked without issue

builder@pi3green:~/Workspaces/garnet $ dotnet build -c Release

Welcome to .NET 8.0!
---------------------
SDK Version: 8.0.203

Telemetry
---------
The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

----------------
Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate, view the instructions: https://aka.ms/dotnet-https-linux

----------------
Write your first app: https://aka.ms/dotnet-hello-world
Find out what's new: https://aka.ms/dotnet-whats-new
Explore documentation: https://aka.ms/dotnet-docs
Report issues and find source on GitHub: https://github.com/dotnet/core
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
MSBuild version 17.9.6+a4ecab324 for .NET
  Determining projects to restore...
  Restored /home/builder/Workspaces/garnet/libs/cluster/Garnet.cluster.csproj (in 39.07 sec).
  Restored /home/builder/Workspaces/garnet/libs/common/Garnet.common.csproj (in 39.07 sec).
  Restored /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/Tsavorite.devices.AzureStorageDevice.csproj (in 39.07 sec).
  Restored /home/builder/Workspaces/garnet/main/GarnetServer/GarnetServer.csproj (in 39.07 sec).
  Restored /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/Tsavorite.core.csproj (in 82 ms).
  Restored /home/builder/Workspaces/garnet/libs/client/Garnet.client.csproj (in 103 ms).
  Restored /home/builder/Workspaces/garnet/libs/server/Garnet.server.csproj (in 296 ms).
  Restored /home/builder/Workspaces/garnet/playground/GarnetClientStress/GarnetClientStress.csproj (in 135 ms).
  Restored /home/builder/Workspaces/garnet/libs/host/Garnet.host.csproj (in 731 ms).
  Restored /home/builder/Workspaces/garnet/playground/Embedded.perftest/Embedded.perftest.csproj (in 2.19 sec).
  Restored /home/builder/Workspaces/garnet/playground/Bitmap/Bitmap.csproj (in 159 ms).
  Restored /home/builder/Workspaces/garnet/metrics/HdrHistogram/HdrHistogram.csproj (in 116 ms).
  Restored /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/Resp.benchmark.csproj (in 6.79 sec).
  Restored /home/builder/Workspaces/garnet/playground/ClusterStress/ClusterStress.csproj (in 13.58 sec).
  Restored /home/builder/Workspaces/garnet/samples/MetricsMonitor/MetricsMonitor.csproj (in 92 ms).
  Restored /home/builder/Workspaces/garnet/samples/GarnetClientSample/GarnetClientSample.csproj (in 80 ms).
  Restored /home/builder/Workspaces/garnet/test/Garnet.test.cluster/Garnet.test.cluster.csproj (in 45.76 sec).
  Restored /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/BDN.benchmark.csproj (in 1.05 min).
  Restored /home/builder/Workspaces/garnet/playground/TstRunner/TstRunner.csproj (in 57.9 sec).
  Restored /home/builder/Workspaces/garnet/test/Garnet.test/Garnet.test.csproj (in 1.14 min).
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net7.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net6.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net8.0/Garnet.common.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net8.0/HdrHistogram.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net7.0/HdrHistogram.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net8.0/Tsavorite.core.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net6.0/HdrHistogram.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net7.0/Tsavorite.core.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net7.0/Garnet.client.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net7.0/BDN.benchmark.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net7.0/Resp.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net6.0/BDN.benchmark.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net7.0/ClusterStress.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net6.0/Tsavorite.core.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net8.0/BDN.benchmark.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net7.0/Garnet.server.dll
  Bitmap -> /home/builder/Workspaces/garnet/playground/Bitmap/bin/Release/net7.0/Bitmap.dll
  MetricsMonitor -> /home/builder/Workspaces/garnet/samples/MetricsMonitor/bin/Release/net7.0/MetricsMonitor.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net7.0/Garnet.cluster.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net7.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net7.0/Garnet.host.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net7.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net7.0/Garnet.test.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net7.0/GarnetServer.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net6.0/Tsavorite.devices.AzureStorageDevice.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net8.0/Garnet.client.dll
  GarnetClientStress -> /home/builder/Workspaces/garnet/playground/GarnetClientStress/bin/Release/net8.0/GarnetClientStress.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net8.0/ClusterStress.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net7.0/Garnet.test.cluster.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net8.0/Resp.benchmark.dll
  GarnetClientSample -> /home/builder/Workspaces/garnet/samples/GarnetClientSample/bin/Release/net8.0/GarnetClientSample.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net8.0/Garnet.server.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net8.0/Garnet.cluster.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net8.0/Garnet.host.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/GarnetServer.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net8.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll
  TstRunner -> /home/builder/Workspaces/garnet/playground/TstRunner/bin/Release/net7.0/TstRunner.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net6.0/Garnet.client.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net6.0/ClusterStress.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net6.0/Resp.benchmark.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net6.0/Garnet.server.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net6.0/Garnet.cluster.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net6.0/Garnet.host.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net6.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net6.0/Garnet.test.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net6.0/Garnet.test.cluster.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net6.0/GarnetServer.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:22:14.18

Let’s try and fire it up

builder@pi3green:~/Workspaces/garnet/main/GarnetServer $  dotnet run -f net8.0 --config-import-path /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf



Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
    _________
   /_||___||_\      Garnet 1.0.4 32 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

02::28::13 info: GarnetServer[0] Garnet 1.0.4 32 bit; standalone mode; Port: 3278
02::28::13 info: ArgParser[0] Configuration import from embedded resource succeeded. Path: defaults.conf.
02::28::14 info: ArgParser[0] Configuration import from local machine succeeded. Path: /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf.
02::28::14 info: Options[0] [Store] Using page size of 32m
02::28::14 info: Options[0] [Store] Using log memory size of 16g
02::28::14 info: Options[0] [Store] There are 512 log pages in memory
02::28::14 info: Options[0] [Store] Using disk segment size of 1g
02::28::14 info: Options[0] [Store] Using hash index size of 8g (128m cache lines)
02::28::14 info: Options[0] [Store] Using log mutable percentage of 90%
02::28::14 info: Options[0] [Store] Not using Revivification
Unable to initialize server due to exception: Exception of type 'System.OutOfMemoryException' was thrown.

Let’s try reducing the memory as the Pi3 clearly doesn’t have 16Gb of memory to allocate

builder@pi3green:~/Workspaces/garnet/main/GarnetServer $ export PATH=/home/builder/.dotnet:$PATH
builder@pi3green:~/Workspaces/garnet/main/GarnetServer $ cat garnet.conf | head -n5
{
    "loglevel": "debug",
    "MemorySize" : "640m"
        /**********************************************************************************************************/
        /*                                      Garnet Configuration File                                         */
builder@pi3green:~/Workspaces/garnet/main/GarnetServer $ dotnet run -f net8.0 --config-import-path /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf


I have tried playing with memory settings over and over. Clearly, I’m missing something as no set of numbers seems to make that last error happy:

builder@pi3green:~/Workspaces/garnet/main/GarnetServer $ dotnet run -f net8.0 --config-import-path /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
    _________
   /_||___||_\      Garnet 1.0.4 32 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

04::54::25 info: GarnetServer[0] Garnet 1.0.4 32 bit; standalone mode; Port: 3278
04::54::26 info: ArgParser[0] Configuration import from embedded resource succeeded. Path: defaults.conf.
04::54::26 info: ArgParser[0] Configuration import from local machine succeeded. Path: /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf.
04::54::26 info: Options[0] [Store] Using page size of 32m
04::54::26 info: Options[0] [Store] Using log memory size of 1g, with 11 empty pages, for effective size of 672m
04::54::26 info: Options[0] [Store] There are 32 log pages in memory
04::54::26 info: Options[0] [Store] Using disk segment size of 1g
04::54::26 info: Options[0] Warning: using lower hash index size than specified (power of 2)
04::54::26 info: Options[0] [Store] Using hash index size of 512m (8m cache lines)
04::54::26 info: Options[0] Warning: using lower hash index max size than specified (power of 2)
Unable to initialize server due to exception: Index size 600m should not be less than index max size 300m


builder@pi3green:~/Workspaces/garnet/main/GarnetServer $ cat /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
{
    "loglevel": "debug",
    "MemorySize": "645m",
    "IndexSize": "600m",
    "IndexMaxSize": "300m",
    "ObjectStoreTotalMemorySize": "643m",
    "ObjectStoreLogMemorySize": "642m",
    "ObjectStoreIndexMaxSize": "641m"
        /**********************************************************************************************************/
        /*                                      Garnet Configuration File                                         */
        /**********************************************************************************************************/
    /* Use this file to configure any values different from the defaults specified in libs/host/defaults.conf */
        /*                                                                                                        */
        /* Example:                                                                                               */
        /* "Port" : 1234,                                                                                         */
        /* "Address" : "1.2.3.4",                                                                                 */
        /* "MemorySize" : "32g",                                                                                  */
        /* ...                                                                                                    */
        /*                                                                                                        */
        /* In order to use this file, run GarnetServer with the --config-import-path command line argument        */
        /* (e.g. GarnetServer.exe --config-import-path /path/to/garnet.conf).                                     */
    /**********************************************************************************************************/
}

Pi 4

I have a 64bit Pi4 we can try as well

builder@pi4black:~ $ curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin
dotnet-install: Attempting to download using aka.ms link https://dotnetcli.azureedge.net/dotnet/Sdk/8.0.203/dotnet-sdk-8.0.203-linux-arm64.tar.gz
dotnet-install: Remote file https://dotnetcli.azureedge.net/dotnet/Sdk/8.0.203/dotnet-sdk-8.0.203-linux-arm64.tar.gz size is 221512731 bytes.
dotnet-install: Extracting archive from https://dotnetcli.azureedge.net/dotnet/Sdk/8.0.203/dotnet-sdk-8.0.203-linux-arm64.tar.gz
dotnet-install: Downloaded file size is 221512731 bytes.
dotnet-install: The remote and local file sizes are equal.
dotnet-install: Installed version is 8.0.203
dotnet-install: Adding to current process PATH: `/home/builder/.dotnet`. Note: This change will be visible only when sourcing script.
dotnet-install: Note that the script does not resolve dependencies during installation.
dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
dotnet-install: Installation finished successfully.

I can then clone the same GIT repo and try a build

builder@pi4black:~/Workspaces/garnet $ dotnet build -c Release

Welcome to .NET 8.0!
---------------------
SDK Version: 8.0.203

Telemetry
---------
The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

----------------
Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate, view the instructions: https://aka.ms/dotnet-https-linux

----------------
Write your first app: https://aka.ms/dotnet-hello-world
Find out what's new: https://aka.ms/dotnet-whats-new
Explore documentation: https://aka.ms/dotnet-docs
Report issues and find source on GitHub: https://github.com/dotnet/core
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
MSBuild version 17.9.6+a4ecab324 for .NET
  Determining projects to restore...
  Restored /home/builder/Workspaces/garnet/playground/GarnetClientStress/GarnetClientStress.csproj (in 11.08 sec).
  Restored /home/builder/Workspaces/garnet/playground/Bitmap/Bitmap.csproj (in 11.61 sec).
  Restored /home/builder/Workspaces/garnet/playground/ClusterStress/ClusterStress.csproj (in 12.6 sec).
  Restored /home/builder/Workspaces/garnet/playground/Embedded.perftest/Embedded.perftest.csproj (in 14.12 sec).
  Restored /home/builder/Workspaces/garnet/samples/MetricsMonitor/MetricsMonitor.csproj (in 2.54 sec).
  Restored /home/builder/Workspaces/garnet/samples/GarnetClientSample/GarnetClientSample.csproj (in 57 ms).
  Restored /home/builder/Workspaces/garnet/main/GarnetServer/GarnetServer.csproj (in 310 ms).
  Restored /home/builder/Workspaces/garnet/test/Garnet.test.cluster/Garnet.test.cluster.csproj (in 9.46 sec).
  Restored /home/builder/Workspaces/garnet/libs/common/Garnet.common.csproj (in 6.17 sec).
  Restored /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/Tsavorite.devices.AzureStorageDevice.csproj (in 6.4 sec).
  Restored /home/builder/Workspaces/garnet/libs/client/Garnet.client.csproj (in 59 ms).
  Restored /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/Resp.benchmark.csproj (in 81 ms).
  Restored /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/Tsavorite.core.csproj (in 59 ms).
  Restored /home/builder/Workspaces/garnet/libs/server/Garnet.server.csproj (in 113 ms).
  Restored /home/builder/Workspaces/garnet/libs/cluster/Garnet.cluster.csproj (in 112 ms).
  Restored /home/builder/Workspaces/garnet/metrics/HdrHistogram/HdrHistogram.csproj (in 23 ms).
  Restored /home/builder/Workspaces/garnet/playground/TstRunner/TstRunner.csproj (in 1.62 sec).
  Restored /home/builder/Workspaces/garnet/test/Garnet.test/Garnet.test.csproj (in 20.42 sec).
  Restored /home/builder/Workspaces/garnet/libs/host/Garnet.host.csproj (in 129 ms).
  Restored /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/BDN.benchmark.csproj (in 13.54 sec).
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net7.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net6.0/Garnet.common.dll
  Garnet.common -> /home/builder/Workspaces/garnet/libs/common/bin/AnyCPU/Release/net8.0/Garnet.common.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net7.0/Tsavorite.core.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net8.0/Tsavorite.core.dll
  Tsavorite.core -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net6.0/Tsavorite.core.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net6.0/HdrHistogram.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net8.0/HdrHistogram.dll
  HdrHistogram -> /home/builder/Workspaces/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net7.0/HdrHistogram.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net7.0/Garnet.client.dll
  Bitmap -> /home/builder/Workspaces/garnet/playground/Bitmap/bin/Release/net7.0/Bitmap.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net7.0/ClusterStress.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net6.0/BDN.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net7.0/BDN.benchmark.dll
  BDN.benchmark -> /home/builder/Workspaces/garnet/benchmark/BDN.benchmark/bin/Release/net8.0/BDN.benchmark.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net7.0/Garnet.server.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net7.0/Resp.benchmark.dll
  MetricsMonitor -> /home/builder/Workspaces/garnet/samples/MetricsMonitor/bin/Release/net7.0/MetricsMonitor.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net7.0/Garnet.cluster.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net7.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net7.0/Garnet.host.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net7.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net7.0/Garnet.test.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net7.0/GarnetServer.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net6.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net7.0/Garnet.test.cluster.dll
  TstRunner -> /home/builder/Workspaces/garnet/playground/TstRunner/bin/Release/net7.0/TstRunner.dll
  Tsavorite.devices.AzureStorageDevice -> /home/builder/Workspaces/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net6.0/Garnet.client.dll
  Garnet.client -> /home/builder/Workspaces/garnet/libs/client/bin/AnyCPU/Release/net8.0/Garnet.client.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net6.0/Garnet.server.dll
  GarnetClientStress -> /home/builder/Workspaces/garnet/playground/GarnetClientStress/bin/Release/net8.0/GarnetClientStress.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net8.0/ClusterStress.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net8.0/Resp.benchmark.dll
  ClusterStress -> /home/builder/Workspaces/garnet/playground/ClusterStress/bin/Release/net6.0/ClusterStress.dll
  Garnet.server -> /home/builder/Workspaces/garnet/libs/server/bin/AnyCPU/Release/net8.0/Garnet.server.dll
  Resp.benchmark -> /home/builder/Workspaces/garnet/benchmark/Resp.benchmark/bin/Release/net6.0/Resp.benchmark.dll
  GarnetClientSample -> /home/builder/Workspaces/garnet/samples/GarnetClientSample/bin/Release/net8.0/GarnetClientSample.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net8.0/Garnet.cluster.dll
  Garnet.cluster -> /home/builder/Workspaces/garnet/libs/cluster/bin/AnyCPU/Release/net6.0/Garnet.cluster.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net6.0/Garnet.host.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net6.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net6.0/Garnet.test.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net6.0/Garnet.test.cluster.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net6.0/GarnetServer.dll
  Garnet.host -> /home/builder/Workspaces/garnet/libs/host/bin/AnyCPU/Release/net8.0/Garnet.host.dll
  Embedded.perftest -> /home/builder/Workspaces/garnet/playground/Embedded.perftest/bin/Release/net8.0/Embedded.perftest.dll
  Garnet.test -> /home/builder/Workspaces/garnet/test/Garnet.test/bin/AnyCPU/Release/net8.0/Garnet.test.dll
  Garnet.test.cluster -> /home/builder/Workspaces/garnet/test/Garnet.test.cluster/bin/AnyCPU/Release/net8.0/Garnet.test.cluster.dll
  GarnetServer -> /home/builder/Workspaces/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/GarnetServer.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:05:10.47

Once I tweaked the memory settings:

builder@pi4black:~ $ cat /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
{
     "loglevel": "debug",
     "IndexSize": "1g",
     "IndexMaxSize": "2g",
     "MemorySize": "2g"
        /**********************************************************************************************************/
        /*                                      Garnet Configuration File                                         */
        /**********************************************************************************************************/
    /* Use this file to configure any values different from the defaults specified in libs/host/defaults.conf */
        /*                                                                                                        */
        /* Example:                                                                                               */
        /* "Port" : 1234,                                                                                         */
        /* "Address" : "1.2.3.4",                                                                                 */
        /* "MemorySize" : "32g",                                                                                  */
        /* ...                                                                                                    */
        /*                                                                                                        */
        /* In order to use this file, run GarnetServer with the --config-import-path command line argument        */
        /* (e.g. GarnetServer.exe --config-import-path /path/to/garnet.conf).                                     */
    /**********************************************************************************************************/
}

I got a working server:

builder@pi4black:~/Workspaces/garnet/main/GarnetServer $ dotnet run -f net8.0 --config-import-path /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
Assuming 512 byte sector alignment for disk with file /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf
    _________
   /_||___||_\      Garnet 1.0.4 64 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

10::55::07 info: GarnetServer[0] Garnet 1.0.4 64 bit; standalone mode; Port: 3278
10::55::07 info: ArgParser[0] Configuration import from embedded resource succeeded. Path: defaults.conf.
10::55::07 info: ArgParser[0] Configuration import from local machine succeeded. Path: /home/builder/Workspaces/garnet/main/GarnetServer/garnet.conf.
10::55::07 info: Options[0] [Store] Using page size of 32m
10::55::07 info: Options[0] [Store] Using log memory size of 2g
10::55::07 info: Options[0] [Store] There are 64 log pages in memory
10::55::07 info: Options[0] [Store] Using disk segment size of 1g
10::55::07 info: Options[0] [Store] Using hash index size of 1g (16m cache lines)
10::55::07 info: Options[0] [Store] Using hash index max size of 2g, (32m cache lines)
10::55::07 info: Options[0] [Store] Using log mutable percentage of 90%
10::55::07 info: Options[0] [Store] Not using Revivification
10::55::08 info: Options[0] [Object Store] Using page size of 1m
10::55::08 info: Options[0] [Object Store] Each page can hold ~43690 key-value pairs of objects
10::55::08 info: Options[0] [Object Store] Using log memory size of 32m
10::55::08 info: Options[0] [Object Store] This can hold ~1398101 key-value pairs of objects in memory total
10::55::08 info: Options[0] [Object Store] There are 32 log pages in memory
10::55::08 info: Options[0] [Object Store] Using disk segment size of 32m
10::55::08 info: Options[0] [Object Store] Using hash index size of 1g (16m cache lines)
10::55::08 info: Options[0] [Object Store] Using log mutable percentage of 90%
10::55::08 info: Options[0] [Object Store] Total memory size including heap objects is unlimited
10::55::08 info: Options[0] [Object Store] Not using Revivification
10::55::08 info: StoreWrapper[0] Local endpoint: 192.168.1.209:3278
* Ready to accept connections
10::56::08 dbug: StoreWrapper[0] IndexAutoGrowTask[Main]: checking index size 16777216 against max 33554432 with overflow 0
10::57::08 dbug: StoreWrapper[0] IndexAutoGrowTask[Main]: checking index size 16777216 against max 33554432 with overflow 0
10::58::08 dbug: StoreWrapper[0] IndexAutoGrowTask[Main]: checking index size 16777216 against max 33554432 with overflow 0

Let’s test locally.

I’ll get the redis-cli installed on my WSL

builder@DESKTOP-QADGF36:~$ sudo apt install redis-tools
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libappstream-glib8 liblttng-ust-ctl4 liblttng-ust0 python3-crcmod
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson
Suggested packages:
  ruby-redis
The following NEW packages will be installed:
  libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-tools
0 upgraded, 6 newly installed, 0 to remove and 405 not upgraded.
Need to get 878 kB of archives.
After this operation, 3909 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 libhiredis0.14 amd64 0.14.0-6 [30.2 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/universe amd64 libjemalloc2 amd64 5.2.1-1ubuntu1 [235 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/universe amd64 liblua5.1-0 amd64 5.1.5-8.1build4 [99.9 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal/universe amd64 lua-bitop amd64 1.0.2-5 [6680 B]
Get:5 http://archive.ubuntu.com/ubuntu focal/universe amd64 lua-cjson amd64 2.1.0+dfsg-2.1 [17.4 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 redis-tools amd64 5:5.0.7-2ubuntu0.1 [489 kB]
Fetched 878 kB in 1s (1491 kB/s)
Selecting previously unselected package libhiredis0.14:amd64.
(Reading database ... 220427 files and directories currently installed.)
Preparing to unpack .../0-libhiredis0.14_0.14.0-6_amd64.deb ...
Unpacking libhiredis0.14:amd64 (0.14.0-6) ...
Selecting previously unselected package libjemalloc2:amd64.
Preparing to unpack .../1-libjemalloc2_5.2.1-1ubuntu1_amd64.deb ...
Unpacking libjemalloc2:amd64 (5.2.1-1ubuntu1) ...
Selecting previously unselected package liblua5.1-0:amd64.
Preparing to unpack .../2-liblua5.1-0_5.1.5-8.1build4_amd64.deb ...
Unpacking liblua5.1-0:amd64 (5.1.5-8.1build4) ...
Selecting previously unselected package lua-bitop:amd64.
Preparing to unpack .../3-lua-bitop_1.0.2-5_amd64.deb ...
Unpacking lua-bitop:amd64 (1.0.2-5) ...
Selecting previously unselected package lua-cjson:amd64.
Preparing to unpack .../4-lua-cjson_2.1.0+dfsg-2.1_amd64.deb ...
Unpacking lua-cjson:amd64 (2.1.0+dfsg-2.1) ...
Selecting previously unselected package redis-tools.
Preparing to unpack .../5-redis-tools_5%3a5.0.7-2ubuntu0.1_amd64.deb ...
Unpacking redis-tools (5:5.0.7-2ubuntu0.1) ...
Setting up libjemalloc2:amd64 (5.2.1-1ubuntu1) ...
Setting up lua-cjson:amd64 (2.1.0+dfsg-2.1) ...
Setting up lua-bitop:amd64 (1.0.2-5) ...
Setting up liblua5.1-0:amd64 (5.1.5-8.1build4) ...
Setting up libhiredis0.14:amd64 (0.14.0-6) ...
Setting up redis-tools (5:5.0.7-2ubuntu0.1) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link

builder@DESKTOP-QADGF36:~$ which redis-cli
/usr/bin/redis-cli

I can now use the Pi 4 host IP and Garnet port (3278) to connect

/content/images/2024/04/garnet-07.png

As you can see above, Garnet showed the host connection 192.168.1.160 is my Windows host so it used the physical machine on which WSL is running.

I checked resources and it seemed to be using an efficient amount memory and CPU

/content/images/2024/04/garnet-08.png

Summary

Garnet is actually a very nice looking keystore option from Microsoft that offers Redis (software) compliance with an easy to build and maintain library.

The Docusaurus docs points out the speed and efficient memory usage (not needing constant garbage collection). It also can run natively in Windows which, for at least one of my work projects, would be highly advantageous.

Garnet Redis Microsoft OpenSource Containers Kubernetes

Have something to add? Feedback? Try our new forums

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes