1
0
Fork 0

updated batch handler

This commit is contained in:
Jan Steemann 2012-09-17 17:18:28 +02:00
parent bb14df164d
commit 7ad38b946c
3 changed files with 91 additions and 145 deletions

View File

@ -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:

View File

@ -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();
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////

View File

@ -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;
};
}
}