From 879c7bb4790f7d6addd7447ad4640bce5527c833 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Fri, 30 Nov 2018 16:24:07 +0100 Subject: [PATCH] slash all left over processes (if) and set status to bad. (#7557) --- UnitTests/unittest.js | 9 +++++- js/common/bootstrap/modules/internal.js | 9 ++++++ lib/Basics/process-utils.cpp | 2 +- lib/Basics/process-utils.h | 6 ++++ lib/V8/v8-utils.cpp | 37 +++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/UnitTests/unittest.js b/UnitTests/unittest.js index fe0edc70f1..fb807b1b59 100644 --- a/UnitTests/unittest.js +++ b/UnitTests/unittest.js @@ -10,6 +10,7 @@ const internalMembers = UnitTest.internalMembers; const fs = require('fs'); const internal = require('internal'); // js/common/bootstrap/modules/internal.js const inspect = internal.inspect; +const abortSignal = 6; let testOutputDirectory; @@ -312,7 +313,13 @@ function main (argv) { // creates yaml like dump at the end UnitTest.unitTestPrettyPrintResults(res, testOutputDirectory, options); - return res.status; + let running = require("internal").getExternalSpawned(); + let i = 0; + for (i = 0; i < running.length; i++) { + print("Killing remaining process: " + JSON.stringify(running[i])); + print(require("internal").killExternal(running[i].pid, abortSignal)); + }; + return res.status && running.length === 0; } let result = main(ARGUMENTS); diff --git a/js/common/bootstrap/modules/internal.js b/js/common/bootstrap/modules/internal.js index a7761181c9..954f1d3170 100644 --- a/js/common/bootstrap/modules/internal.js +++ b/js/common/bootstrap/modules/internal.js @@ -624,6 +624,15 @@ global.DEFINE_MODULE('internal', (function () { delete global.SYS_EXECUTE_EXTERNAL_AND_WAIT; } + // ////////////////////////////////////////////////////////////////////////////// + // / @brief getExternalSpawned + // ////////////////////////////////////////////////////////////////////////////// + + if (global.SYS_GET_EXTERNAL_SPAWNED) { + exports.getExternalSpawned = global.SYS_GET_EXTERNAL_SPAWNED; + delete global.SYS_GET_EXTERNAL_SPAWNED; + } + // ////////////////////////////////////////////////////////////////////////////// // / @brief killExternal // ////////////////////////////////////////////////////////////////////////////// diff --git a/lib/Basics/process-utils.cpp b/lib/Basics/process-utils.cpp index 445e006dec..4c32999334 100644 --- a/lib/Basics/process-utils.cpp +++ b/lib/Basics/process-utils.cpp @@ -66,7 +66,7 @@ uint64_t TRI_PhysicalMemory; /// @brief all external processes //////////////////////////////////////////////////////////////////////////////// -static std::vector ExternalProcesses; +std::vector ExternalProcesses; //////////////////////////////////////////////////////////////////////////////// /// @brief lock for protected access to vector ExternalProcesses diff --git a/lib/Basics/process-utils.h b/lib/Basics/process-utils.h index 11b8117192..0afdc3ab3d 100644 --- a/lib/Basics/process-utils.h +++ b/lib/Basics/process-utils.h @@ -127,6 +127,12 @@ struct ExternalProcess { /// @brief external process status //////////////////////////////////////////////////////////////////////////////// +extern std::vector ExternalProcesses; + +//////////////////////////////////////////////////////////////////////////////// +/// @brief external process status +//////////////////////////////////////////////////////////////////////////////// + struct ExternalProcessStatus { TRI_external_status_e _status; int64_t _exitStatus; diff --git a/lib/V8/v8-utils.cpp b/lib/V8/v8-utils.cpp index 82753a2e13..066d596e10 100644 --- a/lib/V8/v8-utils.cpp +++ b/lib/V8/v8-utils.cpp @@ -3610,6 +3610,38 @@ static void convertStatusToV8(v8::FunctionCallbackInfo const& args, TRI_V8_TRY_CATCH_END; } +//////////////////////////////////////////////////////////////////////////////// +/// @brief lists all running external processes +//////////////////////////////////////////////////////////////////////////////// + +static void JS_GetExternalSpawned( + v8::FunctionCallbackInfo const& args) { + TRI_V8_TRY_CATCH_BEGIN(isolate); + v8::HandleScope scope(isolate); + + // extract the arguments + if (args.Length() != 0) { + TRI_V8_THROW_EXCEPTION_USAGE("getExternalSpawned()"); + } + + v8::Handle spawnedProcesses = + v8::Array::New(isolate, static_cast(ExternalProcesses.size())); + + uint32_t i = 0; + for (auto const& process : ExternalProcesses) { + v8::Handle oneProcess = v8::Object::New(isolate); + ExternalId external; + external._pid = process->_pid; + auto external_status = TRI_CheckExternalProcess(external, false); + convertStatusToV8(args, oneProcess, external_status, external); + spawnedProcesses->Set(i, oneProcess); + i++; + } + + TRI_V8_RETURN(spawnedProcesses); + TRI_V8_TRY_CATCH_END +} + //////////////////////////////////////////////////////////////////////////////// /// @brief executes a external program //////////////////////////////////////////////////////////////////////////////// @@ -4787,6 +4819,11 @@ void TRI_InitV8Utils(v8::Isolate* isolate, v8::Handle context, TRI_AddGlobalFunctionVocbase(isolate, TRI_V8_ASCII_STRING(isolate, "SYS_SPLIT_WORDS_ICU"), JS_SplitWordlist); + + + TRI_AddGlobalFunctionVocbase(isolate, + TRI_V8_ASCII_STRING(isolate, "SYS_GET_EXTERNAL_SPAWNED"), + JS_GetExternalSpawned); TRI_AddGlobalFunctionVocbase(isolate, TRI_V8_ASCII_STRING(isolate, "SYS_KILL_EXTERNAL"), JS_KillExternal);