Skip to content

Commit d3a1f5b

Browse files
committed
WIP v3 (#3035)
* WIP v3 merge attempt * fix refs/externs * nits * ascii hash cleanup * remove unused local function * v3 remove pipelines.sockets.unofficial (#3042) * remove Pipelines.Sockets.Unofficial * wip * remove the last traces of Pipelines.Sockets.Unofficial * fix deps * WIP: deps * fix build deps * rev GitHubActionsTestLogger * - fix delegate [UnsafeAccessor] usage - implement Mono pattern * merge (incomplete) * merge * missed a sync-context await * fix missing configureawait usage * missing VT consumption * checking CI fail * versioning
1 parent dd18662 commit d3a1f5b

196 files changed

Lines changed: 13025 additions & 6406 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<PublishRepositoryUrl>true</PublishRepositoryUrl>
2727
<IsPackable>false</IsPackable>
2828
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
29+
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
2930
<PublicKey>00240000048000009400000006020000002400005253413100040000010001007791a689e9d8950b44a9a8886baad2ea180e7a8a854f158c9b98345ca5009cdd2362c84f368f1c3658c132b3c0f74e44ff16aeb2e5b353b6e0fe02f923a050470caeac2bde47a2238a9c7125ed7dab14f486a5a64558df96640933b9f2b6db188fc4a820f96dce963b662fa8864adbff38e5b4542343f162ecdc6dad16912fff</PublicKey>
3031
</PropertyGroup>
3132
<PropertyGroup Condition="'$(Configuration)' == 'Release'">

Directory.Packages.props

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,39 @@
11
<Project>
22
<ItemGroup>
33
<!-- Packages we depend on for StackExchange.Redis, upgrades can create binding redirect pain! -->
4-
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.14" />
5-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.3" />
6-
<PackageVersion Include="Pipelines.Sockets.Unofficial" Version="2.2.16" />
4+
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.5" />
5+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.5" />
76
<PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="5.0.0" />
8-
<PackageVersion Include="System.Threading.Channels" Version="5.0.0" />
7+
<PackageVersion Include="System.Threading.Channels" Version="10.0.5" />
98
<PackageVersion Include="System.Runtime.InteropServices.RuntimeInformation" Version="4.3.0" />
109
<PackageVersion Include="System.IO.Compression" Version="4.3.0" />
11-
<!-- note that this bumps System.Buffers, so is pinned in down-level in SE csproj -->
12-
<PackageVersion Include="System.IO.Hashing" Version="10.0.2" />
10+
<PackageVersion Include="System.IO.Pipelines" Version="10.0.5" />
11+
<!-- note that this bumps System.Buffers, so is pinned in down-level in SE csproj -->
12+
<PackageVersion Include="System.IO.Hashing" Version="10.0.5" />
1313
<!-- for RESPite -->
1414
<PackageVersion Include="System.Buffers" Version="4.6.1" />
15-
<PackageVersion Include="System.Memory" Version="4.6.1" />
16-
15+
<PackageVersion Include="System.Memory" Version="4.6.3" />
1716
<!-- For analyzers, tied to the consumer's build SDK; at the moment, that means "us" -->
18-
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
19-
17+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.3.0" />
2018
<!-- Packages only used in the solution, upgrade at will -->
21-
<PackageVersion Include="BenchmarkDotNet" Version="0.15.2" />
22-
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1" />
19+
<PackageVersion Include="BenchmarkDotNet" Version="0.15.8" />
20+
<PackageVersion Include="GitHubActionsTestLogger" Version="3.0.2" />
2321
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="4.14.0" />
2422
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
25-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
26-
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
27-
<PackageVersion Include="Microsoft.Testing.Platform" Version="1.7.3" />
28-
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.7.115" />
29-
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
23+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
24+
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="10.0.201" />
25+
<PackageVersion Include="Microsoft.Testing.Platform" Version="2.1.0" />
26+
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.9.50" />
27+
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
3028
<PackageVersion Include="NSubstitute" Version="5.3.0" />
31-
<PackageVersion Include="StackExchange.Redis" Version="2.6.96" />
29+
<PackageVersion Include="StackExchange.Redis" Version="2.12.4" />
3230
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
33-
<PackageVersion Include="System.Collections.Immutable" Version="9.0.0" />
34-
<PackageVersion Include="System.Reflection.Metadata" Version="9.0.0" />
35-
31+
<PackageVersion Include="System.Collections.Immutable" Version="10.0.5" />
32+
<PackageVersion Include="System.Reflection.Metadata" Version="10.0.5" />
3633
<!-- For binding redirect testing, main package gets this transitively -->
37-
<PackageVersion Include="System.IO.Pipelines" Version="9.0.0" />
38-
<PackageVersion Include="System.Runtime.Caching" Version="9.0.0" />
39-
<PackageVersion Include="xunit.v3" Version="3.0.0" />
40-
<PackageVersion Include="xunit.v3.runner.console" Version="3.0.0" />
41-
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.3" />
34+
<PackageVersion Include="System.Runtime.Caching" Version="10.0.5" />
35+
<PackageVersion Include="xunit.v3" Version="3.2.2" />
36+
<PackageVersion Include="xunit.v3.runner.console" Version="3.2.2" />
37+
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
4238
</ItemGroup>
4339
</Project>

StackExchange.Redis.sln.DotSettings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@
2626
<s:Boolean x:Key="/Default/UserDictionary/Words/=xreadgroup/@EntryIndexedValue">True</s:Boolean>
2727
<s:Boolean x:Key="/Default/UserDictionary/Words/=xrevrange/@EntryIndexedValue">True</s:Boolean>
2828
<s:Boolean x:Key="/Default/UserDictionary/Words/=zcard/@EntryIndexedValue">True</s:Boolean>
29-
<s:Boolean x:Key="/Default/UserDictionary/Words/=zscan/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
29+
<s:Boolean x:Key="/Default/UserDictionary/Words/=zscan/@EntryIndexedValue">True</s:Boolean>
30+
<s:Boolean x:Key="/Default/UserDictionary/Words/=zset/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

docs/exp/SER004.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# RESPite
2+
3+
RESPite is an experimental library that provides high-performance low-level RESP (Redis, etc) parsing and serialization.
4+
It is used as the IO core for StackExchange.Redis v3+. You should not (yet) use it directly unless you have a very
5+
good reason to do so.
6+
7+
```xml
8+
<NoWarn>$(NoWarn);SER004</NoWarn>
9+
```
10+
11+
or more granularly / locally in C#:
12+
13+
``` c#
14+
#pragma warning disable SER004
15+
```

docs/exp/SER005.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Unit Testing
2+
3+
Unit testing is great! Yay, do more of that!
4+
5+
This type is provided for external unit testing, in particular by people using modules or server features
6+
not directly implemented by SE.Redis - for example to verify messsage parsing or formatting without
7+
talking to a RESP server.
8+
9+
These types are considered slightly more... *mercurial*. We encourage you to use them, but *occasionally*
10+
(not just for fun) you might need to update your test code if we tweak something. This should not impact
11+
"real" library usage.
12+
13+
```xml
14+
<NoWarn>$(NoWarn);SER005</NoWarn>
15+
```
16+
17+
or more granularly / locally in C#:
18+
19+
``` c#
20+
#pragma warning disable SER005
21+
```

src/RESPite/Messages/RespReader.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,6 @@ private readonly unsafe bool TryParseSlow<T>(
746746
/// <param name="value">The parsed value if successful.</param>
747747
/// <returns><c>true</c> if parsing succeeded; otherwise, <c>false</c>.</returns>
748748
#pragma warning disable RS0016, RS0027 // public API
749-
[Experimental(Experiments.Respite, UrlFormat = Experiments.UrlFormat)]
750749
[MethodImpl(MethodImplOptions.AggressiveInlining)]
751750
#if DEBUG
752751
[Obsolete("Please prefer the function-pointer API for library-internal use.")]
@@ -758,6 +757,52 @@ public readonly bool TryParseScalar<T>(ScalarParser<byte, T> parser, out T value
758757
return TryGetSpan(out var span) ? parser(span, out value) : TryParseSlow(parser, out value);
759758
}
760759

760+
private readonly ReadOnlySpan<char> BufferChars(Span<char> target, out char[]? lease)
761+
{
762+
byte[] byteLease = [];
763+
var bytes = Buffer(ref byteLease, byteLease);
764+
765+
int len = RespConstants.UTF8.GetMaxCharCount(bytes.Length);
766+
if (len <= target.Length)
767+
{
768+
lease = null;
769+
}
770+
else
771+
{
772+
target = lease = ArrayPool<char>.Shared.Rent(len);
773+
}
774+
len = RespConstants.UTF8.GetChars(bytes, target);
775+
return target.Slice(0, len);
776+
}
777+
778+
/// <summary>
779+
/// Tries to read the current scalar element using a parser callback.
780+
/// </summary>
781+
/// <typeparam name="T">The type of data being parsed.</typeparam>
782+
/// <param name="parser">The parser callback.</param>
783+
/// <param name="value">The parsed value if successful.</param>
784+
/// <returns><c>true</c> if parsing succeeded; otherwise, <c>false</c>.</returns>
785+
public readonly bool TryParseScalar<T>(ScalarParser<char, T> parser, out T value)
786+
{
787+
// note: no benefit in a function-ptr overload, after we've dealt with decoding bytes etc
788+
var buffer = BufferChars(stackalloc char[128], out var lease);
789+
try
790+
{
791+
return parser(buffer, out value);
792+
}
793+
finally
794+
{
795+
if (lease is not null) ArrayPool<char>.Shared.Return(lease);
796+
}
797+
}
798+
799+
/// <summary>
800+
/// Tries to read the current scalar element using a parser callback.
801+
/// </summary>
802+
/// <typeparam name="T">The type of data being parsed.</typeparam>
803+
/// <param name="parser">The parser callback.</param>
804+
/// <param name="value">The parsed value if successful.</param>
805+
/// <returns><c>true</c> if parsing succeeded; otherwise, <c>false</c>.</returns>
761806
[MethodImpl(MethodImplOptions.NoInlining)]
762807
private readonly bool TryParseSlow<T>(ScalarParser<byte, T> parser, out T value)
763808
{
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
#nullable enable
2+
[SER004]RESPite.Messages.RespReader.TryParseScalar<T>(RESPite.Messages.RespReader.ScalarParser<char, T>! parser, out T value) -> bool
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#nullable enable
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#nullable enable

src/RESPite/RESPite.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,4 @@
4646
<InternalsVisibleTo Include="StackExchange.Redis.Server" />
4747
<InternalsVisibleTo Include="StackExchange.Redis.Benchmarks" />
4848
</ItemGroup>
49-
50-
5149
</Project>

0 commit comments

Comments
 (0)