1
0
Fork 0

optimization that skips the body of addPayload used in http case

tests - fail
This commit is contained in:
Jan Christoph Uhde 2016-08-27 03:07:48 +02:00
parent c31b93647a
commit bc09a69c72
4 changed files with 49 additions and 40 deletions

View File

@ -32,46 +32,50 @@ using namespace arangodb::basics;
void GeneralResponse::addPayload(VPackSlice const& slice,
arangodb::velocypack::Options const* options,
bool resolve_externals) {
addPayloadPreconditions();
addPayloadPreHook(false, resolve_externals);
if (!options) {
bool resolveExternals) {
if (!options) { // like this because nullptr is easier to pass than
// VPackOptions::Options::Defaults
options = &arangodb::velocypack::Options::Defaults;
}
if (resolve_externals) {
auto tmpBuffer =
basics::VelocyPackHelper::sanitizeExternalsChecked(slice, options);
_vpackPayloads.push_back(std::move(tmpBuffer));
} else {
// just copy
_vpackPayloads.emplace_back(slice.byteSize());
std::memcpy(&_vpackPayloads.back(), slice.start(), slice.byteSize());
addPayloadPreconditions();
bool skipBody = false;
addPayloadPreHook(true, resolveExternals, skipBody);
if (!skipBody) {
if (resolveExternals) {
auto tmpBuffer =
basics::VelocyPackHelper::sanitizeExternalsChecked(slice, options);
_vpackPayloads.push_back(std::move(tmpBuffer));
} else {
// just copy
_vpackPayloads.emplace_back(slice.byteSize());
std::memcpy(&_vpackPayloads.back(), slice.start(), slice.byteSize());
}
addPayloadPostHook(slice, options, resolveExternals);
}
addPayloadPostHook(options);
};
void GeneralResponse::addPayload(VPackBuffer<uint8_t>&& buffer,
arangodb::velocypack::Options const* options,
bool resolve_externals) {
bool resolveExternals) {
addPayloadPreconditions();
// TODO
// skip sanatizing here for http if conent type is json because it will
// be dumped anyway -- check with jsteemann
addPayloadPreHook(true, resolve_externals);
if (!options) {
options = &arangodb::velocypack::Options::Defaults;
}
if (resolve_externals) {
auto tmpBuffer = basics::VelocyPackHelper::sanitizeExternalsChecked(
VPackSlice(buffer.data()), options);
_vpackPayloads.push_back(std::move(tmpBuffer));
} else {
_vpackPayloads.push_back(std::move(buffer));
// TODO
// skip sanatizing here for http if conent type is json because it will
// be dumped anyway -- check with jsteemann
bool skipBody = false;
addPayloadPreHook(true, resolveExternals, skipBody);
if (!skipBody) {
if (resolveExternals) {
auto tmpBuffer = basics::VelocyPackHelper::sanitizeExternalsChecked(
VPackSlice(buffer.data()), options);
_vpackPayloads.push_back(std::move(tmpBuffer));
} else {
_vpackPayloads.push_back(std::move(buffer));
}
}
addPayloadPostHook(options);
addPayloadPostHook(VPackSlice(buffer.data()), options, resolveExternals);
};
std::string GeneralResponse::responseString(ResponseCode code) {

View File

@ -129,15 +129,17 @@ class GeneralResponse {
virtual int reservePayload(std::size_t size) { return size; }
void addPayloadPreconditions() { TRI_ASSERT(_vpackPayloads.size() == 0); };
virtual void addPayloadPreHook(bool inputIsBuffer, bool& resolveExternals){};
virtual void addPayloadPostHook(
arangodb::velocypack::Options const* options){};
void addPayload(VPackSlice const& slice,
arangodb::velocypack::Options const* options = nullptr,
virtual void addPayloadPreHook(bool inputIsBuffer, bool& resolveExternals,
bool& skipBody){};
void addPayload(VPackSlice const&,
arangodb::velocypack::Options const* = nullptr,
bool resolve_externals = true);
void addPayload(VPackBuffer<uint8_t>&& buffer,
arangodb::velocypack::Options const* options = nullptr,
void addPayload(VPackBuffer<uint8_t>&&,
arangodb::velocypack::Options const* = nullptr,
bool resolve_externals = true);
virtual void addPayloadPostHook(VPackSlice const&,
arangodb::velocypack::Options const*,
bool resolveExternals){};
void setOptions(VPackOptions options) { _options = std::move(options); };

View File

@ -300,9 +300,9 @@ void HttpResponse::writeHeader(StringBuffer* output) {
// end of header, body to follow
}
void HttpResponse::addPayloadPostHook(VPackOptions const* options) {
VPackSlice slice(_vpackPayloads.front().data());
void HttpResponse::addPayloadPostHook(VPackSlice const& slice,
VPackOptions const* options,
bool resolveExternals) {
switch (_contentType) {
case rest::ContentType::VPACK: {
size_t length = static_cast<size_t>(slice.byteSize());

View File

@ -74,8 +74,10 @@ class HttpResponse : public GeneralResponse {
public:
void reset(ResponseCode code) override final;
void addPayloadPreHook(bool inputIsBuffer, bool& resolveExternals) override {
void addPayloadPreHook(bool inputIsBuffer, bool& resolveExternals,
bool& skipBody) override {
if (_contentType == ContentType::JSON) {
skipBody = true;
// resolveExternals = false; // they get resolved during dump in post
// hook
// this optimization leads to bad bas crahses
@ -83,9 +85,10 @@ class HttpResponse : public GeneralResponse {
};
int reservePayload(std::size_t size) override { return _body.reserve(size); }
void addPayloadPostHook(VPackOptions const* options) override;
void setPayload(arangodb::velocypack::Slice const&, bool generateBody,
arangodb::velocypack::Options const&) override final;
void addPayloadPostHook(VPackSlice const&, VPackOptions const* options,
bool resolveExternals) override;
arangodb::Endpoint::TransportType transportType() override {
return arangodb::Endpoint::TransportType::HTTP;