1
0
Fork 0

Merge branch 'devel' of ssh://github.com/ArangoDB/ArangoDB into devel

This commit is contained in:
Max Neunhoeffer 2016-10-05 13:44:53 +02:00
commit e01c0e694a
11 changed files with 169 additions and 90 deletions

View File

@ -1687,7 +1687,12 @@ int ClusterInfo::ensureIndexCoordinator(
loadPlan();
TRI_ASSERT(*numberOfShards > 0);
if (*numberOfShards == 0) {
errorMsg = *errMsg;
resultBuilder = *resBuilder;
loadCurrent();
return TRI_ERROR_NO_ERROR;
}
{
CONDITION_LOCKER(locker, agencyCallback->_cv);
@ -1902,6 +1907,10 @@ int ClusterInfo::dropIndexCoordinator(std::string const& databaseName,
// load our own cache:
loadPlan();
if (*numberOfShards == 0) {
loadCurrent();
return TRI_ERROR_NO_ERROR;
}
{
MUTEX_LOCKER(guard, *numberOfShardsMutex);

View File

@ -794,11 +794,24 @@ static void JS_DocumentVocbaseCol(
}
#ifndef USE_ENTERPRISE
////////////////////////////////////////////////////////////////////////////////
/// @brief unloads a collection, case of a coordinator in a cluster
////////////////////////////////////////////////////////////////////////////////
static int ULVocbaseColCoordinator(std::string const& databaseName,
std::string const& collectionCID,
TRI_vocbase_col_status_e status) {
return ClusterInfo::instance()->setCollectionStatusCoordinator(
databaseName, collectionCID, s);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief drops a collection, case of a coordinator in a cluster
////////////////////////////////////////////////////////////////////////////////
#ifndef USE_ENTERPRISE
static void DropVocbaseColCoordinator(
v8::FunctionCallbackInfo<v8::Value> const& args,
arangodb::LogicalCollection* collection) {
@ -988,37 +1001,41 @@ static void JS_LoadVocbaseCol(v8::FunctionCallbackInfo<v8::Value> const& args) {
}
if (ServerState::instance()->isCoordinator()) {
std::string const databaseName(collection->dbName());
std::string const cid = collection->cid_as_string();
int res = ClusterInfo::instance()->setCollectionStatusCoordinator(
databaseName, cid, TRI_VOC_COL_STATUS_LOADED);
int res =
#ifdef USE_ENTERPRISE
ULVocbaseColCoordinatorEnterprise(
collection->dbName(), collection->cid_as_string(),
TRI_VOC_COL_STATUS_LOADED);
#else
ULVocbaseColCoordinator(
collection->dbName(), collection->cid_as_string(),
TRI_VOC_COL_STATUS_LOADED);
#endif
if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_THROW_EXCEPTION(res);
}
TRI_V8_RETURN_UNDEFINED();
}
SingleCollectionTransaction trx(
V8TransactionContext::Create(collection->vocbase(), true),
collection->cid(), TRI_TRANSACTION_READ);
V8TransactionContext::Create(collection->vocbase(), true),
collection->cid(), TRI_TRANSACTION_READ);
int res = trx.begin();
if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_THROW_EXCEPTION(res);
}
res = trx.finish(res);
if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_THROW_EXCEPTION(res);
}
TRI_V8_RETURN_UNDEFINED();
TRI_V8_TRY_CATCH_END
}
////////////////////////////////////////////////////////////////////////////////
@ -2415,11 +2432,18 @@ static void JS_UnloadVocbaseCol(
int res;
if (ServerState::instance()->isCoordinator()) {
std::string const databaseName(collection->dbName());
res = ClusterInfo::instance()->setCollectionStatusCoordinator(
databaseName, collection->cid_as_string(),
res =
#ifdef USE_ENTERPRISE
ULVocbaseColCoordinatorEnterprise(
collection->dbName(), collection->cid_as_string(),
TRI_VOC_COL_STATUS_UNLOADED);
#else
ULVocbaseColCoordinator(
collection->dbName(), collection->cid_as_string(),
TRI_VOC_COL_STATUS_UNLOADED);
#endif
} else {
res = collection->vocbase()->unloadCollection(collection, false);
}

View File

@ -27,6 +27,7 @@
#include "Basics/Common.h"
#include "Utils/CollectionNameResolver.h"
#include "V8Server/v8-vocbase.h"
#include "VocBase/vocbase.h"
namespace arangodb {
class LogicalCollection;
@ -65,5 +66,11 @@ void TRI_InitV8Collection(v8::Handle<v8::Context> context,
void DropVocbaseColCoordinatorEnterprise(
v8::FunctionCallbackInfo<v8::Value> const& args,
arangodb::LogicalCollection* collection);
int ULVocbaseColCoordinatorEnterprise(std::string const& databaseName,
std::string const& collectionCID,
TRI_vocbase_col_status_e status);
#endif
#endif

View File

@ -448,15 +448,11 @@ static int EnhanceIndexJson(v8::FunctionCallbackInfo<v8::Value> const& args,
/// @brief ensures an index, coordinator case
////////////////////////////////////////////////////////////////////////////////
int EnsureIndexCoordinator(
LogicalCollection const* collection, VPackSlice const slice, bool create,
VPackBuilder& resultBuilder, std::string& errorMsg) {
TRI_ASSERT(collection != nullptr);
int EnsureIndexCoordinator(std::string const& databaseName,
std::string const& cid,
VPackSlice const slice, bool create,
VPackBuilder& resultBuilder, std::string& errorMsg) {
TRI_ASSERT(!slice.isNone());
std::string const databaseName(collection->dbName());
std::string const cid = collection->cid_as_string();
return ClusterInfo::instance()->ensureIndexCoordinator(
databaseName, cid, slice, create, &arangodb::Index::Compare,
resultBuilder, errorMsg, 360.0);
@ -604,9 +600,13 @@ static void EnsureIndex(v8::FunctionCallbackInfo<v8::Value> const& args,
VPackBuilder resultBuilder;
std::string errorMsg;
#ifdef USE_ENTERPRISE
int res = EnsureIndexCoordinatorEnterprise(collection, slice, create, resultBuilder, errorMsg);
int res = EnsureIndexCoordinatorEnterprise(collection, slice, create,
resultBuilder, errorMsg);
#else
int res = EnsureIndexCoordinator(collection, slice, create, resultBuilder, errorMsg);
std::string const databaseName(collection->dbName());
std::string const cid = collection->cid_as_string();
int res = EnsureIndexCoordinator(databaseName, cid, slice, create,
resultBuilder, errorMsg);
#endif
if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_THROW_EXCEPTION_MESSAGE(res, errorMsg);
@ -728,54 +728,15 @@ static void JS_LookupIndexVocbaseCol(
/// @brief drops an index, coordinator case
////////////////////////////////////////////////////////////////////////////////
static void DropIndexCoordinator(
v8::FunctionCallbackInfo<v8::Value> const& args,
arangodb::LogicalCollection const* collection, v8::Handle<v8::Value> const val) {
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
std::string collectionName;
TRI_idx_iid_t iid = 0;
// extract the index identifier from a string
if (val->IsString() || val->IsStringObject() || val->IsNumber()) {
if (!IsIndexHandle(val, collectionName, iid)) {
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_INDEX_HANDLE_BAD);
}
}
// extract the index identifier from an object
else if (val->IsObject()) {
TRI_GET_GLOBALS();
v8::Handle<v8::Object> obj = val->ToObject();
TRI_GET_GLOBAL_STRING(IdKey);
v8::Handle<v8::Value> iidVal = obj->Get(IdKey);
if (!IsIndexHandle(iidVal, collectionName, iid)) {
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_INDEX_HANDLE_BAD);
}
}
if (!collectionName.empty()) {
CollectionNameResolver resolver(collection->vocbase());
if (!EqualCollection(&resolver, collectionName, collection)) {
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_CROSS_COLLECTION_REQUEST);
}
}
std::string const databaseName(collection->dbName());
std::string const cid = collection->cid_as_string();
int DropIndexCoordinator(
std::string const& databaseName,
std::string const& cid,
TRI_idx_iid_t const iid) {
std::string errorMsg;
int res = ClusterInfo::instance()->dropIndexCoordinator(databaseName, cid,
iid, errorMsg, 0.0);
return ClusterInfo::instance()->dropIndexCoordinator(databaseName, cid,
iid, errorMsg, 0.0);
if (res == TRI_ERROR_NO_ERROR) {
TRI_V8_RETURN_TRUE();
}
TRI_V8_RETURN_FALSE();
}
////////////////////////////////////////////////////////////////////////////////
@ -801,8 +762,49 @@ static void JS_DropIndexVocbaseCol(
}
if (ServerState::instance()->isCoordinator()) {
DropIndexCoordinator(args, collection, args[0]);
return;
std::string collectionName;
TRI_idx_iid_t iid = 0;
v8::Handle<v8::Value> const val = args[0];
// extract the index identifier from a string
if (val->IsString() || val->IsStringObject() || val->IsNumber()) {
if (!IsIndexHandle(val, collectionName, iid)) {
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_INDEX_HANDLE_BAD);
}
}
// extract the index identifier from an object
else if (val->IsObject()) {
TRI_GET_GLOBALS();
v8::Handle<v8::Object> obj = val->ToObject();
TRI_GET_GLOBAL_STRING(IdKey);
v8::Handle<v8::Value> iidVal = obj->Get(IdKey);
if (!IsIndexHandle(iidVal, collectionName, iid)) {
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_INDEX_HANDLE_BAD);
}
}
if (!collectionName.empty()) {
CollectionNameResolver resolver(collection->vocbase());
if (!EqualCollection(&resolver, collectionName, collection)) {
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_CROSS_COLLECTION_REQUEST);
}
}
#ifdef USE_ENTERPRISE
int res = DropIndexCoordinatorEnterprise(collection, iid);
#else
std::string const databaseName(collection->dbName());
std::string const cid = collection->cid_as_string();
int res = DropIndexCoordinator(databaseName, cid, iid);
#endif
if (res == TRI_ERROR_NO_ERROR) {
TRI_V8_RETURN_TRUE();
}
TRI_V8_RETURN_FALSE();
}
READ_LOCKER(readLocker, collection->vocbase()->_inventoryLock);

View File

@ -61,7 +61,7 @@ std::unique_ptr<arangodb::LogicalCollection> CreateCollectionCoordinatorEnterpri
arangodb::velocypack::Slice parameters);
#endif
int EnsureIndexCoordinator(arangodb::LogicalCollection const* collection,
int EnsureIndexCoordinator(std::string const& dbName, std::string const& cid,
arangodb::velocypack::Slice const slice, bool create,
arangodb::velocypack::Builder& resultBuilder,
std::string& errorMessage);
@ -73,4 +73,14 @@ int EnsureIndexCoordinatorEnterprise(
arangodb::velocypack::Builder& resultBuilder, std::string& errorMessage);
#endif
int DropIndexCoordinator(
std::string const& databaseName,
std::string const& cid,
TRI_idx_iid_t const iid);
#ifdef USE_ENTERPRISE
int DropIndexCoordinatorEnterprise(
arangodb::LogicalCollection const* collection, TRI_idx_iid_t const iid);
#endif
#endif

View File

@ -289,11 +289,11 @@
var tmpNodes = {};
var tmpEdges = {};
_.each(this.graphData.modified.nodes, function (node) {
_.each(this.currentGraph.graph.nodes(), function (node) {
tmpNodes[node.id] = undefined;
});
_.each(this.graphData.modified.edges, function (edge) {
_.each(self.currentGraph.graph.edges(), function (edge) {
tmpEdges[edge.id] = undefined;
});
@ -358,7 +358,7 @@
self.nodeEdgesCount = {};
var handledEdges = {};
_.each(this.graphData.modified.edges, function (edge) {
_.each(this.currentGraph.graph.edges(), function (edge) {
if (handledEdges[edge.id] === undefined) {
handledEdges[edge.id] = true;
@ -394,13 +394,25 @@
},
switchEdgeType: function (edgeType) {
var data = {
nodes: this.currentGraph.graph.nodes(),
edges: this.currentGraph.graph.edges(),
settings: {}
};
this.killCurrentGraph();
this.renderGraph(this.graphData.modified, null, false, null, null, edgeType);
this.renderGraph(data, null, false, null, null, edgeType);
},
switchLayout: function (layout) {
var data = {
nodes: this.currentGraph.graph.nodes(),
edges: this.currentGraph.graph.edges(),
settings: {}
};
this.killCurrentGraph();
this.renderGraph(this.graphData.modified, null, false, layout);
this.renderGraph(data, null, false, layout);
if ($('#g_nodeColorByCollection').val() === 'true') {
this.switchNodeColorByCollection(true);
@ -1696,12 +1708,6 @@
renderGraph: function (graph, toFocus, aqlMode, layout, renderer, edgeType) {
var self = this;
if (this.graphData === undefined) {
this.graphData = {};
this.graphData.modified = graph;
}
this.graphSettings = graph.settings;
var color = '#2ecc71';
@ -2114,7 +2120,7 @@
// allow draggin nodes
} else if (self.algorithm === 'force') {
// add buttons for start/stopping calculation
var style2 = 'color: rgb(64, 74, 83); cursor: pointer; position: absolute; right: 30px; bottom: 40px;';
var style2 = 'color: rgb(64, 74, 83); cursor: pointer; position: absolute; right: 30px; bottom: 40px; z-index: 9999;';
if (self.aqlMode) {
style2 = 'color: rgb(64, 74, 83); cursor: pointer; position: absolute; right: 30px; margin-top: -30px;';

View File

@ -1517,7 +1517,7 @@
});
data.bindVars = this.bindParamTableObj;
}
if (Object.keys(data.bindVars).length > 0) {
if (Object.keys(bindVars).length > 0) {
data.bindVars = bindVars;
}

View File

@ -258,6 +258,7 @@
"ERROR_SERVICE_MOUNTPOINT_CONFLICT" : { "code" : 3011, "message" : "mountpoint already in use" },
"ERROR_MODULE_NOT_FOUND" : { "code" : 3100, "message" : "cannot locate module" },
"ERROR_MODULE_FAILURE" : { "code" : 3103, "message" : "failed to invoke module" },
"ERROR_NO_SMART_COLLECTION" : { "code" : 4000, "message" : "collection is not smart" },
"ERROR_DISPATCHER_IS_STOPPING" : { "code" : 21001, "message" : "dispatcher stopped" },
"ERROR_QUEUE_UNKNOWN" : { "code" : 21002, "message" : "named queue does not exist" },
"ERROR_QUEUE_FULL" : { "code" : 21003, "message" : "named queue is full" }

View File

@ -360,6 +360,13 @@ ERROR_SERVICE_MOUNTPOINT_CONFLICT,3011,"mountpoint already in use","A service ha
ERROR_MODULE_NOT_FOUND,3100,"cannot locate module","The module path could not be resolved."
ERROR_MODULE_FAILURE,3103,"failed to invoke module","Failed to invoke the module in its context."
################################################################################
## Enterprise errors
################################################################################
ERROR_NO_SMART_COLLECTION,4000,"collection is not smart","The requested collection needs to be smart, but it ain't"
################################################################################
## Dispatcher errors
################################################################################

View File

@ -254,6 +254,7 @@ void TRI_InitializeErrorMessages () {
REG_ERROR(ERROR_SERVICE_MOUNTPOINT_CONFLICT, "mountpoint already in use");
REG_ERROR(ERROR_MODULE_NOT_FOUND, "cannot locate module");
REG_ERROR(ERROR_MODULE_FAILURE, "failed to invoke module");
REG_ERROR(ERROR_NO_SMART_COLLECTION, "collection is not smart");
REG_ERROR(ERROR_DISPATCHER_IS_STOPPING, "dispatcher stopped");
REG_ERROR(ERROR_QUEUE_UNKNOWN, "named queue does not exist");
REG_ERROR(ERROR_QUEUE_FULL, "named queue is full");

View File

@ -605,6 +605,8 @@
/// The module path could not be resolved.
/// - 3103: @LIT{failed to invoke module}
/// Failed to invoke the module in its context.
/// - 4000: @LIT{collection is not smart}
/// The requested collection needs to be smart, but it ain't
/// - 21001: @LIT{dispatcher stopped}
/// Will be returned if a shutdown is in progress.
/// - 21002: @LIT{named queue does not exist}
@ -3195,6 +3197,16 @@ void TRI_InitializeErrorMessages ();
#define TRI_ERROR_MODULE_FAILURE (3103)
////////////////////////////////////////////////////////////////////////////////
/// @brief 4000: ERROR_NO_SMART_COLLECTION
///
/// collection is not smart
///
/// The requested collection needs to be smart, but it ain't
////////////////////////////////////////////////////////////////////////////////
#define TRI_ERROR_NO_SMART_COLLECTION (4000)
////////////////////////////////////////////////////////////////////////////////
/// @brief 21001: ERROR_DISPATCHER_IS_STOPPING
///