static void JS_ReadAgent(v8::FunctionCallbackInfo<v8::Value> const& args) { TRI_V8_TRY_CATCH_BEGIN(isolate); v8::HandleScope scope(isolate); Agent* agent = nullptr; try { AgencyFeature* feature = ApplicationServer::getEnabledFeature<AgencyFeature>("Agency"); agent = feature->agent(); } catch (std::exception const& e) { TRI_V8_THROW_EXCEPTION_MESSAGE( TRI_ERROR_INTERNAL, std::string("couldn't access agency feature: ") + e.what()); } query_t query = std::make_shared<Builder>(); int res = TRI_V8ToVPack(isolate, *query, args[0], false); if (res != TRI_ERROR_NO_ERROR) { TRI_V8_THROW_EXCEPTION(res); } read_ret_t ret = agent->read(query); if (ret.accepted) { // Leading TRI_V8_RETURN(TRI_VPackToV8(isolate, ret.result->slice())); } else { // Not leading TRI_V8_RETURN_FALSE(); } TRI_V8_TRY_CATCH_END }
static void JS_WriteAgent(v8::FunctionCallbackInfo<v8::Value> const& args) { TRI_V8_TRY_CATCH_BEGIN(isolate); v8::HandleScope scope(isolate); Agent* agent = nullptr; try { AgencyFeature* feature = ApplicationServer::getEnabledFeature<AgencyFeature>("Agency"); agent = feature->agent(); } catch (std::exception const& e) { TRI_V8_THROW_EXCEPTION_MESSAGE( TRI_ERROR_INTERNAL, std::string("couldn't access agency feature: ") + e.what()); } query_t query = std::make_shared<Builder>(); int res = TRI_V8ToVPack(isolate, *query, args[0], false); if (res != TRI_ERROR_NO_ERROR) { TRI_V8_THROW_EXCEPTION(res); } write_ret_t ret = agent->write(query); if (ret.accepted) { // Leading size_t errors = 0; Builder body; body.openObject(); body.add("results", VPackValue(VPackValueType::Array)); for (auto const& index : ret.indices) { body.add(VPackValue(index)); if (index == 0) { errors++; } } body.close(); body.close(); // Wait for commit of highest except if it is 0? arangodb::consensus::index_t max_index = 0; try { max_index = *std::max_element(ret.indices.begin(), ret.indices.end()); } catch (std::exception const& e) { LOG_TOPIC(WARN, Logger::AGENCY) << e.what() << " " << __FILE__ << __LINE__; } if (max_index > 0) { agent->waitFor(max_index); } TRI_V8_RETURN(TRI_VPackToV8(isolate, body.slice())); } else { // Not leading TRI_V8_RETURN_FALSE(); } TRI_V8_TRY_CATCH_END }
static void JS_LeadingAgent(v8::FunctionCallbackInfo<v8::Value> const& args) { TRI_V8_TRY_CATCH_BEGIN(isolate); v8::HandleScope scope(isolate); Agent* agent = nullptr; try { AgencyFeature* feature = ApplicationServer::getEnabledFeature<AgencyFeature>("Agency"); agent = feature->agent(); } catch (std::exception const& e) { TRI_V8_THROW_EXCEPTION_MESSAGE( TRI_ERROR_INTERNAL, std::string("couldn't access agency feature: ") + e.what()); } v8::Handle<v8::Object> r = v8::Object::New(isolate); r->Set(TRI_V8_ASCII_STRING("leading"), v8::Boolean::New(isolate, agent->leading())); TRI_V8_RETURN(r); TRI_V8_TRY_CATCH_END }
void GeneralServerFeature::defineHandlers() { TRI_ASSERT(_jobManager != nullptr); AgencyFeature* agency = application_features::ApplicationServer::getFeature<AgencyFeature>( "Agency"); TRI_ASSERT(agency != nullptr); ClusterFeature* cluster = application_features::ApplicationServer::getFeature<ClusterFeature>( "Cluster"); TRI_ASSERT(cluster != nullptr); AuthenticationFeature* authentication = application_features::ApplicationServer::getFeature< AuthenticationFeature>("Authentication"); TRI_ASSERT(authentication != nullptr); auto queryRegistry = QueryRegistryFeature::QUERY_REGISTRY; auto traverserEngineRegistry = TraverserEngineRegistryFeature::TRAVERSER_ENGINE_REGISTRY; // ........................................................................... // /_msg // ........................................................................... _handlerFactory->addPrefixHandler( "/_msg/please-upgrade", RestHandlerCreator<RestPleaseUpgradeHandler>::createNoData); // ........................................................................... // /_api // ........................................................................... _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::BATCH_PATH, RestHandlerCreator<RestBatchHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::CURSOR_PATH, RestHandlerCreator<RestCursorHandler>::createData<aql::QueryRegistry*>, queryRegistry); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::DOCUMENT_PATH, RestHandlerCreator<RestDocumentHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::EDGES_PATH, RestHandlerCreator<RestEdgesHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::EXPORT_PATH, RestHandlerCreator<RestExportHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::IMPORT_PATH, RestHandlerCreator<RestImportHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::REPLICATION_PATH, RestHandlerCreator<RestReplicationHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::SIMPLE_QUERY_ALL_PATH, RestHandlerCreator<RestSimpleQueryHandler>::createData< aql::QueryRegistry*>, queryRegistry); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::SIMPLE_QUERY_ALL_KEYS_PATH, RestHandlerCreator<RestSimpleQueryHandler>::createData< aql::QueryRegistry*>, queryRegistry); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::WAL_PATH, RestHandlerCreator<RestWalHandler>::createNoData); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::SIMPLE_LOOKUP_PATH, RestHandlerCreator<RestSimpleHandler>::createData<aql::QueryRegistry*>, queryRegistry); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::SIMPLE_REMOVE_PATH, RestHandlerCreator<RestSimpleHandler>::createData<aql::QueryRegistry*>, queryRegistry); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::UPLOAD_PATH, RestHandlerCreator<RestUploadHandler>::createNoData); _handlerFactory->addPrefixHandler( "/_api/shard-comm", RestHandlerCreator<RestShardHandler>::createNoData); _handlerFactory->addPrefixHandler( "/_api/aql", RestHandlerCreator<aql::RestAqlHandler>::createData<aql::QueryRegistry*>, queryRegistry); _handlerFactory->addPrefixHandler( "/_api/aql-builtin", RestHandlerCreator<RestAqlFunctionsHandler>::createNoData); _handlerFactory->addPrefixHandler( "/_api/query", RestHandlerCreator<RestQueryHandler>::createNoData); _handlerFactory->addPrefixHandler( "/_api/query-cache", RestHandlerCreator<RestQueryCacheHandler>::createNoData); if (agency->isEnabled()) { _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::AGENCY_PATH, RestHandlerCreator<RestAgencyHandler>::createData<consensus::Agent*>, agency->agent()); _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::AGENCY_PRIV_PATH, RestHandlerCreator<RestAgencyPrivHandler>::createData< consensus::Agent*>, agency->agent()); } if (cluster->isEnabled()) { // add "/agency-callbacks" handler _handlerFactory->addPrefixHandler( cluster->agencyCallbacksPath(), RestHandlerCreator<RestAgencyCallbacksHandler>::createData< AgencyCallbackRegistry*>, cluster->agencyCallbackRegistry()); } _handlerFactory->addPrefixHandler( RestVocbaseBaseHandler::INTERNAL_TRAVERSER_PATH, RestHandlerCreator<InternalRestTraverserHandler>::createData< traverser::TraverserEngineRegistry*>, traverserEngineRegistry); // And now some handlers which are registered in both /_api and /_admin _handlerFactory->addPrefixHandler( "/_api/job", RestHandlerCreator<arangodb::RestJobHandler>::createData< AsyncJobManager*>, _jobManager.get()); _handlerFactory->addHandler( "/_api/version", RestHandlerCreator<RestVersionHandler>::createNoData); #ifdef ARANGODB_ENABLE_MAINTAINER_MODE _handlerFactory->addHandler( "/_admin/demo-engine", RestHandlerCreator<RestDemoHandler>::createNoData); #endif // ........................................................................... // /_admin // ........................................................................... _handlerFactory->addPrefixHandler( "/_admin/job", RestHandlerCreator<arangodb::RestJobHandler>::createData< AsyncJobManager*>, _jobManager.get()); _handlerFactory->addHandler( "/_admin/version", RestHandlerCreator<RestVersionHandler>::createNoData); // further admin handlers _handlerFactory->addPrefixHandler( "/_admin/log", RestHandlerCreator<arangodb::RestAdminLogHandler>::createNoData); _handlerFactory->addPrefixHandler( "/_admin/work-monitor", RestHandlerCreator<WorkMonitorHandler>::createNoData); _handlerFactory->addHandler( "/_admin/json-echo", RestHandlerCreator<RestEchoHandler>::createNoData); #ifdef ARANGODB_ENABLE_FAILURE_TESTS // This handler is to activate SYS_DEBUG_FAILAT on DB servers _handlerFactory->addPrefixHandler( "/_admin/debug", RestHandlerCreator<RestDebugHandler>::createNoData); #endif _handlerFactory->addPrefixHandler( "/_admin/shutdown", RestHandlerCreator<arangodb::RestShutdownHandler>::createNoData); if (authentication->isEnabled()) { _handlerFactory->addPrefixHandler( "/_open/auth", RestHandlerCreator<arangodb::RestAuthHandler>::createNoData); } // ........................................................................... // /_admin // ........................................................................... _handlerFactory->addPrefixHandler( "/", RestHandlerCreator<RestActionHandler>::createNoData); }