diff options
| author | Dan Engelbrecht <[email protected]> | 2023-08-09 13:27:52 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-08-09 13:27:52 +0200 |
| commit | 6132ee22dba626e221e615addb780b5f2a5a7bf9 (patch) | |
| tree | 410857cb939611cd8353eb347ed266734e907a90 /src | |
| parent | handle exception in asio header parsing (#348) (diff) | |
| download | zen-6132ee22dba626e221e615addb780b5f2a5a7bf9.tar.xz zen-6132ee22dba626e221e615addb780b5f2a5a7bf9.zip | |
Add `--assume-http2` option to cloud style import/export command to use a HTTP/2 endpoint without without HTTP/1.1 upgrade (#347)
Diffstat (limited to 'src')
| -rw-r--r-- | src/zen/cmds/projectstore.cpp | 20 | ||||
| -rw-r--r-- | src/zen/cmds/projectstore.h | 2 | ||||
| -rw-r--r-- | src/zenserver/projectstore/jupiterremoteprojectstore.cpp | 3 | ||||
| -rw-r--r-- | src/zenserver/projectstore/jupiterremoteprojectstore.h | 1 | ||||
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 4 | ||||
| -rw-r--r-- | src/zenserver/upstream/jupiter.cpp | 9 | ||||
| -rw-r--r-- | src/zenserver/upstream/jupiter.h | 2 |
7 files changed, 37 insertions, 4 deletions
diff --git a/src/zen/cmds/projectstore.cpp b/src/zen/cmds/projectstore.cpp index 39976e333..f7dc82569 100644 --- a/src/zen/cmds/projectstore.cpp +++ b/src/zen/cmds/projectstore.cpp @@ -360,6 +360,12 @@ ExportOplogCommand::ExportOplogCommand() "<envvariable>"); m_Options.add_option("cloud", "", + "assume-http2", + "Assume that the cloud endpoint is a HTTP/2 endpoint skipping HTTP/1.1 upgrade handshake", + cxxopts::value(m_CloudAssumeHttp2), + "<assumehttp2>"); + m_Options.add_option("cloud", + "", "disabletempblocks", "Disable temp block creation and upload blocks without waiting for oplog container to be uploaded", cxxopts::value(m_CloudDisableTempBlocks), @@ -581,6 +587,10 @@ ExportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg Writer.AddString("access-token-env"sv, m_CloudAccessTokenEnv); } } + if (m_CloudAssumeHttp2) + { + Writer.AddBool("assumehttp2"sv, true); + } if (m_DisableBlocks) { Writer.AddBool("disableblocks"sv, true); @@ -648,6 +658,12 @@ ImportOplogCommand::ImportOplogCommand() "Name of environment variable that holds the cloud Storage access token", cxxopts::value(m_CloudAccessTokenEnv)->default_value(DefaultCloudAccessTokenEnvVariableName), "<envvariable>"); + m_Options.add_option("cloud", + "", + "assume-http2", + "Assume that the cloud endpoint is a HTTP/2 endpoint skipping HTTP/1.1 upgrade handshake", + cxxopts::value(m_CloudAssumeHttp2), + "<assumehttp2>"); m_Options.add_option("", "", "zen", "Zen service upload address", cxxopts::value(m_ZenUrl), "<url>"); m_Options.add_option("zen", "", "source-project", "Zen source project name", cxxopts::value(m_ZenProjectName), "<sourceprojectid>"); @@ -834,6 +850,10 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg Writer.AddString("access-token-env"sv, m_CloudAccessTokenEnv); } } + if (m_CloudAssumeHttp2) + { + Writer.AddBool("assumehttp2"sv, true); + } } Writer.EndObject(); // "cloud" SourceDescription = fmt::format("[cloud] {}/{}/{}/{}", m_CloudUrl, m_CloudNamespace, m_CloudBucket, m_CloudKey); diff --git a/src/zen/cmds/projectstore.h b/src/zen/cmds/projectstore.h index 2327285b8..01675e885 100644 --- a/src/zen/cmds/projectstore.h +++ b/src/zen/cmds/projectstore.h @@ -98,6 +98,7 @@ private: std::string m_CloudOpenIdProvider; std::string m_CloudAccessToken; std::string m_CloudAccessTokenEnv; + bool m_CloudAssumeHttp2 = false; bool m_CloudDisableTempBlocks = false; std::string m_ZenUrl; @@ -136,6 +137,7 @@ private: std::string m_CloudOpenIdProvider; std::string m_CloudAccessToken; std::string m_CloudAccessTokenEnv; + bool m_CloudAssumeHttp2 = false; std::string m_ZenUrl; std::string m_ZenProjectName; diff --git a/src/zenserver/projectstore/jupiterremoteprojectstore.cpp b/src/zenserver/projectstore/jupiterremoteprojectstore.cpp index 08c8aa0e6..b1a68c6d2 100644 --- a/src/zenserver/projectstore/jupiterremoteprojectstore.cpp +++ b/src/zenserver/projectstore/jupiterremoteprojectstore.cpp @@ -252,7 +252,8 @@ CreateJupiterRemoteStore(const JupiterRemoteStoreOptions& Options) CloudCacheClientOptions ClientOptions{.Name = "Remote store"sv, .ServiceUrl = Url, .ConnectTimeout = std::chrono::milliseconds(2000), - .Timeout = std::chrono::milliseconds(60000)}; + .Timeout = std::chrono::milliseconds(60000), + .AssumeHttp2 = Options.AssumeHttp2}; // 1) Access token as parameter in request // 2) Environment variable (different win vs linux/mac) // 3) openid-provider (assumes oidctoken.exe -Zen true has been run with matching Options.OpenIdProvider diff --git a/src/zenserver/projectstore/jupiterremoteprojectstore.h b/src/zenserver/projectstore/jupiterremoteprojectstore.h index 697379acb..f2375a730 100644 --- a/src/zenserver/projectstore/jupiterremoteprojectstore.h +++ b/src/zenserver/projectstore/jupiterremoteprojectstore.h @@ -19,6 +19,7 @@ struct JupiterRemoteStoreOptions : RemoteStoreOptions AuthMgr& AuthManager; bool ForceDisableBlocks = false; bool ForceDisableTempBlocks = false; + bool AssumeHttp2 = false; }; std::unique_ptr<RemoteProjectStore> CreateJupiterRemoteStore(const JupiterRemoteStoreOptions& Options); diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index ae6f0d1d8..e5088e11d 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -148,6 +148,7 @@ namespace { } bool ForceDisableBlocks = Cloud["disableblocks"sv].AsBool(false); bool ForceDisableTempBlocks = Cloud["disabletempblocks"sv].AsBool(false); + bool AssumeHttp2 = Cloud["assumehttp2"sv].AsBool(false); JupiterRemoteStoreOptions Options = {RemoteStoreOptions{.MaxBlockSize = MaxBlockSize, .MaxChunkEmbedSize = MaxChunkEmbedSize}, Url, @@ -158,7 +159,8 @@ namespace { AccessToken, AuthManager, ForceDisableBlocks, - ForceDisableTempBlocks}; + ForceDisableTempBlocks, + AssumeHttp2}; RemoteStore = CreateJupiterRemoteStore(Options); } diff --git a/src/zenserver/upstream/jupiter.cpp b/src/zenserver/upstream/jupiter.cpp index e7bb2cbcf..0f810ea2b 100644 --- a/src/zenserver/upstream/jupiter.cpp +++ b/src/zenserver/upstream/jupiter.cpp @@ -46,12 +46,16 @@ namespace detail { cpr::Session& GetSession() { return m_Session; } - void Reset(std::chrono::milliseconds ConnectTimeout, std::chrono::milliseconds Timeout) + void Reset(std::chrono::milliseconds ConnectTimeout, std::chrono::milliseconds Timeout, bool AssumeHttp2) { m_Session.SetBody({}); m_Session.SetHeader({}); m_Session.SetConnectTimeout(ConnectTimeout); m_Session.SetTimeout(Timeout); + if (AssumeHttp2) + { + m_Session.SetHttpVersion(cpr::HttpVersion{cpr::HttpVersionCode::VERSION_2_0_PRIOR_KNOWLEDGE}); + } } private: @@ -912,6 +916,7 @@ CloudCacheClient::CloudCacheClient(const CloudCacheClientOptions& Options, std:: , m_ConnectTimeout(Options.ConnectTimeout) , m_Timeout(Options.Timeout) , m_TokenProvider(std::move(TokenProvider)) +, m_AssumeHttp2(Options.AssumeHttp2) { ZEN_ASSERT(m_TokenProvider.get() != nullptr); } @@ -958,7 +963,7 @@ CloudCacheClient::AllocSessionState() State = new detail::CloudCacheSessionState(*this); } - State->Reset(m_ConnectTimeout, m_Timeout); + State->Reset(m_ConnectTimeout, m_Timeout, m_AssumeHttp2); if (IsTokenValid == false) { diff --git a/src/zenserver/upstream/jupiter.h b/src/zenserver/upstream/jupiter.h index dd50f75e1..3d965e846 100644 --- a/src/zenserver/upstream/jupiter.h +++ b/src/zenserver/upstream/jupiter.h @@ -175,6 +175,7 @@ struct CloudCacheClientOptions std::string_view ComputeCluster; std::chrono::milliseconds ConnectTimeout{5000}; std::chrono::milliseconds Timeout{}; + bool AssumeHttp2 = false; }; /** @@ -203,6 +204,7 @@ private: std::chrono::milliseconds m_ConnectTimeout{}; std::chrono::milliseconds m_Timeout{}; std::unique_ptr<CloudCacheTokenProvider> m_TokenProvider; + bool m_AssumeHttp2; RwLock m_SessionStateLock; std::list<detail::CloudCacheSessionState*> m_SessionStateCache; |