aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-08-09 13:27:52 +0200
committerGitHub <[email protected]>2023-08-09 13:27:52 +0200
commit6132ee22dba626e221e615addb780b5f2a5a7bf9 (patch)
tree410857cb939611cd8353eb347ed266734e907a90 /src
parenthandle exception in asio header parsing (#348) (diff)
downloadzen-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.cpp20
-rw-r--r--src/zen/cmds/projectstore.h2
-rw-r--r--src/zenserver/projectstore/jupiterremoteprojectstore.cpp3
-rw-r--r--src/zenserver/projectstore/jupiterremoteprojectstore.h1
-rw-r--r--src/zenserver/projectstore/projectstore.cpp4
-rw-r--r--src/zenserver/upstream/jupiter.cpp9
-rw-r--r--src/zenserver/upstream/jupiter.h2
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;