Skip to content

Commit 11803a0

Browse files
committed
more PR nits
1 parent 04a2939 commit 11803a0

File tree

1 file changed

+69
-65
lines changed

1 file changed

+69
-65
lines changed

src/StackExchange.Redis/PhysicalConnection.cs

Lines changed: 69 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,71 +1683,75 @@ private enum PushKind
16831683
private PushKind GetPushKind(in Sequence<RawResult> result, out RedisChannel channel)
16841684
{
16851685
var len = result.Length;
1686-
if (len >= 2) // always have at least the kind and the subscription channel
1687-
{
1688-
const int MAX_LEN = 16;
1689-
Debug.Assert(MAX_LEN >= Enumerable.Max(
1690-
[
1691-
PushMessage.Length, PushPMessage.Length, PushSMessage.Length,
1692-
PushSubscribe.Length, PushPSubscribe.Length, PushSSubscribe.Length,
1693-
PushUnsubscribe.Length, PushPUnsubscribe.Length, PushSUnsubscribe.Length,
1694-
]));
1695-
ref readonly RawResult pushKind = ref result[0];
1696-
var multiSegmentPayload = pushKind.Payload;
1697-
if (multiSegmentPayload.Length <= MAX_LEN)
1698-
{
1699-
var span = multiSegmentPayload.IsSingleSegment
1700-
? multiSegmentPayload.First.Span
1701-
: CopyTo(stackalloc byte[MAX_LEN], multiSegmentPayload);
1702-
1703-
var hash = FastHash.Hash64(span);
1704-
RedisChannel.RedisChannelOptions channelOptions = RedisChannel.RedisChannelOptions.None;
1705-
PushKind kind;
1706-
switch (hash)
1707-
{
1708-
case PushMessage.Hash when PushMessage.Is(hash, span) & len >= 3:
1709-
kind = PushKind.Message;
1710-
break;
1711-
case PushPMessage.Hash when PushPMessage.Is(hash, span) & len >= 4:
1712-
channelOptions = RedisChannel.RedisChannelOptions.Pattern;
1713-
kind = PushKind.PMessage;
1714-
break;
1715-
case PushSMessage.Hash when PushSMessage.Is(hash, span) & len >= 3:
1716-
channelOptions = RedisChannel.RedisChannelOptions.Sharded;
1717-
kind = PushKind.SMessage;
1718-
break;
1719-
case PushSubscribe.Hash when PushSubscribe.Is(hash, span):
1720-
kind = PushKind.Subscribe;
1721-
break;
1722-
case PushPSubscribe.Hash when PushPSubscribe.Is(hash, span):
1723-
channelOptions = RedisChannel.RedisChannelOptions.Pattern;
1724-
kind = PushKind.PSubscribe;
1725-
break;
1726-
case PushSSubscribe.Hash when PushSSubscribe.Is(hash, span):
1727-
channelOptions = RedisChannel.RedisChannelOptions.Sharded;
1728-
kind = PushKind.SSubscribe;
1729-
break;
1730-
case PushUnsubscribe.Hash when PushUnsubscribe.Is(hash, span):
1731-
kind = PushKind.Unsubscribe;
1732-
break;
1733-
case PushPUnsubscribe.Hash when PushPUnsubscribe.Is(hash, span):
1734-
channelOptions = RedisChannel.RedisChannelOptions.Pattern;
1735-
kind = PushKind.PUnsubscribe;
1736-
break;
1737-
case PushSUnsubscribe.Hash when PushSUnsubscribe.Is(hash, span):
1738-
channelOptions = RedisChannel.RedisChannelOptions.Sharded;
1739-
kind = PushKind.SUnsubscribe;
1740-
break;
1741-
default:
1742-
kind = PushKind.None;
1743-
break;
1744-
}
1745-
if (kind != PushKind.None)
1746-
{
1747-
// the channel is always the second element
1748-
channel = result[1].AsRedisChannel(ChannelPrefix, channelOptions);
1749-
return kind;
1750-
}
1686+
if (len < 2)
1687+
{
1688+
// for supported cases, we demand at least the kind and the subscription channel
1689+
channel = default;
1690+
return PushKind.None;
1691+
}
1692+
1693+
const int MAX_LEN = 16;
1694+
Debug.Assert(MAX_LEN >= Enumerable.Max(
1695+
[
1696+
PushMessage.Length, PushPMessage.Length, PushSMessage.Length,
1697+
PushSubscribe.Length, PushPSubscribe.Length, PushSSubscribe.Length,
1698+
PushUnsubscribe.Length, PushPUnsubscribe.Length, PushSUnsubscribe.Length,
1699+
]));
1700+
ref readonly RawResult pushKind = ref result[0];
1701+
var multiSegmentPayload = pushKind.Payload;
1702+
if (multiSegmentPayload.Length <= MAX_LEN)
1703+
{
1704+
var span = multiSegmentPayload.IsSingleSegment
1705+
? multiSegmentPayload.First.Span
1706+
: CopyTo(stackalloc byte[MAX_LEN], multiSegmentPayload);
1707+
1708+
var hash = FastHash.Hash64(span);
1709+
RedisChannel.RedisChannelOptions channelOptions = RedisChannel.RedisChannelOptions.None;
1710+
PushKind kind;
1711+
switch (hash)
1712+
{
1713+
case PushMessage.Hash when PushMessage.Is(hash, span) & len >= 3:
1714+
kind = PushKind.Message;
1715+
break;
1716+
case PushPMessage.Hash when PushPMessage.Is(hash, span) & len >= 4:
1717+
channelOptions = RedisChannel.RedisChannelOptions.Pattern;
1718+
kind = PushKind.PMessage;
1719+
break;
1720+
case PushSMessage.Hash when PushSMessage.Is(hash, span) & len >= 3:
1721+
channelOptions = RedisChannel.RedisChannelOptions.Sharded;
1722+
kind = PushKind.SMessage;
1723+
break;
1724+
case PushSubscribe.Hash when PushSubscribe.Is(hash, span):
1725+
kind = PushKind.Subscribe;
1726+
break;
1727+
case PushPSubscribe.Hash when PushPSubscribe.Is(hash, span):
1728+
channelOptions = RedisChannel.RedisChannelOptions.Pattern;
1729+
kind = PushKind.PSubscribe;
1730+
break;
1731+
case PushSSubscribe.Hash when PushSSubscribe.Is(hash, span):
1732+
channelOptions = RedisChannel.RedisChannelOptions.Sharded;
1733+
kind = PushKind.SSubscribe;
1734+
break;
1735+
case PushUnsubscribe.Hash when PushUnsubscribe.Is(hash, span):
1736+
kind = PushKind.Unsubscribe;
1737+
break;
1738+
case PushPUnsubscribe.Hash when PushPUnsubscribe.Is(hash, span):
1739+
channelOptions = RedisChannel.RedisChannelOptions.Pattern;
1740+
kind = PushKind.PUnsubscribe;
1741+
break;
1742+
case PushSUnsubscribe.Hash when PushSUnsubscribe.Is(hash, span):
1743+
channelOptions = RedisChannel.RedisChannelOptions.Sharded;
1744+
kind = PushKind.SUnsubscribe;
1745+
break;
1746+
default:
1747+
kind = PushKind.None;
1748+
break;
1749+
}
1750+
if (kind != PushKind.None)
1751+
{
1752+
// the channel is always the second element
1753+
channel = result[1].AsRedisChannel(ChannelPrefix, channelOptions);
1754+
return kind;
17511755
}
17521756
}
17531757
channel = default;

0 commit comments

Comments
 (0)