From 139c91d4c25763f4072960d4a7999b887c70fa0c Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 28 Apr 2016 12:48:02 +0200 Subject: [PATCH] added timers --- arangod/Utils/Transaction.cpp | 16 ++++++++++- arangod/V8Server/v8-collection.cpp | 45 +++++++++++++++++++----------- lib/Basics/Timers.h | 30 +++++++++++++++++++- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/arangod/Utils/Transaction.cpp b/arangod/Utils/Transaction.cpp index 344ae14d80..44f282a36b 100644 --- a/arangod/Utils/Transaction.cpp +++ b/arangod/Utils/Transaction.cpp @@ -1058,6 +1058,8 @@ OperationResult Transaction::documentCoordinator(std::string const& collectionNa OperationResult Transaction::documentLocal(std::string const& collectionName, VPackSlice const value, OperationOptions& options) { + TIMER_START(TRANSACTION_DOCUMENT_LOCAL); + TRI_voc_cid_t cid = addCollectionAtRuntime(collectionName); TRI_document_collection_t* document = documentCollection(trxCollection(cid)); @@ -1066,6 +1068,8 @@ OperationResult Transaction::documentLocal(std::string const& collectionName, VPackBuilder resultBuilder; auto workOnOneDocument = [&](VPackSlice const value, bool isMultiple) -> int { + TIMER_START(TRANSACTION_DOCUMENT_EXTRACT); + std::string key(Transaction::extractKey(value)); if (key.empty()) { return TRI_ERROR_ARANGO_DOCUMENT_HANDLE_BAD; @@ -1075,9 +1079,13 @@ OperationResult Transaction::documentLocal(std::string const& collectionName, if (!options.ignoreRevs) { expectedRevision = TRI_ExtractRevisionIdAsSlice(value); } + + TIMER_STOP(TRANSACTION_DOCUMENT_EXTRACT); TRI_doc_mptr_t mptr; + TIMER_START(TRANSACTION_DOCUMENT_DOCUMENT_DOCUMENT); int res = document->read(this, key, &mptr, !isLocked(document, TRI_TRANSACTION_READ)); + TIMER_STOP(TRANSACTION_DOCUMENT_DOCUMENT_DOCUMENT); if (res != TRI_ERROR_NO_ERROR) { return res; @@ -1101,12 +1109,14 @@ OperationResult Transaction::documentLocal(std::string const& collectionName, // This is the future, for now, we have to do this: resultBuilder.add(VPackSlice(mptr.vpack())); } else if (isMultiple) { - resultBuilder.add(VPackValue(VPackValueType::Null)); + resultBuilder.add(VPackSlice::nullSlice()); } return TRI_ERROR_NO_ERROR; }; + TIMER_START(TRANSACTION_DOCUMENT_WORK_FOR_ONE); + int res = TRI_ERROR_NO_ERROR; std::unordered_map countErrorCodes; if (!value.isArray()) { @@ -1121,6 +1131,10 @@ OperationResult Transaction::documentLocal(std::string const& collectionName, } res = TRI_ERROR_NO_ERROR; } + + TIMER_STOP(TRANSACTION_DOCUMENT_WORK_FOR_ONE); + + TIMER_STOP(TRANSACTION_DOCUMENT_LOCAL); return OperationResult(resultBuilder.steal(), transactionContext()->orderCustomTypeHandler(), "", diff --git a/arangod/V8Server/v8-collection.cpp b/arangod/V8Server/v8-collection.cpp index f005528338..441a69409c 100644 --- a/arangod/V8Server/v8-collection.cpp +++ b/arangod/V8Server/v8-collection.cpp @@ -405,6 +405,8 @@ static void DocumentVocbaseCol( v8::FunctionCallbackInfo const& args) { v8::Isolate* isolate = args.GetIsolate(); v8::HandleScope scope(isolate); + + TIMER_START(JS_DOCUMENT_ALL); // first and only argument should be a document handle or key or an object if (args.Length() != 1) { @@ -426,22 +428,9 @@ static void DocumentVocbaseCol( if (vocbase == nullptr) { TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_DATABASE_NOT_FOUND); } - - auto transactionContext = std::make_shared(vocbase, true); - - SingleCollectionTransaction trx(transactionContext, collectionName, - TRI_TRANSACTION_READ); - if (!args[0]->IsArray()) { - trx.addHint(TRI_TRANSACTION_HINT_SINGLE_OPERATION, false); - } - - int res = trx.begin(); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } - + VPackBuilder searchBuilder; - + auto workOnOneDocument = [&](v8::Local const searchValue, bool isBabies) { std::string collName; if (!ExtractDocumentHandle(isolate, searchValue, collName, searchBuilder, @@ -469,8 +458,26 @@ static void DocumentVocbaseCol( VPackSlice search = searchBuilder.slice(); - // No options here + + TIMER_START(JS_DOCUMENT_CREATE_TRX); + auto transactionContext = std::make_shared(vocbase, true); + + SingleCollectionTransaction trx(transactionContext, collectionName, + TRI_TRANSACTION_READ); + if (!args[0]->IsArray()) { + trx.addHint(TRI_TRANSACTION_HINT_SINGLE_OPERATION, false); + } + + TIMER_STOP(JS_DOCUMENT_CREATE_TRX); + + int res = trx.begin(); + if (res != TRI_ERROR_NO_ERROR) { + TRI_V8_THROW_EXCEPTION(res); + } + + TIMER_START(JS_DOCUMENT_DOCUMENT); OperationResult opResult = trx.document(collectionName, search, options); + TIMER_STOP(JS_DOCUMENT_DOCUMENT); res = trx.finish(opResult.code); @@ -481,9 +488,15 @@ static void DocumentVocbaseCol( if (res != TRI_ERROR_NO_ERROR) { TRI_V8_THROW_EXCEPTION(res); } + + TIMER_START(JS_DOCUMENT_VPACK_TO_V8); v8::Handle result = TRI_VPackToV8(isolate, opResult.slice(), transactionContext->getVPackOptions()); + + TIMER_STOP(JS_DOCUMENT_VPACK_TO_V8); + + TIMER_STOP(JS_DOCUMENT_ALL); TRI_V8_RETURN(result); } diff --git a/lib/Basics/Timers.h b/lib/Basics/Timers.h index 6444bdc9a5..dde0ac9917 100644 --- a/lib/Basics/Timers.h +++ b/lib/Basics/Timers.h @@ -60,8 +60,18 @@ class Timers { JS_INSERT_V8_TO_VPACK2, JS_INSERT_CREATE_TRX, JS_INSERT_INSERT, - TRANSACTION_INSERT_DOCUMENT_INSERT, + + JS_DOCUMENT_ALL, + JS_DOCUMENT_CREATE_TRX, + JS_DOCUMENT_DOCUMENT, + JS_DOCUMENT_VPACK_TO_V8, + TRANSACTION_DOCUMENT_LOCAL, + TRANSACTION_DOCUMENT_DOCUMENT_DOCUMENT, + TRANSACTION_DOCUMENT_WORK_FOR_ONE, + TRANSACTION_DOCUMENT_EXTRACT, + + TRANSACTION_INSERT_DOCUMENT_INSERT, TRANSACTION_INSERT_LOCAL, TRANSACTION_INSERT_BUILD_DOCUMENT_IDENTITY, TRANSACTION_INSERT_WORK_FOR_ONE, @@ -87,6 +97,24 @@ class Timers { return "JS_INSERT_CREATE_TRX"; case JS_INSERT_INSERT: return "JS_INSERT_INSERT"; + + case JS_DOCUMENT_ALL: + return "JS_DOCUMENT_ALL"; + case JS_DOCUMENT_CREATE_TRX: + return "JS_DOCUMENT_CREATE_TRX"; + case JS_DOCUMENT_DOCUMENT: + return "JS_DOCUMENT_DOCUMENT"; + case JS_DOCUMENT_VPACK_TO_V8: + return "JS_DOCUMENT_VPACK_TO_V8"; + + case TRANSACTION_DOCUMENT_LOCAL: + return "TRANSACTION_DOCUMENT_LOCAL"; + case TRANSACTION_DOCUMENT_DOCUMENT_DOCUMENT: + return "TRANSACTION_DOCUMENT_DOCUMENT_DOCUMENT"; + case TRANSACTION_DOCUMENT_WORK_FOR_ONE: + return "TRANSACTION_DOCUMENT_WORK_FOR_ONE"; + case TRANSACTION_DOCUMENT_EXTRACT: + return "TRANSACTION_DOCUMENT_EXTRACT"; case TRANSACTION_INSERT_LOCAL: return "TRANSACTION_INSERT_LOCAL";