mirror of https://github.com/grpc/grpc.git
commit
ccced5389d
192 changed files with 3931 additions and 2040 deletions
@ -0,0 +1,65 @@ |
||||
GRPC Connection Backoff Protocol |
||||
================================ |
||||
|
||||
When we do a connection to a backend which fails, it is typically desirable to |
||||
not retry immediately (to avoid flooding the network or the server with |
||||
requests) and instead do some form of exponential backoff. |
||||
|
||||
We have several parameters: |
||||
1. INITIAL_BACKOFF (how long to wait after the first failure before retrying) |
||||
2. MULTIPLIER (factor with which to multiply backoff after a failed retry) |
||||
3. MAX_BACKOFF (Upper bound on backoff) |
||||
4. MIN_CONNECTION_TIMEOUT |
||||
|
||||
## Proposed Backoff Algorithm |
||||
|
||||
Exponentially back off the start time of connection attempts up to a limit of |
||||
MAX_BACKOFF. |
||||
|
||||
``` |
||||
ConnectWithBackoff() |
||||
current_backoff = INITIAL_BACKOFF |
||||
current_deadline = now() + INITIAL_BACKOFF |
||||
while (TryConnect(Max(current_deadline, MIN_CONNECT_TIMEOUT)) |
||||
!= SUCCESS) |
||||
SleepUntil(current_deadline) |
||||
current_backoff = Min(current_backoff * MULTIPLIER, MAX_BACKOFF) |
||||
current_deadline = now() + current_backoff |
||||
``` |
||||
|
||||
## Historical Algorithm in Stubby |
||||
|
||||
Exponentially increase up to a limit of MAX_BACKOFF the intervals between |
||||
connection attempts. This is what stubby 2 uses, and is equivalent if |
||||
TryConnect() fails instantly. |
||||
|
||||
``` |
||||
LegacyConnectWithBackoff() |
||||
current_backoff = INITIAL_BACKOFF |
||||
while (TryConnect(MIN_CONNECT_TIMEOUT) != SUCCESS) |
||||
SleepFor(current_backoff) |
||||
current_backoff = Min(current_backoff * MULTIPLIER, MAX_BACKOFF) |
||||
``` |
||||
|
||||
The grpc C implementation currently uses this approach with an initial backoff |
||||
of 1 second, multiplier of 2, and maximum backoff of 120 seconds. (This will |
||||
change) |
||||
|
||||
Stubby, or at least rpc2, uses exactly this algorithm with an initial backoff |
||||
of 1 second, multiplier of 1.2, and a maximum backoff of 120 seconds. |
||||
|
||||
## Use Cases to Consider |
||||
|
||||
* Client tries to connect to a server which is down for multiple hours, eg for |
||||
maintenance |
||||
* Client tries to connect to a server which is overloaded |
||||
* User is bringing up both a client and a server at the same time |
||||
* In particular, we would like to avoid a large unnecessary delay if the |
||||
client connects to a server which is about to come up |
||||
* Client/server are misconfigured such that connection attempts always fail |
||||
* We want to make sure these don’t put too much load on the server by |
||||
default. |
||||
* Server is overloaded and wants to transiently make clients back off |
||||
* Application has out of band reason to believe a server is back |
||||
* We should consider an out of band mechanism for the client to hint that |
||||
we should short circuit the backoff. |
@ -0,0 +1,49 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#ifndef GRPC_SUPPORT_SUBPROCESS_H |
||||
#define GRPC_SUPPORT_SUBPROCESS_H |
||||
|
||||
typedef struct gpr_subprocess gpr_subprocess; |
||||
|
||||
/* .exe on windows, empty on unices */ |
||||
char *gpr_subprocess_binary_extension(); |
||||
|
||||
gpr_subprocess *gpr_subprocess_create(int argc, char **argv); |
||||
/* if subprocess has not been joined, kill it */ |
||||
void gpr_subprocess_destroy(gpr_subprocess *p); |
||||
/* returns exit status; can be called at most once */ |
||||
int gpr_subprocess_join(gpr_subprocess *p); |
||||
void gpr_subprocess_interrupt(gpr_subprocess *p); |
||||
|
||||
#endif |
@ -0,0 +1,108 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#ifdef GPR_POSIX_SUBPROCESS |
||||
|
||||
#include <grpc/support/subprocess.h> |
||||
|
||||
#include <unistd.h> |
||||
#include <assert.h> |
||||
#include <errno.h> |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
#include <signal.h> |
||||
#include <stdlib.h> |
||||
#include <sys/types.h> |
||||
#include <sys/wait.h> |
||||
|
||||
#include <grpc/support/alloc.h> |
||||
#include <grpc/support/log.h> |
||||
|
||||
struct gpr_subprocess { |
||||
int pid; |
||||
int joined; |
||||
}; |
||||
|
||||
char *gpr_subprocess_binary_extension() { return ""; } |
||||
|
||||
gpr_subprocess *gpr_subprocess_create(int argc, char **argv) { |
||||
gpr_subprocess *r; |
||||
int pid; |
||||
char **exec_args; |
||||
|
||||
pid = fork(); |
||||
if (pid == -1) { |
||||
return NULL; |
||||
} else if (pid == 0) { |
||||
exec_args = gpr_malloc((argc + 1) * sizeof(char *)); |
||||
memcpy(exec_args, argv, argc * sizeof(char *)); |
||||
exec_args[argc] = NULL; |
||||
execv(exec_args[0], exec_args); |
||||
/* if we reach here, an error has occurred */ |
||||
gpr_log(GPR_ERROR, "execv '%s' failed: %s", exec_args[0], strerror(errno)); |
||||
_exit(1); |
||||
return NULL; |
||||
} else { |
||||
r = gpr_malloc(sizeof(gpr_subprocess)); |
||||
memset(r, 0, sizeof(*r)); |
||||
r->pid = pid; |
||||
return r; |
||||
} |
||||
} |
||||
|
||||
void gpr_subprocess_destroy(gpr_subprocess *p) { |
||||
if (!p->joined) { |
||||
kill(p->pid, SIGKILL); |
||||
gpr_subprocess_join(p); |
||||
} |
||||
gpr_free(p); |
||||
} |
||||
|
||||
int gpr_subprocess_join(gpr_subprocess *p) { |
||||
int status; |
||||
if (waitpid(p->pid, &status, 0) == -1) { |
||||
gpr_log(GPR_ERROR, "waitpid failed: %s", strerror(errno)); |
||||
return -1; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
void gpr_subprocess_interrupt(gpr_subprocess *p) { |
||||
if (!p->joined) { |
||||
kill(p->pid, SIGINT); |
||||
} |
||||
} |
||||
|
||||
#endif /* GPR_POSIX_SUBPROCESS */ |
@ -0,0 +1,45 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2015, Google Inc. |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above |
||||
* copyright notice, this list of conditions and the following disclaimer |
||||
* in the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* * Neither the name of Google Inc. nor the names of its |
||||
* contributors may be used to endorse or promote products derived from |
||||
* this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
*/ |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#ifdef GPR_PTHREAD_TLS |
||||
|
||||
#include <grpc/support/tls.h> |
||||
|
||||
gpr_intptr gpr_tls_set(struct gpr_pthread_thread_local *tls, gpr_intptr value) { |
||||
GPR_ASSERT(0 == pthread_setspecific(tls->key, (void*)value)); |
||||
return value; |
||||
} |
||||
|
||||
#endif /* GPR_PTHREAD_TLS */ |
@ -1 +0,0 @@ |
||||
gRPC C# is work-in-progress and is not intended to be used. See README. |
@ -0,0 +1,26 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<package> |
||||
<metadata> |
||||
<id>Grpc.Auth</id> |
||||
<title>gRPC C# Auth</title> |
||||
<summary>Auth library for C# implementation of gRPC - an RPC library and framework</summary> |
||||
<description>Auth library for C# implementation of gRPC - an RPC library and framework. See project site for more info.</description> |
||||
<version>0.5.0</version> |
||||
<authors>Google Inc.</authors> |
||||
<owners>jtattermusch</owners> |
||||
<licenseUrl>https://github.com/grpc/grpc/blob/master/LICENSE</licenseUrl> |
||||
<projectUrl>https://github.com/grpc/grpc</projectUrl> |
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance> |
||||
<releaseNotes>Release 0.5.0 of gRPC C#</releaseNotes> |
||||
<copyright>Copyright 2015, Google Inc.</copyright> |
||||
<tags>gRPC RPC Protocol HTTP/2 Auth OAuth2</tags> |
||||
<dependencies> |
||||
<dependency id="BouncyCastle" version="1.7.0" /> |
||||
<dependency id="Google.Apis.Auth" version="1.9.1" /> |
||||
<dependency id="Grpc.Core" version="0.5.0" /> |
||||
</dependencies> |
||||
</metadata> |
||||
<files> |
||||
<file src="bin/Release/Grpc.Auth.dll" target="lib/net45" /> |
||||
</files> |
||||
</package> |
@ -1,23 +1,22 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<package > |
||||
<package> |
||||
<metadata> |
||||
<id>Grpc</id> |
||||
<title>gRPC</title> |
||||
<title>gRPC C#</title> |
||||
<summary>C# implementation of gRPC - an RPC library and framework</summary> |
||||
<description>C# implementation of gRPC - an RPC library and framework. See project site for more info. |
||||
This is an experimental release, not ready to use. |
||||
</description> |
||||
<version>0.2.0</version> |
||||
<description>C# implementation of gRPC - an RPC library and framework. See project site for more info.</description> |
||||
<version>0.5.0</version> |
||||
<authors>Google Inc.</authors> |
||||
<owners>jtattermusch</owners> |
||||
<licenseUrl>https://github.com/grpc/grpc/blob/master/LICENSE</licenseUrl> |
||||
<projectUrl>https://github.com/grpc/grpc</projectUrl> |
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance> |
||||
<releaseNotes>The first experimental release. Not ready to use.</releaseNotes> |
||||
<releaseNotes>Release 0.5.0 of gRPC C#</releaseNotes> |
||||
<copyright>Copyright 2015, Google Inc.</copyright> |
||||
<tags>gRPC RPC Protocol HTTP/2</tags> |
||||
<dependencies> |
||||
<dependency id="Grpc.Core" version="0.2.0" /> |
||||
<dependency id="Grpc.Core" version="0.5.0" /> |
||||
</dependencies> |
||||
</metadata> |
||||
<files/> |
||||
</package> |
||||
|
@ -0,0 +1,22 @@ |
||||
@rem Builds gRPC NuGet packages |
||||
|
||||
@rem Adjust the location of nuget.exe |
||||
set NUGET=C:\nuget\nuget.exe |
||||
|
||||
setlocal |
||||
cd ..\..\vsprojects\nuget_package |
||||
@call buildall.bat || goto :error |
||||
endlocal |
||||
|
||||
@call buildall.bat || goto :error |
||||
|
||||
%NUGET% pack ..\..\vsprojects\nuget_package\grpc.native.csharp_ext.nuspec || goto :error |
||||
%NUGET% pack Grpc.Core\Grpc.Core.nuspec || goto :error |
||||
%NUGET% pack Grpc.Auth\Grpc.Auth.nuspec || goto :error |
||||
%NUGET% pack Grpc.nuspec || goto :error |
||||
|
||||
goto :EOF |
||||
|
||||
:error |
||||
echo Failed! |
||||
exit /b %errorlevel% |
@ -0,0 +1,18 @@ |
||||
@rem Convenience script to build gRPC C# from command line |
||||
|
||||
setlocal |
||||
@rem Set VS variables (uses Visual Studio 2013) |
||||
@call "%VS120COMNTOOLS%\..\..\vc\vcvarsall.bat" x86 |
||||
|
||||
@rem Build the C# native extension |
||||
msbuild ..\..\vsprojects\grpc.sln /t:grpc_csharp_ext || goto :error |
||||
|
||||
msbuild Grpc.sln /p:Configuration=Debug || goto :error |
||||
msbuild Grpc.sln /p:Configuration=Release || goto :error |
||||
endlocal |
||||
|
||||
goto :EOF |
||||
|
||||
:error |
||||
echo Failed! |
||||
exit /b %errorlevel% |
@ -0,0 +1,39 @@ |
||||
// Copyright 2015, Google Inc. |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
syntax = "proto3"; |
||||
|
||||
message EchoMessage { |
||||
string value = 1; |
||||
int32 value2 = 2; |
||||
} |
||||
|
||||
service EchoService { |
||||
rpc Echo (EchoMessage) returns (EchoMessage); |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue