mirror of https://gitee.com/bigwinds/arangodb
updated batch handler
This commit is contained in:
parent
bb14df164d
commit
7ad38b946c
58
Makefile.in
58
Makefile.in
|
@ -139,6 +139,12 @@
|
|||
### @brief ZeroMQ
|
||||
################################################################################
|
||||
|
||||
# -*- mode: Makefile; -*-
|
||||
|
||||
################################################################################
|
||||
### @brief ICU
|
||||
################################################################################
|
||||
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
@ -194,6 +200,7 @@ noinst_PROGRAMS = $(am__EXEEXT_2)
|
|||
@ENABLE_MRUBY_TRUE@ $(shell find @srcdir@/mr/actions/system -name "*.rb" -print)
|
||||
|
||||
DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \
|
||||
$(srcdir)/3rdParty/Makefile.all-in-one-icu \
|
||||
$(srcdir)/3rdParty/Makefile.all-in-one-libev \
|
||||
$(srcdir)/3rdParty/Makefile.all-in-one-mruby \
|
||||
$(srcdir)/3rdParty/Makefile.all-in-one-protobuf \
|
||||
|
@ -303,6 +310,12 @@ DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \
|
|||
### @brief additional files to remove
|
||||
################################################################################
|
||||
@ENABLE_ZEROMQ_TRUE@am__append_32 = .zeromq-build-@TRI_BITS@ .czmq-build-@TRI_BITS@
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@am__append_33 = @ICU_LIBS@
|
||||
|
||||
################################################################################
|
||||
### @brief additional files to remove
|
||||
################################################################################
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@am__append_34 = .icu-build-@TRI_BITS@
|
||||
subdir = .
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
|
||||
|
@ -330,7 +343,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
|
|||
$(top_srcdir)/m4/external.protobuf \
|
||||
$(top_srcdir)/m4/all-in-one.v8 $(top_srcdir)/m4/external.v8 \
|
||||
$(top_srcdir)/m4/all-in-one.zeromq \
|
||||
$(top_srcdir)/m4/external.icu \
|
||||
$(top_srcdir)/m4/all-in-one.icu $(top_srcdir)/m4/external.icu \
|
||||
$(top_srcdir)/m4/configure.information \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
|
@ -1036,7 +1049,8 @@ BUILT_SOURCES = build.h $(JAVASCRIPT_HEADER) $(JAVASCRIPT_BROWSER) \
|
|||
@builddir@/.setup-js-directories $(am__append_16) \
|
||||
$(am__append_18) $(am__append_19) $(am__append_21) \
|
||||
$(PROTOBUF_FILES) $(am__append_23) $(am__append_25) \
|
||||
$(am__append_27) $(am__append_29) $(am__append_31)
|
||||
$(am__append_27) $(am__append_29) $(am__append_31) \
|
||||
$(am__append_33)
|
||||
|
||||
################################################################################
|
||||
### @brief man pages to install
|
||||
|
@ -1074,7 +1088,7 @@ CLEANUP = .setup-js-directories .setup-mr-directories \
|
|||
.setup-js-directories $(am__append_17) $(am__append_20) \
|
||||
$(am__append_22) $(PROTOBUF_FILES) $(am__append_24) \
|
||||
$(am__append_26) $(am__append_28) $(am__append_30) \
|
||||
$(am__append_32)
|
||||
$(am__append_32) $(am__append_34)
|
||||
|
||||
################################################################################
|
||||
### @brief flex files
|
||||
|
@ -1155,7 +1169,7 @@ AM_CPPFLAGS = -I@top_srcdir@/lib -I@top_builddir@/lib @BOOST_CPPFLAGS@ \
|
|||
################################################################################
|
||||
AM_LDFLAGS = @BOOST_LDFLAGS@ @LIBEV_LDFLAGS@ @MATH_LDFLAGS@ \
|
||||
@OPENSSL_LDFLAGS@ @READLINE_LDFLAGS@ @PROTOBUF_LDFLAGS@ \
|
||||
@V8_LDFLAGS@ $(am__append_4)
|
||||
@ICU_LDFLAGS@ @V8_LDFLAGS@ $(am__append_4)
|
||||
|
||||
################################################################################
|
||||
### @brief auxiliary libraries
|
||||
|
@ -1707,6 +1721,7 @@ UNITTESTS_SERVER_BITARRAY = $(addprefix --javascript.unit-tests ,$(BITARRAY_COMM
|
|||
GTAGS_FILES = $(sort $(abspath $(SOURCES) $(HEADERS)))
|
||||
@ENABLE_ALL_IN_ONE_PROTOBUF_TRUE@PROTOBUFDIR = @abs_top_srcdir@/3rdParty/protobuf-2.4.1/BUILD
|
||||
@ENABLE_ZEROMQ_TRUE@ZMQDIR = @abs_top_srcdir@/3rdParty/zeromq-2.2.0/BUILD
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ICUDIR = @abs_top_srcdir@/3rdParty/icu/BUILD
|
||||
all: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
|
@ -1714,7 +1729,7 @@ all: $(BUILT_SOURCES)
|
|||
.SUFFIXES: .c .cpp .o .obj
|
||||
am--refresh:
|
||||
@:
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/Makefile.files $(srcdir)/lib/Makefile.files $(srcdir)/arangod/Makefile.files $(srcdir)/arangosh/Makefile.files $(srcdir)/etc/Makefile.files $(srcdir)/utils/Makefile.files $(srcdir)/arangoirb/Makefile.files $(srcdir)/UnitTests/Makefile.files $(srcdir)/Documentation/Makefile.doxygen $(srcdir)/js/Makefile.javascript $(srcdir)/mr/Makefile.mruby $(srcdir)/lib/Makefile.flex $(srcdir)/lib/Makefile.bison $(srcdir)/lib/Makefile.protobuf $(srcdir)/3rdParty/Makefile.all-in-one-libev $(srcdir)/3rdParty/Makefile.all-in-one-protobuf $(srcdir)/3rdParty/Makefile.all-in-one-v8 $(srcdir)/3rdParty/Makefile.all-in-one-mruby $(srcdir)/3rdParty/Makefile.all-in-one-zeromq $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/Makefile.files $(srcdir)/lib/Makefile.files $(srcdir)/arangod/Makefile.files $(srcdir)/arangosh/Makefile.files $(srcdir)/etc/Makefile.files $(srcdir)/utils/Makefile.files $(srcdir)/arangoirb/Makefile.files $(srcdir)/UnitTests/Makefile.files $(srcdir)/Documentation/Makefile.doxygen $(srcdir)/js/Makefile.javascript $(srcdir)/mr/Makefile.mruby $(srcdir)/lib/Makefile.flex $(srcdir)/lib/Makefile.bison $(srcdir)/lib/Makefile.protobuf $(srcdir)/3rdParty/Makefile.all-in-one-libev $(srcdir)/3rdParty/Makefile.all-in-one-protobuf $(srcdir)/3rdParty/Makefile.all-in-one-v8 $(srcdir)/3rdParty/Makefile.all-in-one-mruby $(srcdir)/3rdParty/Makefile.all-in-one-zeromq $(srcdir)/3rdParty/Makefile.all-in-one-icu $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
|
@ -5908,6 +5923,35 @@ js/server/js-%.h: @srcdir@/js/server/%.js .setup-js-directories
|
|||
@ENABLE_ZEROMQ_TRUE@ @echo "--------------------------------------------------------------------------------"
|
||||
@ENABLE_ZEROMQ_TRUE@ @echo
|
||||
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@@ICU_LIBS@: @srcdir@/.icu-build-@TRI_BITS@
|
||||
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@@srcdir@/.icu-build-@TRI_BITS@:
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo "--------------------------------------------------------------------------------"
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo "BUILDING ICU"
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo "--------------------------------------------------------------------------------"
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo
|
||||
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ cd @top_srcdir@/3rdParty/icu/source \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ && ./configure \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --enable-static \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --disable-shared \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --disable-tests \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --disable-samples \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --disable-extras \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --prefix=$(ICUDIR) \
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ --libdir=$(ICUDIR)/libs
|
||||
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ cd @top_srcdir@/3rdParty/icu/source && $(MAKE) install
|
||||
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ touch @srcdir@/.icu-build-@TRI_BITS@
|
||||
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo "--------------------------------------------------------------------------------"
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo "BUILD ICU FINISHED"
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo "--------------------------------------------------------------------------------"
|
||||
@ENABLE_ALL_IN_ONE_ICU_TRUE@ @echo
|
||||
|
||||
################################################################################
|
||||
### @brief generate all flex files
|
||||
################################################################################
|
||||
|
@ -5940,6 +5984,10 @@ js/server/js-%.h: @srcdir@/js/server/%.js .setup-js-directories
|
|||
### @brief zeromq
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
### @brief ICU
|
||||
################################################################################
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
|
|
|
@ -52,7 +52,6 @@ using namespace triagens::arango;
|
|||
|
||||
RestBatchHandler::RestBatchHandler (HttpRequest* request, TRI_vocbase_t* vocbase)
|
||||
: RestVocbaseBaseHandler(request, vocbase),
|
||||
_missingResponses(0),
|
||||
_outputMessages(new PB_ArangoMessage) {
|
||||
}
|
||||
|
||||
|
@ -65,8 +64,6 @@ RestBatchHandler::~RestBatchHandler () {
|
|||
// delete protobuf message
|
||||
delete _outputMessages;
|
||||
}
|
||||
|
||||
destroyHandlers();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -87,7 +84,7 @@ RestBatchHandler::~RestBatchHandler () {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool RestBatchHandler::isDirect () {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -104,31 +101,6 @@ string const& RestBatchHandler::queue () {
|
|||
/// {@inheritDoc}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Job* RestBatchHandler::createJob (AsyncJobServer* server) {
|
||||
HttpServer* httpServer = dynamic_cast<HttpServer*>(server);
|
||||
|
||||
if (httpServer == 0) {
|
||||
LOGGER_WARNING << "cannot convert AsyncJobServer into a HttpServer";
|
||||
return 0;
|
||||
}
|
||||
|
||||
BatchJob<HttpServer>* batchJob = new BatchJob<HttpServer>(httpServer, this);
|
||||
|
||||
return batchJob;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// {@inheritDoc}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
vector<HttpHandler*> RestBatchHandler::subhandlers () {
|
||||
return _handlers;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// {@inheritDoc}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Handler::status_e RestBatchHandler::execute() {
|
||||
// extract the request type
|
||||
HttpRequest::HttpRequestType type = _request->requestType();
|
||||
|
@ -145,7 +117,7 @@ Handler::status_e RestBatchHandler::execute() {
|
|||
if (! _inputMessages.ParseFromArray(_request->body(), _request->bodySize())) {
|
||||
generateError(HttpResponse::BAD,
|
||||
TRI_ERROR_HTTP_BAD_PARAMETER,
|
||||
"invalid protobuf input message");
|
||||
"invalid request message data sent");
|
||||
|
||||
return Handler::HANDLER_FAILED;
|
||||
}
|
||||
|
@ -171,55 +143,48 @@ Handler::status_e RestBatchHandler::execute() {
|
|||
|
||||
return Handler::HANDLER_FAILED;
|
||||
}
|
||||
|
||||
++_missingResponses;
|
||||
_handlers.push_back(handler);
|
||||
}
|
||||
|
||||
// success
|
||||
return Handler::HANDLER_DONE;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief add a single handler response to the output array
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RestBatchHandler::addResponse (HttpHandler* handler) {
|
||||
for (size_t i = 0; i < _handlers.size(); ++i) {
|
||||
if (_handlers[i] == handler) {
|
||||
|
||||
// avoid concurrent modifications to the structure
|
||||
MUTEX_LOCKER(_handlerLock);
|
||||
PB_ArangoBatchMessage* batch = _outputMessages->mutable_messages(i);
|
||||
|
||||
handler->getResponse()->write(batch);
|
||||
if (--_missingResponses == 0) {
|
||||
assembleResponse();
|
||||
Handler::status_e status = Handler::HANDLER_FAILED;
|
||||
do {
|
||||
try {
|
||||
status = handler->execute();
|
||||
}
|
||||
return;
|
||||
catch (triagens::basics::TriagensError const& ex) {
|
||||
handler->handleError(ex);
|
||||
}
|
||||
catch (std::exception const& ex) {
|
||||
triagens::basics::InternalError err(ex, __FILE__, __LINE__);
|
||||
|
||||
handler->handleError(err);
|
||||
}
|
||||
catch (...) {
|
||||
triagens::basics::InternalError err("executeDirectHandler", __FILE__, __LINE__);
|
||||
handler->handleError(err);
|
||||
}
|
||||
}
|
||||
while (status == Handler::HANDLER_REQUEUE);
|
||||
|
||||
if (status == Handler::HANDLER_DONE) {
|
||||
PB_ArangoBatchMessage* batch = _outputMessages->mutable_messages(i);
|
||||
handler->getResponse()->write(batch);
|
||||
}
|
||||
|
||||
delete handler;
|
||||
|
||||
if (status == Handler::HANDLER_FAILED) {
|
||||
return Handler::HANDLER_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
// handler not found
|
||||
LOGGER_WARNING << "handler not found. this should not happen.";
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create an overall protobuf response from the array of responses
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RestBatchHandler::assembleResponse () {
|
||||
assert(_missingResponses == 0);
|
||||
|
||||
size_t messageSize = _outputMessages->ByteSize();
|
||||
|
||||
|
||||
// allocate output buffer
|
||||
char* output = (char*) TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(char) * messageSize, false);
|
||||
if (output == NULL) {
|
||||
generateError(HttpResponse::SERVER_ERROR,
|
||||
TRI_ERROR_OUT_OF_MEMORY,
|
||||
"out of memory");
|
||||
return;
|
||||
return Handler::HANDLER_FAILED;
|
||||
}
|
||||
|
||||
_response = new HttpResponse(HttpResponse::OK);
|
||||
|
@ -230,26 +195,15 @@ void RestBatchHandler::assembleResponse () {
|
|||
TRI_Free(TRI_UNKNOWN_MEM_ZONE, output);
|
||||
delete _response;
|
||||
|
||||
generateError(HttpResponse::SERVER_ERROR,
|
||||
TRI_ERROR_OUT_OF_MEMORY,
|
||||
"out of memory");
|
||||
return;
|
||||
generateError(HttpResponse::SERVER_ERROR, TRI_ERROR_OUT_OF_MEMORY, "out of memory");
|
||||
return Handler::HANDLER_FAILED;
|
||||
}
|
||||
/*
|
||||
for (char* x = output; x < output + messageSize; ++x) {
|
||||
if (*x >= ' ' && *x <= 'z') {
|
||||
printf("%c", *x);
|
||||
}
|
||||
else if (*x == '\n' || *x == '\0') {
|
||||
printf("\n");
|
||||
}
|
||||
else {
|
||||
printf(".");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
_response->body().appendText(output, messageSize);
|
||||
TRI_Free(TRI_UNKNOWN_MEM_ZONE, output);
|
||||
|
||||
// success
|
||||
return Handler::HANDLER_DONE;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -262,20 +216,6 @@ string const& RestBatchHandler::getContentType () {
|
|||
return contentType;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief destroy handlers in case setup went wrong
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RestBatchHandler::destroyHandlers () {
|
||||
for (size_t i = 0; i < _handlers.size(); ++i) {
|
||||
HttpHandler* handler = _handlers[i];
|
||||
|
||||
delete handler;
|
||||
}
|
||||
|
||||
_handlers.clear();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -109,30 +109,12 @@ namespace triagens {
|
|||
|
||||
string const& queue ();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief return a list of subhandlers for this batch job
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
vector<HttpHandler*> subhandlers ();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create a batch job object
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Job* createJob (AsyncJobServer*);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// {@inheritDoc}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Handler::status_e execute();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief add a single handler response to the output array
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void addResponse (HttpHandler*);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -148,12 +130,6 @@ namespace triagens {
|
|||
|
||||
private:
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create an overall protobuf response from the array of responses
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void assembleResponse ();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief return the required content type string
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -179,18 +155,6 @@ namespace triagens {
|
|||
/// @{
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief handlers created, ordered by their sequence in the input
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
vector<HttpHandler*> _handlers;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief number of async handler responses still missing
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
size_t _missingResponses;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief protobuffer container with input messages
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -203,12 +167,6 @@ namespace triagens {
|
|||
|
||||
PB_ArangoMessage* _outputMessages;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief mutex used to protected protobuffer and handlers structure
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
basics::Mutex _handlerLock;
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue