Skip to content

Commit 4f06b60

Browse files
JamesNKgfoidl
andauthored
Change nullable GetValueOrDefault to Value (#1855)
Co-authored-by: Günther Foidl <gue@korporal.at>
1 parent 77ae8af commit 4f06b60

17 files changed

+106
-67
lines changed

src/Grpc.AspNetCore.Server/Grpc.AspNetCore.Server.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<Compile Include="..\Shared\Server\ServerMethodInvokerBase.cs" Link="Model\Internal\ServerMethodInvokerBase.cs" />
2929
<Compile Include="..\Shared\Server\ServerStreamingServerMethodInvoker.cs" Link="Model\Internal\ServerStreamingServerMethodInvoker.cs" />
3030
<Compile Include="..\Shared\Server\UnaryServerMethodInvoker.cs" Link="Model\Internal\UnaryServerMethodInvoker.cs" />
31+
<Compile Include="..\Shared\NullableAttributes.cs" Link="Internal\NullableAttributes.cs" />
3132
</ItemGroup>
3233

3334
<ItemGroup>

src/Grpc.AspNetCore.Server/Internal/HttpContextSerializationContext.cs

+36-14
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,20 @@ internal sealed class HttpContextSerializationContext : SerializationContext
3939

4040
public PipeWriter ResponseBufferWriter { get; set; } = default!;
4141

42-
private bool DirectSerializationSupported => _compressionProvider == null && _payloadLength != null;
42+
private bool IsDirectSerializationSupported(out int payloadLength)
43+
{
44+
// Message can be written directly to the buffer if:
45+
// - Its length is known.
46+
// - There is no compression.
47+
if (_payloadLength != null)
48+
{
49+
payloadLength = _payloadLength.Value;
50+
return _compressionProvider == null;
51+
}
52+
53+
payloadLength = 0;
54+
return false;
55+
}
4356

4457
public HttpContextSerializationContext(HttpContextServerCallContext serverCallContext)
4558
{
@@ -130,13 +143,11 @@ public override IBufferWriter<byte> GetBufferWriter()
130143
{
131144
case InternalState.Initialized:
132145
// When writing directly to the buffer the header with message size needs to be written first
133-
if (DirectSerializationSupported)
146+
if (IsDirectSerializationSupported(out var payloadLength))
134147
{
135-
Debug.Assert(_payloadLength != null, "A payload length is required for direct serialization.");
148+
EnsureMessageSizeAllowed(payloadLength);
136149

137-
EnsureMessageSizeAllowed(_payloadLength.Value);
138-
139-
WriteHeader(ResponseBufferWriter, _payloadLength.Value, compress: false);
150+
WriteHeader(ResponseBufferWriter, payloadLength, compress: false);
140151
}
141152

142153
_state = InternalState.IncompleteBufferWriter;
@@ -151,9 +162,20 @@ public override IBufferWriter<byte> GetBufferWriter()
151162

152163
private IBufferWriter<byte> ResolveBufferWriter()
153164
{
154-
return DirectSerializationSupported
155-
? (IBufferWriter<byte>)ResponseBufferWriter
156-
: _bufferWriter ??= new ArrayBufferWriter<byte>();
165+
if (IsDirectSerializationSupported(out var payloadLength))
166+
{
167+
return ResponseBufferWriter;
168+
}
169+
else if (_bufferWriter == null)
170+
{
171+
// Initialize buffer writer with exact length if available.
172+
// ArrayBufferWriter doesn't allow zero initial length.
173+
_bufferWriter = payloadLength > 0
174+
? new ArrayBufferWriter<byte>(payloadLength)
175+
: new ArrayBufferWriter<byte>();
176+
}
177+
178+
return _bufferWriter;
157179
}
158180

159181
private void EnsureMessageSizeAllowed(int payloadLength)
@@ -175,7 +197,11 @@ public override void Complete()
175197
case InternalState.IncompleteBufferWriter:
176198
_state = InternalState.CompleteBufferWriter;
177199

178-
if (!DirectSerializationSupported)
200+
if (IsDirectSerializationSupported(out var payloadLength))
201+
{
202+
GrpcServerLog.SerializedMessage(_serverCallContext.Logger, _serverCallContext.ResponseType, payloadLength);
203+
}
204+
else
179205
{
180206
Debug.Assert(_bufferWriter != null, "Buffer writer has been set to get to this state.");
181207

@@ -184,10 +210,6 @@ public override void Complete()
184210
GrpcServerLog.SerializedMessage(_serverCallContext.Logger, _serverCallContext.ResponseType, data.Length);
185211
WriteMessage(data);
186212
}
187-
else
188-
{
189-
GrpcServerLog.SerializedMessage(_serverCallContext.Logger, _serverCallContext.ResponseType, _payloadLength.GetValueOrDefault());
190-
}
191213
break;
192214
default:
193215
ThrowInvalidState(_state);

src/Grpc.AspNetCore.Server/Internal/PipeExtensions.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public static async ValueTask<T> ReadSingleMessageAsync<T>(this PipeReader input
219219
if (TryReadMessage(ref buffer, serverCallContext, out var data))
220220
{
221221
// Finished and the complete message has arrived
222-
GrpcServerLog.DeserializingMessage(logger, (int)data.GetValueOrDefault().Length, typeof(T));
222+
GrpcServerLog.DeserializingMessage(logger, (int)data.Length, typeof(T));
223223

224224
serverCallContext.DeserializationContext.SetPayload(data);
225225
request = deserializer(serverCallContext.DeserializationContext);
@@ -311,7 +311,7 @@ public static async ValueTask<T> ReadSingleMessageAsync<T>(this PipeReader input
311311
{
312312
completeMessage = true;
313313

314-
GrpcServerLog.DeserializingMessage(logger, (int)data.Value.Length, typeof(T));
314+
GrpcServerLog.DeserializingMessage(logger, (int)data.Length, typeof(T));
315315

316316
serverCallContext.DeserializationContext.SetPayload(data);
317317
var request = deserializer(serverCallContext.DeserializationContext);
@@ -361,11 +361,11 @@ public static async ValueTask<T> ReadSingleMessageAsync<T>(this PipeReader input
361361
}
362362
}
363363

364-
private static bool TryReadMessage(ref ReadOnlySequence<byte> buffer, HttpContextServerCallContext context, [NotNullWhen(true)] out ReadOnlySequence<byte>? message)
364+
private static bool TryReadMessage(ref ReadOnlySequence<byte> buffer, HttpContextServerCallContext context, out ReadOnlySequence<byte> message)
365365
{
366366
if (!TryReadHeader(buffer, out var compressed, out var messageLength))
367367
{
368-
message = null;
368+
message = default;
369369
return false;
370370
}
371371

@@ -376,7 +376,7 @@ private static bool TryReadMessage(ref ReadOnlySequence<byte> buffer, HttpContex
376376

377377
if (buffer.Length < HeaderSize + messageLength)
378378
{
379-
message = null;
379+
message = default;
380380
return false;
381381
}
382382

@@ -429,7 +429,7 @@ private static bool TryReadMessage(ref ReadOnlySequence<byte> buffer, HttpContex
429429
return true;
430430
}
431431

432-
private static bool TryDecompressMessage(ILogger logger, string compressionEncoding, IReadOnlyDictionary<string, ICompressionProvider> compressionProviders, in ReadOnlySequence<byte> messageData, [NotNullWhen(true)] out ReadOnlySequence<byte>? result)
432+
private static bool TryDecompressMessage(ILogger logger, string compressionEncoding, IReadOnlyDictionary<string, ICompressionProvider> compressionProviders, in ReadOnlySequence<byte> messageData, out ReadOnlySequence<byte> result)
433433
{
434434
if (compressionProviders.TryGetValue(compressionEncoding, out var compressionProvider))
435435
{
@@ -445,7 +445,7 @@ private static bool TryDecompressMessage(ILogger logger, string compressionEncod
445445
return true;
446446
}
447447

448-
result = null;
448+
result = default;
449449
return false;
450450
}
451451
}

src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ protected override bool TryComputeLength(out long length)
6666
// to take into account base64 encoding size difference:
6767
// Increase length by 4/3, then round up to the next multiple of 4.
6868
length = _mode == GrpcWebMode.GrpcWebText
69-
? ((4 * contentLength.GetValueOrDefault() / 3) + 3) & ~3
70-
: contentLength.GetValueOrDefault();
69+
? ((4 * contentLength.Value / 3) + 3) & ~3
70+
: contentLength.Value;
7171
return true;
7272
}
7373

src/Grpc.Net.Client/Balancer/Internal/ConnectionManager.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,13 @@ private void OnResolverResult(ResolverResult result)
148148
if (_previousServiceConfig == null)
149149
{
150150
// Step 4.ii: If no config was provided or set previously, then treat resolution as a failure.
151-
channelStatus = result.ServiceConfigStatus.GetValueOrDefault();
151+
channelStatus = result.ServiceConfigStatus.Value;
152152
}
153153
else
154154
{
155155
// Step 4.i: Continue using previous service config if it was set and a new one is not provided.
156156
workingServiceConfig = _previousServiceConfig;
157-
ConnectionManagerLog.ResolverServiceConfigFallback(Logger, result.ServiceConfigStatus.GetValueOrDefault());
157+
ConnectionManagerLog.ResolverServiceConfigFallback(Logger, result.ServiceConfigStatus.Value);
158158
}
159159
}
160160
}
@@ -165,7 +165,6 @@ private void OnResolverResult(ResolverResult result)
165165
_previousServiceConfig = result.ServiceConfig;
166166
}
167167

168-
169168
if (workingServiceConfig?.LoadBalancingConfigs.Count > 0)
170169
{
171170
if (!ChildHandlerLoadBalancer.TryGetValidServiceConfigFactory(workingServiceConfig.LoadBalancingConfigs, LoadBalancerFactories, out loadBalancingConfig, out var _))

src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,11 @@ public override void UpdateChannelState(ChannelState state)
138138
if (i != null)
139139
{
140140
// There is a match so take current subchannel.
141-
newOrCurrentSubchannel = currentSubchannels[i.GetValueOrDefault()];
141+
newOrCurrentSubchannel = currentSubchannels[i.Value];
142142

143143
// Remove from current collection because any subchannels
144144
// remaining in this collection at the end will be disposed.
145-
currentSubchannels.RemoveAt(i.GetValueOrDefault());
145+
currentSubchannels.RemoveAt(i.Value);
146146

147147
SubchannelLog.SubchannelPreserved(_logger, newOrCurrentSubchannel.Subchannel.Id, address);
148148
}

src/Grpc.Net.Client/GrpcChannel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ private ChannelRetryThrottling CreateChannelRetryThrottling(RetryThrottlingPolic
345345
throw CreateException(RetryThrottlingPolicy.TokenRatioPropertyName);
346346
}
347347

348-
return new ChannelRetryThrottling(retryThrottling.MaxTokens.GetValueOrDefault(), retryThrottling.TokenRatio.GetValueOrDefault(), LoggerFactory);
348+
return new ChannelRetryThrottling(retryThrottling.MaxTokens.Value, retryThrottling.TokenRatio.Value, LoggerFactory);
349349

350350
static InvalidOperationException CreateException(string propertyName)
351351
{

src/Grpc.Net.Client/Internal/Configuration/ConvertHelpers.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public static StatusCode ConvertStatusCode(string statusCode)
121121

122122
// This format is based on the Protobuf duration's JSON mapping.
123123
// https://github.com/protocolbuffers/protobuf/blob/35bdcabdd6a05ce9ee738ad7df8c1299d9c7fc4b/src/google/protobuf/duration.proto#L92
124-
return value.GetValueOrDefault().TotalSeconds.ToString(CultureInfo.InvariantCulture) + "s";
124+
return value.Value.TotalSeconds.ToString(CultureInfo.InvariantCulture) + "s";
125125
}
126126
}
127127
}

src/Grpc.Net.Client/Internal/GrpcCallSerializationContext.cs

+26-15
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,20 @@ internal sealed class GrpcCallSerializationContext : SerializationContext, IBuff
3535
private int? _payloadLength;
3636
private ICompressionProvider? _compressionProvider;
3737

38-
private bool DirectSerializationSupported => _compressionProvider == null && _payloadLength != null;
38+
private bool IsDirectSerializationSupported(out int payloadLength)
39+
{
40+
// Message can be written directly to the buffer if:
41+
// - Its length is known.
42+
// - There is no compression.
43+
if (_payloadLength != null)
44+
{
45+
payloadLength = _payloadLength.Value;
46+
return _compressionProvider == null;
47+
}
48+
49+
payloadLength = 0;
50+
return false;
51+
}
3952

4053
private ArrayBufferWriter<byte>? _bufferWriter;
4154
private byte[]? _buffer;
@@ -172,13 +185,11 @@ public override IBufferWriter<byte> GetBufferWriter()
172185
var bufferWriter = ResolveBufferWriter();
173186

174187
// When writing directly to the buffer the header with message size needs to be written first
175-
if (DirectSerializationSupported)
188+
if (IsDirectSerializationSupported(out var payloadLength))
176189
{
177-
CompatibilityHelpers.Assert(_payloadLength != null, "A payload length is required for direct serialization.");
178-
179-
EnsureMessageSizeAllowed(_payloadLength.Value);
190+
EnsureMessageSizeAllowed(payloadLength);
180191

181-
WriteHeader(_buffer, _payloadLength.Value, compress: false);
192+
WriteHeader(_buffer, payloadLength, compress: false);
182193
_bufferPosition += GrpcProtocolConstants.HeaderSize;
183194
}
184195

@@ -194,11 +205,11 @@ public override IBufferWriter<byte> GetBufferWriter()
194205

195206
private IBufferWriter<byte> ResolveBufferWriter()
196207
{
197-
if (DirectSerializationSupported)
208+
if (IsDirectSerializationSupported(out var payloadLength))
198209
{
199210
if (_buffer == null)
200211
{
201-
_buffer = ArrayPool<byte>.Shared.Rent(GrpcProtocolConstants.HeaderSize + _payloadLength.GetValueOrDefault());
212+
_buffer = ArrayPool<byte>.Shared.Rent(GrpcProtocolConstants.HeaderSize + payloadLength);
202213
}
203214

204215
return this;
@@ -207,8 +218,8 @@ private IBufferWriter<byte> ResolveBufferWriter()
207218
{
208219
// Initialize buffer writer with exact length if available.
209220
// ArrayBufferWriter doesn't allow zero initial length.
210-
_bufferWriter = _payloadLength > 0
211-
? new ArrayBufferWriter<byte>(_payloadLength.GetValueOrDefault())
221+
_bufferWriter = payloadLength > 0
222+
? new ArrayBufferWriter<byte>(payloadLength)
212223
: new ArrayBufferWriter<byte>();
213224
}
214225

@@ -234,7 +245,11 @@ public override void Complete()
234245
case InternalState.IncompleteBufferWriter:
235246
_state = InternalState.CompleteBufferWriter;
236247

237-
if (!DirectSerializationSupported)
248+
if (IsDirectSerializationSupported(out var payloadLength))
249+
{
250+
GrpcCallLog.SerializedMessage(_call.Logger, _call.RequestType, payloadLength);
251+
}
252+
else
238253
{
239254
CompatibilityHelpers.Assert(_bufferWriter != null, "Buffer writer has been set to get to this state.");
240255

@@ -243,10 +258,6 @@ public override void Complete()
243258
GrpcCallLog.SerializedMessage(_call.Logger, _call.RequestType, data.Length);
244259
WriteMessage(data);
245260
}
246-
else
247-
{
248-
GrpcCallLog.SerializedMessage(_call.Logger, _call.RequestType, _payloadLength.GetValueOrDefault());
249-
}
250261
break;
251262
default:
252263
ThrowInvalidState(_state);

src/Grpc.Net.Client/Internal/GrpcMethodInfo.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ internal static RetryPolicyInfo CreateRetryPolicy(RetryPolicy r)
8484

8585
return new RetryPolicyInfo
8686
{
87-
MaxAttempts = r.MaxAttempts.GetValueOrDefault(),
88-
InitialBackoff = r.InitialBackoff.GetValueOrDefault(),
89-
MaxBackoff = r.MaxBackoff.GetValueOrDefault(),
90-
BackoffMultiplier = r.BackoffMultiplier.GetValueOrDefault(),
87+
MaxAttempts = r.MaxAttempts.Value,
88+
InitialBackoff = r.InitialBackoff.Value,
89+
MaxBackoff = r.MaxBackoff.Value,
90+
BackoffMultiplier = r.BackoffMultiplier.Value,
9191
RetryableStatusCodes = r.RetryableStatusCodes.ToList()
9292
};
9393
}
@@ -105,8 +105,8 @@ internal static HedgingPolicyInfo CreateHedgingPolicy(HedgingPolicy h)
105105

106106
return new HedgingPolicyInfo
107107
{
108-
MaxAttempts = h.MaxAttempts.GetValueOrDefault(),
109-
HedgingDelay = h.HedgingDelay.GetValueOrDefault(),
108+
MaxAttempts = h.MaxAttempts.Value,
109+
HedgingDelay = h.HedgingDelay ?? TimeSpan.Zero,
110110
NonFatalStatusCodes = h.NonFatalStatusCodes.ToList()
111111
};
112112
}

src/Grpc.Net.Client/Internal/GrpcProtocolHelpers.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ public static Status CreateStatusFromException(string summary, Exception ex, Sta
559559
var exceptionMessage = CommonGrpcProtocolHelpers.ConvertToRpcExceptionMessage(ex);
560560
statusCode ??= ResolveRpcExceptionStatusCode(ex);
561561

562-
return new Status(statusCode.GetValueOrDefault(), summary + " " + exceptionMessage, ex);
562+
return new Status(statusCode.Value, summary + " " + exceptionMessage, ex);
563563
}
564564
}
565565
}

src/Grpc.Net.Client/Internal/Retry/HedgingCall.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ private async Task StartCall(Action<GrpcCall<TRequest, TResponse>> startCallFunc
175175
{
176176
if (retryPushbackMS >= 0)
177177
{
178-
_pushbackDelay = TimeSpan.FromMilliseconds(retryPushbackMS.GetValueOrDefault());
178+
_pushbackDelay = TimeSpan.FromMilliseconds(retryPushbackMS.Value);
179179
}
180180
_delayInterruptTcs.TrySetResult(null);
181181
}
@@ -348,7 +348,7 @@ private async Task HedgingDelayAsync(TimeSpan hedgingDelay)
348348
if (_pushbackDelay != null)
349349
{
350350
// Use pushback value and delay again
351-
hedgingDelay = _pushbackDelay.GetValueOrDefault();
351+
hedgingDelay = _pushbackDelay.Value;
352352

353353
_pushbackDelay = null;
354354
}
@@ -426,7 +426,7 @@ await DoClientStreamActionAsync(async calls =>
426426
if (c.TryRegisterCancellation(cancellationToken, out var registration))
427427
{
428428
registrations ??= new List<CancellationTokenRegistration>(calls.Count);
429-
registrations.Add(registration.GetValueOrDefault());
429+
registrations.Add(registration.Value);
430430
}
431431

432432
var writeTask = c.WriteClientStreamAsync(WriteNewMessage, message);

0 commit comments

Comments
 (0)