diff --git a/arangod/V8Server/V8DealerFeature.cpp b/arangod/V8Server/V8DealerFeature.cpp index 3e8ee97796..1195eb4473 100644 --- a/arangod/V8Server/V8DealerFeature.cpp +++ b/arangod/V8Server/V8DealerFeature.cpp @@ -115,7 +115,6 @@ V8DealerFeature::V8DealerFeature( } void V8DealerFeature::collectOptions(std::shared_ptr options) { - options->addSection("javascript", "Configure the Javascript engine"); options->addHiddenOption( @@ -260,10 +259,28 @@ void V8DealerFeature::prepare() { void V8DealerFeature::start() { if (_copyInstallation) { copyInstallationFiles(); // will exit process if it fails + } else { + // don't copy JS files on startup + // now check if we have a js directory inside the database directory, and if it looks good + auto dbPathFeature = application_features::ApplicationServer::getFeature(DatabasePathFeature::name()); + const std::string dbJSPath = FileUtils::buildFilename(dbPathFeature->directory(), "js"); + const std::string checksumFile = FileUtils::buildFilename(dbJSPath, StaticStrings::checksumFileJs); + const std::string serverPath = FileUtils::buildFilename(dbJSPath, "server"); + const std::string commonPath = FileUtils::buildFilename(dbJSPath, "common"); + if (FileUtils::isDirectory(dbJSPath) && + FileUtils::exists(checksumFile) && + FileUtils::isDirectory(serverPath) && + FileUtils::isDirectory(commonPath)) { + // only load node modules from original startup path + _nodeModulesDirectory = _startupDirectory; + // js directory inside database directory looks good. now use it! + _startupDirectory = dbJSPath; + } } - LOG_TOPIC(DEBUG, Logger::V8) << "effective startup-directory is '" << _startupDirectory << - "', effective module-directories are " << _moduleDirectories; + LOG_TOPIC(DEBUG, Logger::V8) << "effective startup-directory: " << _startupDirectory << + ", effective module-directories: " << _moduleDirectories << + ", node-modules-directory: " << _nodeModulesDirectory; _startupLoader.setDirectory(_startupDirectory); ServerState::instance()->setJavaScriptPath(_startupDirectory); @@ -282,7 +299,6 @@ void V8DealerFeature::start() { if (!_appPath.empty()) { paths.push_back(std::string("application '" + _appPath + "'")); - // create app directory if it does not exist if (!basics::FileUtils::isDirectory(_appPath)) { std::string systemErrorStr; @@ -383,6 +399,7 @@ void V8DealerFeature::copyInstallationFiles() { // these do not need JavaScript support return; } + // get base path from DatabasePathFeature auto dbPathFeature = application_features::ApplicationServer::getFeature(); const std::string copyJSPath = FileUtils::buildFilename(dbPathFeature->directory(), "js"); @@ -393,6 +410,8 @@ void V8DealerFeature::copyInstallationFiles() { } TRI_ASSERT(!copyJSPath.empty()); + _nodeModulesDirectory = _startupDirectory; + const std::string checksumFile = FileUtils::buildFilename(_startupDirectory, StaticStrings::checksumFileJs); const std::string copyChecksumFile = FileUtils::buildFilename(copyJSPath, StaticStrings::checksumFileJs); @@ -450,7 +469,6 @@ void V8DealerFeature::copyInstallationFiles() { if (normalized.substr(normalized.size() - nodeModulesPath.size(), nodeModulesPath.size()) == nodeModulesPath || normalized.substr(normalized.size() - nodeModulesPathVersioned.size(), nodeModulesPathVersioned.size()) == nodeModulesPathVersioned) { // filter it out! - _nodeModulesDirectory = _startupDirectory; return true; } } @@ -1398,7 +1416,7 @@ V8Context* V8DealerFeature::buildContext(size_t id) { directories.insert(directories.end(), _moduleDirectories.begin(), _moduleDirectories.end()); directories.emplace_back(_startupDirectory); - if (!_nodeModulesDirectory.empty()) { + if (!_nodeModulesDirectory.empty() && _nodeModulesDirectory != _startupDirectory) { directories.emplace_back(_nodeModulesDirectory); } diff --git a/arangosh/Shell/V8ShellFeature.cpp b/arangosh/Shell/V8ShellFeature.cpp index 23b6cf3ba0..dd4a9e766f 100644 --- a/arangosh/Shell/V8ShellFeature.cpp +++ b/arangosh/Shell/V8ShellFeature.cpp @@ -241,6 +241,8 @@ void V8ShellFeature::copyInstallationFiles() { LOG_TOPIC(DEBUG, Logger::V8) << "Copying JS installation files from '" << _startupDirectory << "' to '" << _copyDirectory << "'"; int res = TRI_ERROR_NO_ERROR; + + _nodeModulesDirectory = _startupDirectory; if (FileUtils::exists(_copyDirectory)) { res = TRI_RemoveDirectory(_copyDirectory.c_str()); @@ -270,7 +272,6 @@ void V8ShellFeature::copyInstallationFiles() { if (normalized.substr(normalized.size() - nodeModulesPath.size(), nodeModulesPath.size()) == nodeModulesPath || normalized.substr(normalized.size() - nodeModulesPathVersioned.size(), nodeModulesPathVersioned.size()) == nodeModulesPathVersioned) { // filter it out! - _nodeModulesDirectory = _startupDirectory; return true; } }