Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use grpc-dotnet instead of grpc #9149

Merged
merged 10 commits into from Mar 11, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG_PENDING.md
Expand Up @@ -18,6 +18,9 @@
- [cli/import] - Code generation in `pulumi import` can now be disabled with the `--generate-code=false` flag.
[#9141](https://github.com/pulumi/pulumi/pull/9141)

- [language/dotnet] - Updated Pulumi dotnet packages to use grpc-dotnet instead of grpc.
[#9149](https://github.com/pulumi/pulumi/pull/9149)

### Bug Fixes

- [sdk/python] - Fix build warnings. See
Expand Down
26 changes: 22 additions & 4 deletions sdk/dotnet/Pulumi/Deployment/GrpcEngine.cs
@@ -1,22 +1,40 @@
// Copyright 2016-2020, Pulumi Corporation

using System.Collections.Generic;
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Grpc.Core;
using Grpc.Net.Client;
using Pulumirpc;

namespace Pulumi
{
internal class GrpcEngine : IEngine
{
private readonly Engine.EngineClient _engine;
private static GrpcChannel? _engineChannel = null;
private readonly object _engineChannelLock = new object();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is _engineChannel static? Should _engineChannelLock be static too? (Same questions for GrpcMonitor below).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@justinvp According to the docs, creating a GrpcChannel is expensive whereas creating the gRPC client that uses the channel is not: hence I was keeping a single instance of the channel to be used across client instances to avoid recreating the channels every time.

As for _engineChannelLock it doesn't need to be static since it is only used for locking.

The lock however is no longer needed! I refactored the code to use a (concurrent) dictionary to keep track of the channels created by different Engine and Monitor addresses. This dictionary is thread-safe and doesn't need special locking


public GrpcEngine(string engine)
{
// maxRpcMessageSize raises the gRPC Max Message size from `4194304` (4mb) to `419430400` (400mb)
var maxRpcMessageSize = 400 * 1024 * 1024;
var grpcChannelOptions = new List<ChannelOption> { new ChannelOption(ChannelOptions.MaxReceiveMessageLength, maxRpcMessageSize)};
this._engine = new Engine.EngineClient(new Channel(engine, ChannelCredentials.Insecure, grpcChannelOptions));
lock (_engineChannelLock)
{
if (_engineChannel == null)
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
// Inititialize the engine channel once
_engineChannel = GrpcChannel.ForAddress(new Uri($"http://{engine}"), new GrpcChannelOptions
{
MaxReceiveMessageSize = maxRpcMessageSize,
MaxSendMessageSize = maxRpcMessageSize,
Credentials = Grpc.Core.ChannelCredentials.Insecure,
});
}
}

this._engine = new Engine.EngineClient(_engineChannel);
}

public async Task LogAsync(LogRequest request)
Expand Down
26 changes: 22 additions & 4 deletions sdk/dotnet/Pulumi/Deployment/GrpcMonitor.cs
@@ -1,22 +1,40 @@
// Copyright 2016-2020, Pulumi Corporation

using System.Collections.Generic;
using System;
using System.Threading.Tasks;
using Grpc.Core;
using Grpc.Net.Client;
using Pulumirpc;
using Grpc.Core;

namespace Pulumi
{
internal class GrpcMonitor : IMonitor
{
private readonly ResourceMonitor.ResourceMonitorClient _client;

private static GrpcChannel? _monitorChannel = null;
private readonly object _monitorChannelLock = new object();

public GrpcMonitor(string monitor)
{
// maxRpcMessageSize raises the gRPC Max Message size from `4194304` (4mb) to `419430400` (400mb)
var maxRpcMessageSize = 400 * 1024 * 1024;
var grpcChannelOptions = new List<ChannelOption> { new ChannelOption(ChannelOptions.MaxReceiveMessageLength, maxRpcMessageSize)};
this._client = new ResourceMonitor.ResourceMonitorClient(new Channel(monitor, ChannelCredentials.Insecure, grpcChannelOptions));
lock (_monitorChannelLock)
{
if (_monitorChannel == null)
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
// Inititialize the monitor channel once
_monitorChannel = GrpcChannel.ForAddress(new Uri($"http://{monitor}"), new GrpcChannelOptions
{
MaxReceiveMessageSize = maxRpcMessageSize,
MaxSendMessageSize = maxRpcMessageSize,
Credentials = ChannelCredentials.Insecure
});
}
}

this._client = new ResourceMonitor.ResourceMonitorClient(_monitorChannel);
}

public async Task<SupportsFeatureResponse> SupportsFeatureAsync(SupportsFeatureRequest request)
Expand Down
4 changes: 2 additions & 2 deletions sdk/dotnet/Pulumi/Pulumi.csproj
Expand Up @@ -31,8 +31,8 @@

<ItemGroup>
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="Grpc" Version="2.37.0" />
<PackageReference Include="Grpc.Tools" Version="2.37.0">
<PackageReference Include="Grpc.Net.Client" Version="2.43.0" />
<PackageReference Include="Grpc.Tools" Version="2.44.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down