Detected server version is non-deterministic on Valkey since 3.4.0

Geschlossen
#3,278 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
35/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
csharp, docker
Bereich
databases

Rechercherichtung

The version comes from ServerEndPoint.Version, which is set by whichever handshake reply (INFO redis_version or HELLO version) is processed last; start by reading the code that handles those two replies during connection setup. Run the repro against valkey/valkey:9.1.2 in Docker to see the version change between connections. Done when the detected version is the same on every connection and LockReleaseAsync no longer sends DELEX to Valkey 9.1.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Description

Since 3.4.0, ServerEndPoint.Version depends on which handshake reply is processed last: INFO (redis_version) or HELLO (version).
On Redis both values are identical, so nothing shows.
On Valkey they differ (redis_version:7.2.4 in INFO, version: 9.1.2 in HELLO).
So the detected version changes from one connection to another, and commands gated on Redis versions get used on a server that does not support them.

For exemple, one consequence: LockRelease sometimes sends DELEX, which Valkey 9.1 does not know, and the lock is not released.

Environment
  • StackExchange.Redis 3.4.5
  • Valkey 9.1
  • .NET 10
Repro
docker run --rm -d -p 6379:6379 valkey/valkey:9.1.2
#:package [email protected]

using StackExchange.Redis;

for (int i = 1; i <= 50; i++)
{
    using ConnectionMultiplexer muxer = await ConnectionMultiplexer.ConnectAsync("localhost:6379");

    IDatabase db = muxer.GetDatabase();
    string key = $"lock:{i}";

    await db.LockTakeAsync(key, "token", TimeSpan.FromSeconds(30));

    await Task.Delay(100);

    Console.Write($"#{i} server.Version={muxer.GetServers()[0].Version}: ");

    try
    {
        Console.WriteLine($"released={await db.LockReleaseAsync(key, "token")}");
    }
    catch (RedisServerException ex)
    {
        Console.WriteLine(ex.Message);
    }

    await db.KeyDeleteAsync(key);
}
Vorherrschende Sprache
C#
Sterne
6.2k
Forks
1.6k
Ø Merge
9 Std. 42 Min.
Gemergte PRs (30 T.)
51

Entwicklungsumgebung

In Codespaces öffnen

Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus StackExchange/StackExchange.Redis

Alle Issues in StackExchange/StackExchange.Redis

Ähnliche Issues

Weitere Issues zu C#

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.