aboutsummaryrefslogtreecommitdiffstats
path: root/fbench
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2018-10-12 10:16:47 +0000
committerHåvard Pettersen <havardpe@oath.com>2018-10-12 10:16:47 +0000
commitc3365fadfb772fe69f2edc16a7ad3cfe8e5840b3 (patch)
tree57d8af5b15d54eb8b6c734e1077f22483a952c79 /fbench
parent327998b24d5756cd35dd093aa3747942ba3379de (diff)
use crypto engine and sync crypto socket in http client
Diffstat (limited to 'fbench')
-rw-r--r--fbench/src/fbench/client.cpp4
-rw-r--r--fbench/src/fbench/client.h3
-rw-r--r--fbench/src/fbench/fbench.cpp2
-rw-r--r--fbench/src/geturl/geturl.cpp5
-rw-r--r--fbench/src/httpclient/httpclient.cpp52
-rw-r--r--fbench/src/httpclient/httpclient.h24
-rw-r--r--fbench/src/test/httpclient.cpp7
-rw-r--r--fbench/src/test/httpclient_splitstring.cpp6
8 files changed, 70 insertions, 33 deletions
diff --git a/fbench/src/fbench/client.cpp b/fbench/src/fbench/client.cpp
index 0200ea2d067..754fc809511 100644
--- a/fbench/src/fbench/client.cpp
+++ b/fbench/src/fbench/client.cpp
@@ -8,13 +8,13 @@
#include <cassert>
#include <cstring>
-Client::Client(ClientArguments *args)
+Client::Client(vespalib::CryptoEngine::SP engine, ClientArguments *args)
: _args(args),
_status(new ClientStatus()),
_reqTimer(new Timer()),
_cycleTimer(new Timer()),
_masterTimer(new Timer()),
- _http(new HTTPClient(_args->_hostname, _args->_port,
+ _http(new HTTPClient(std::move(engine), _args->_hostname, _args->_port,
_args->_keepAlive, _args->_headerBenchmarkdataCoverage,
_args->_extraHeaders, _args->_authority)),
_reader(new FileReader()),
diff --git a/fbench/src/fbench/client.h b/fbench/src/fbench/client.h
index 1e0b750dbb2..ce7c13fc982 100644
--- a/fbench/src/fbench/client.h
+++ b/fbench/src/fbench/client.h
@@ -4,6 +4,7 @@
#include <fstream>
#include <atomic>
#include <thread>
+#include <vespa/vespalib/net/crypto_engine.h>
#define FBENCH_DELIMITER "\n[--xxyyzz--FBENCH_MAGIC_DELIMITER--zzyyxx--]\n"
@@ -188,7 +189,7 @@ public:
* The client arguments given to this method becomes the
* responsibility of the client.
**/
- Client(ClientArguments *args);
+ Client(vespalib::CryptoEngine::SP engine, ClientArguments *args);
/**
* Delete objects owned by this client, including the client arguments.
diff --git a/fbench/src/fbench/fbench.cpp b/fbench/src/fbench/fbench.cpp
index ff6db42b83d..36c60e08ef7 100644
--- a/fbench/src/fbench/fbench.cpp
+++ b/fbench/src/fbench/fbench.cpp
@@ -140,7 +140,7 @@ FBench::CreateClients()
off_beg = _queryfileOffset[i];
off_end = _queryfileOffset[i+1];
}
- client = std::make_unique<Client>(
+ client = std::make_unique<Client>(_crypto_engine,
new ClientArguments(i, _clients.size(), _filenamePattern,
_outputPattern, _hostnames[i % _hostnames.size()].c_str(),
_ports[i % _ports.size()], _cycle,
diff --git a/fbench/src/geturl/geturl.cpp b/fbench/src/geturl/geturl.cpp
index f279b0b55c8..868d33f30a9 100644
--- a/fbench/src/geturl/geturl.cpp
+++ b/fbench/src/geturl/geturl.cpp
@@ -1,4 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/net/crypto_engine.h>
#include <httpclient/httpclient.h>
#include <iostream>
@@ -10,7 +12,8 @@ main(int argc, char** argv)
return -1;
}
- HTTPClient client(argv[1], atoi(argv[2]), false, false);
+ auto engine = std::make_shared<vespalib::NullCryptoEngine>();
+ HTTPClient client(engine, argv[1], atoi(argv[2]), false, false);
if (!client.Fetch(argv[3], &std::cout).Ok()) {
fprintf(stderr, "geturl: could not fetch 'http://%s:%d%s'\n",
argv[1], atoi(argv[2]), argv[3]);
diff --git a/fbench/src/httpclient/httpclient.cpp b/fbench/src/httpclient/httpclient.cpp
index c49ef5da12c..002d2770dcd 100644
--- a/fbench/src/httpclient/httpclient.cpp
+++ b/fbench/src/httpclient/httpclient.cpp
@@ -17,10 +17,12 @@ HTTPClient::ChunkedReader
HTTPClient::ChunkedReader::_instance;
-HTTPClient::HTTPClient(const char *hostname, int port,
+HTTPClient::HTTPClient(vespalib::CryptoEngine::SP engine, const char *hostname, int port,
bool keepAlive, bool headerBenchmarkdataCoverage,
const std::string & extraHeaders, const std::string &authority)
- : _socket(new FastOS_Socket()),
+ : _engine(std::move(engine)),
+ _address(vespalib::SocketAddress::select_remote(port, hostname)),
+ _socket(),
_hostname(hostname),
_port(port),
_keepAlive(keepAlive),
@@ -48,7 +50,6 @@ HTTPClient::HTTPClient(const char *hostname, int port,
_dataDone(false),
_reader(NULL)
{
- _socket->SetAddressByHostName(port, hostname);
if (_authority == "") {
char tmp[1024];
snprintf(tmp, 1024, "%s:%d", hostname, port);
@@ -56,17 +57,31 @@ HTTPClient::HTTPClient(const char *hostname, int port,
}
}
+bool
+HTTPClient::connect_socket()
+{
+ _socket.reset();
+ auto handle = _address.connect([](auto &h)
+ {
+ return (h.set_nodelay(true) &&
+ h.set_linger(false, 0));
+ });
+ if (!handle.valid()) {
+ return false;
+ }
+ _socket = vespalib::SyncCryptoSocket::create(*_engine, std::move(handle), false);
+ return bool(_socket);
+}
+
ssize_t
HTTPClient::FillBuffer() {
- _bufused = _socket->Read(_buf, _bufsize); // may be -1
+ _bufused = _socket->read(_buf, _bufsize); // may be -1
_bufpos = 0;
return _bufused;
}
HTTPClient::~HTTPClient()
{
- if (_socket)
- _socket->Close();
delete [] _buf;
}
@@ -148,9 +163,9 @@ HTTPClient::Connect(const char *url, bool usePost, const char *content, int cLen
// try to reuse connection if keep-alive is enabled
if (_keepAlive
- && _socket->IsOpened()
- && _socket->Write(req, strlen(req)) == (ssize_t)strlen(req)
- && (!usePost || _socket->Write(content, cLen) == (ssize_t)cLen)
+ && _socket
+ && _socket->write(req, strlen(req)) == (ssize_t)strlen(req)
+ && (!usePost || _socket->write(content, cLen) == (ssize_t)cLen)
&& FillBuffer() > 0) {
// DEBUG
@@ -161,17 +176,14 @@ HTTPClient::Connect(const char *url, bool usePost, const char *content, int cLen
}
return true;
} else {
- _socket->Close();
+ _socket.reset();
ResetBuffer();
}
// try to open new connection to server
- if (_socket->SetSoBlocking(true)
- && _socket->Connect()
- && _socket->SetNoDelay(true)
- && _socket->SetSoLinger(false, 0)
- && _socket->Write(req, strlen(req)) == (ssize_t)strlen(req)
- && (!usePost || _socket->Write(content, cLen) == (ssize_t)cLen))
+ if (connect_socket()
+ && _socket->write(req, strlen(req)) == (ssize_t)strlen(req)
+ && (!usePost || _socket->write(content, cLen) == (ssize_t)cLen))
{
// DEBUG
@@ -181,7 +193,7 @@ HTTPClient::Connect(const char *url, bool usePost, const char *content, int cLen
}
return true;
} else {
- _socket->Close();
+ _socket.reset();
}
// DEBUG
@@ -395,7 +407,7 @@ HTTPClient::ConnCloseReader::Read(HTTPClient &client,
res = fromBuffer;
}
if ((len - fromBuffer) > (len >> 1)) {
- readRes = client._socket->Read(static_cast<char *>(buf)
+ readRes = client._socket->read(static_cast<char *>(buf)
+ fromBuffer, len - fromBuffer);
if (readRes < 0) {
client.Close();
@@ -434,7 +446,7 @@ HTTPClient::ContentLengthReader::Read(HTTPClient &client,
readLen = (len - fromBuffer
< client._contentLength - client._dataRead) ?
len - fromBuffer : client._contentLength - client._dataRead;
- readRes = client._socket->Read(static_cast<char *>(buf)
+ readRes = client._socket->read(static_cast<char *>(buf)
+ fromBuffer, readLen);
if (readRes < 0) {
client.Close();
@@ -510,7 +522,7 @@ HTTPClient::Close()
|| _connectionCloseGiven
|| !_dataDone
|| (_httpVersion == 0 && !_keepAliveGiven)) ?
- _socket->Close() : true;
+ (_socket.reset(), true) : true;
}
HTTPClient::FetchStatus
diff --git a/fbench/src/httpclient/httpclient.h b/fbench/src/httpclient/httpclient.h
index 783545744d5..9c3ccd437d1 100644
--- a/fbench/src/httpclient/httpclient.h
+++ b/fbench/src/httpclient/httpclient.h
@@ -3,7 +3,9 @@
#include <ostream>
#include <memory>
-#include <vespa/fastos/socket.h>
+#include <vespa/vespalib/net/sync_crypto_socket.h>
+#include <vespa/vespalib/net/crypto_engine.h>
+#include <vespa/vespalib/net/socket_address.h>
/**
* This class implements a HTTP client that may be used to fetch
@@ -88,7 +90,10 @@ protected:
};
friend class HTTPClient::ChunkedReader;
- std::unique_ptr<FastOS_Socket> _socket;
+ vespalib::CryptoEngine::SP _engine;
+ vespalib::SocketAddress _address;
+ vespalib::SyncCryptoSocket::UP _socket;
+
std::string _hostname;
int _port;
bool _keepAlive;
@@ -131,6 +136,17 @@ protected:
_bufused = 0;
}
+ /**
+ * (re)connects the socket to the host/port specified in the
+ * constructor. The hostname is not resolved again; the resolve
+ * result is cached by the constructor. Also sets tcp nodelay flag
+ * and disables lingering. Note to servers: This is a no-nonsense
+ * socket that will be closed in your face in very ungraceful
+ * ways. Do not expect half-close niceties or tls session
+ * termination packets.
+ **/
+ bool connect_socket();
+
/**
* Fill the internal buffer with data from the url we are connected
* to.
@@ -215,8 +231,8 @@ public:
* @param port the TCP port to use when contacting the host.
* @param keepAlive flag indicating if keep-alive should be enabled.
**/
- HTTPClient(const char *hostname, int port, bool keepAlive,
- bool headerBenchmarkdataCoverage, const std::string & extraHeaders="", const std::string &authority = "");
+ HTTPClient(vespalib::CryptoEngine::SP engine, const char *hostname, int port, bool keepAlive,
+ bool headerBenchmarkdataCoverage, const std::string & extraHeaders="", const std::string &authority = "");
/**
* Disconnect from server and free memory.
diff --git a/fbench/src/test/httpclient.cpp b/fbench/src/test/httpclient.cpp
index 4201da68b97..0d350c393c1 100644
--- a/fbench/src/test/httpclient.cpp
+++ b/fbench/src/test/httpclient.cpp
@@ -1,4 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/net/crypto_engine.h>
#include <httpclient/httpclient.h>
#include <iostream>
#include <thread>
@@ -11,13 +13,14 @@ main(int argc, char **argv)
return 1;
}
+ auto engine = std::make_shared<vespalib::NullCryptoEngine>();
HTTPClient *client;
ssize_t len;
if(argc == 4) {
- client = new HTTPClient(argv[1], atoi(argv[2]), false, true);
+ client = new HTTPClient(engine, argv[1], atoi(argv[2]), false, true);
} else {
- client = new HTTPClient(argv[1], atoi(argv[2]), true, true);
+ client = new HTTPClient(engine, argv[1], atoi(argv[2]), true, true);
}
std::ostream * output = & std::cout;
diff --git a/fbench/src/test/httpclient_splitstring.cpp b/fbench/src/test/httpclient_splitstring.cpp
index d766b0f8f4b..4f3e0027db0 100644
--- a/fbench/src/test/httpclient_splitstring.cpp
+++ b/fbench/src/test/httpclient_splitstring.cpp
@@ -1,13 +1,15 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/net/crypto_engine.h>
#include <httpclient/httpclient.h>
#include <cstring>
class DebugHTTPClient : public HTTPClient
{
public:
- DebugHTTPClient(const char* server, int port, bool keepAlive)
- : HTTPClient(server, port, keepAlive, true) {}
+ DebugHTTPClient()
+ : HTTPClient(std::make_shared<vespalib::NullCryptoEngine>(),
+ "localhost", 80, true, true) {}
static void SplitLineTest(const char *input);
static void DebugSplitLine();