mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of github.com:arangodb/arangodb into 3.3
This commit is contained in:
commit
a54da92fc7
11
CHANGELOG
11
CHANGELOG
|
@ -1,3 +1,9 @@
|
||||||
|
v3.3.rc3 (2017-11-24)
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
* bug-fixes
|
||||||
|
|
||||||
|
|
||||||
v3.3.rc2 (2017-11-22)
|
v3.3.rc2 (2017-11-22)
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
@ -16,7 +22,10 @@ v3.3.rc1 (2017-11-17)
|
||||||
|
|
||||||
* add readonly mode REST API
|
* add readonly mode REST API
|
||||||
|
|
||||||
* allow compilation of ArangoDB source code with g++7
|
* allow compilation of ArangoDB source code with g++ 7
|
||||||
|
|
||||||
|
* upgrade minimum required g++ compiler version to g++ 5.4
|
||||||
|
That means ArangoDB source code will not compile with g++ 4.x or g++ < 5.4 anymore.
|
||||||
|
|
||||||
* AQL: during a traversal if a vertex is not found. It will not print an ERROR to the log and continue
|
* AQL: during a traversal if a vertex is not found. It will not print an ERROR to the log and continue
|
||||||
with a NULL value, but will register a warning at the query and continue with a NULL value.
|
with a NULL value, but will register a warning at the query and continue with a NULL value.
|
||||||
|
|
|
@ -717,6 +717,10 @@ if test -n "${DOWNLOAD_SYNCER_USER}"; then
|
||||||
rm -f "${FN}"
|
rm -f "${FN}"
|
||||||
curl -LJO# -H 'Accept: application/octet-stream' "${SYNCER_URL}?access_token=${OAUTH_TOKEN}" || \
|
curl -LJO# -H 'Accept: application/octet-stream' "${SYNCER_URL}?access_token=${OAUTH_TOKEN}" || \
|
||||||
${SRC}/Installation/Jenkins/curl_time_machine.sh "${SYNCER_URL}?access_token=${OAUTH_TOKEN}" "${FN}"
|
${SRC}/Installation/Jenkins/curl_time_machine.sh "${SYNCER_URL}?access_token=${OAUTH_TOKEN}" "${FN}"
|
||||||
|
if ! test -s "${FN}" ; then
|
||||||
|
echo "failed to download syncer binary - aborting!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
mv "${FN}" "${BUILD_DIR}/${TN}"
|
mv "${FN}" "${BUILD_DIR}/${TN}"
|
||||||
${MD5} < "${BUILD_DIR}/${TN}" | ${SED} "s; .*;;" > "${BUILD_DIR}/${FN}-${SYNCER_REV}"
|
${MD5} < "${BUILD_DIR}/${TN}" | ${SED} "s; .*;;" > "${BUILD_DIR}/${FN}-${SYNCER_REV}"
|
||||||
OLD_MD5=$(cat "${BUILD_DIR}/${FN}-${SYNCER_REV}")
|
OLD_MD5=$(cat "${BUILD_DIR}/${FN}-${SYNCER_REV}")
|
||||||
|
@ -725,6 +729,9 @@ if test -n "${DOWNLOAD_SYNCER_USER}"; then
|
||||||
else
|
else
|
||||||
echo "using already downloaded ${BUILD_DIR}/${FN}-${SYNCER_REV} MD5: ${OLD_MD5}"
|
echo "using already downloaded ${BUILD_DIR}/${FN}-${SYNCER_REV} MD5: ${OLD_MD5}"
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "failed to find download URL for arangosync - aborting!"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
# Log out again:
|
# Log out again:
|
||||||
|
|
||||||
|
@ -771,6 +778,10 @@ if test "${DOWNLOAD_STARTER}" == 1; then
|
||||||
if ! test -f "${BUILD_DIR}/${FN}-${STARTER_REV}"; then
|
if ! test -f "${BUILD_DIR}/${FN}-${STARTER_REV}"; then
|
||||||
rm -f "${FN}"
|
rm -f "${FN}"
|
||||||
curl -LO "${STARTER_URL}"
|
curl -LO "${STARTER_URL}"
|
||||||
|
if ! test -s "${FN}" ; then
|
||||||
|
echo "failed to download starter binary - aborting!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
mv "${FN}" "${BUILD_DIR}/${TN}"
|
mv "${FN}" "${BUILD_DIR}/${TN}"
|
||||||
${MD5} < "${BUILD_DIR}/${TN}" | ${SED} "s; .*;;" > "${BUILD_DIR}/${FN}-${STARTER_REV}"
|
${MD5} < "${BUILD_DIR}/${TN}" | ${SED} "s; .*;;" > "${BUILD_DIR}/${FN}-${STARTER_REV}"
|
||||||
chmod a+x "${BUILD_DIR}/${TN}"
|
chmod a+x "${BUILD_DIR}/${TN}"
|
||||||
|
@ -779,6 +790,9 @@ if test "${DOWNLOAD_STARTER}" == 1; then
|
||||||
else
|
else
|
||||||
echo "using already downloaded ${BUILD_DIR}/${FN}-${STARTER_REV} MD5: ${OLD_MD5}"
|
echo "using already downloaded ${BUILD_DIR}/${FN}-${STARTER_REV} MD5: ${OLD_MD5}"
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "failed to find download URL for arangodb starter - aborting!"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
THIRDPARTY_BIN=("${THIRDPARTY_BIN}${BUILD_DIR}/${TN}")
|
THIRDPARTY_BIN=("${THIRDPARTY_BIN}${BUILD_DIR}/${TN}")
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1481,43 +1481,27 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
||||||
result = send(
|
result = send(
|
||||||
connection.get(), method, conTimeout, url, b.toJson(), "");
|
connection.get(), method, conTimeout, url, b.toJson(), "");
|
||||||
|
|
||||||
if (result.successful()) {
|
// Inquire returns a body like write or if the write is still ongoing
|
||||||
std::shared_ptr<VPackBuilder> bodyBuilder
|
// We check, if the operation is still ongoing then body is {"ongoing:true"}
|
||||||
= VPackParser::fromJson(result._body);
|
// _statusCode can be 200 or 412
|
||||||
VPackSlice outer = bodyBuilder->slice();
|
if (result.successful() || result._statusCode == 412) {
|
||||||
|
std::shared_ptr<VPackBuilder> resultBody
|
||||||
|
= VPackParser::fromJson(result._body);
|
||||||
|
VPackSlice outer = resultBody->slice();
|
||||||
// If the operation is still ongoing, simply ask again later:
|
// If the operation is still ongoing, simply ask again later:
|
||||||
if (outer.isString() && outer.copyString() == "ongoing") {
|
if (outer.isObject() && outer.hasKey("ongoing")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we get an answer, we have to look at it, the condition is
|
// If we get an answer, and it contains a "results" key,
|
||||||
// that we get that our transaction has been logged with a certain
|
// we release the connection and break out of the loop letting the
|
||||||
// positive log index:
|
// inquiry result go to the client. Otherwise try again.
|
||||||
if (outer.isArray() && outer.length() > 0) {
|
if (outer.isObject() && outer.hasKey("results")) {
|
||||||
uint64_t index = 0;
|
VPackSlice results = outer.get("results");
|
||||||
for (auto const& inner : VPackArrayIterator(outer)) {
|
if (results.length() > 0) {
|
||||||
if (inner.isArray() && inner.length() > 0) {
|
|
||||||
for (auto const& i : VPackArrayIterator(inner)) {
|
|
||||||
if (i.isObject()) {
|
|
||||||
VPackSlice indexSlice = i.get("index");
|
|
||||||
if (indexSlice.isInteger()) {
|
|
||||||
index = indexSlice.getUInt();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (index > 0) {
|
|
||||||
LOG_TOPIC(DEBUG, Logger::AGENCYCOMM)
|
LOG_TOPIC(DEBUG, Logger::AGENCYCOMM)
|
||||||
<< body << " succeeded (" << outer.toJson() << ")";
|
<< "Inquired " << resultBody->toJson();
|
||||||
bodyBuilder->clear();
|
AgencyCommManager::MANAGER->release(std::move(connection), endpoint);
|
||||||
{
|
|
||||||
VPackArrayBuilder guard(bodyBuilder.get());
|
|
||||||
bodyBuilder->add(VPackValue(index));
|
|
||||||
}
|
|
||||||
result.set(200, "200 OK", clientId);
|
|
||||||
result._body = bodyBuilder->toJson();
|
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// Nothing known, so do a retry of the original operation:
|
// Nothing known, so do a retry of the original operation:
|
||||||
|
|
|
@ -258,14 +258,17 @@ void Agent::reportIn(std::string const& peerId, index_t index, size_t toLog) {
|
||||||
// Update last acknowledged answer
|
// Update last acknowledged answer
|
||||||
auto t = system_clock::now();
|
auto t = system_clock::now();
|
||||||
std::chrono::duration<double> d = t - _lastAcked[peerId];
|
std::chrono::duration<double> d = t - _lastAcked[peerId];
|
||||||
if (peerId != id() && d.count() > _config.minPing() * _config.timeoutMult()) {
|
auto secsSince = d.count();
|
||||||
LOG_TOPIC(WARN, Logger::AGENCY) << "Last confirmation from peer "
|
if (secsSince < 1.5e9 && peerId != id()
|
||||||
<< peerId << " was received more than minPing ago: " << d.count();
|
&& secsSince > _config.minPing() * _config.timeoutMult()) {
|
||||||
|
LOG_TOPIC(WARN, Logger::AGENCY)
|
||||||
|
<< "Last confirmation from peer " << peerId
|
||||||
|
<< " was received more than minPing ago: " << secsSince;
|
||||||
}
|
}
|
||||||
LOG_TOPIC(DEBUG, Logger::AGENCY) << "Setting _lastAcked["
|
LOG_TOPIC(DEBUG, Logger::AGENCY)
|
||||||
<< peerId << "] to time "
|
<< "Setting _lastAcked[" << peerId << "] to time "
|
||||||
<< std::chrono::duration_cast<std::chrono::microseconds>(
|
<< std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
t.time_since_epoch()).count();
|
t.time_since_epoch()).count();
|
||||||
_lastAcked[peerId] = t;
|
_lastAcked[peerId] = t;
|
||||||
|
|
||||||
if (index > _confirmed[peerId]) { // progress this follower?
|
if (index > _confirmed[peerId]) { // progress this follower?
|
||||||
|
@ -278,7 +281,6 @@ void Agent::reportIn(std::string const& peerId, index_t index, size_t toLog) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
duration<double> reportInTime = system_clock::now() - startTime;
|
duration<double> reportInTime = system_clock::now() - startTime;
|
||||||
if (reportInTime.count() > 0.1) {
|
if (reportInTime.count() > 0.1) {
|
||||||
LOG_TOPIC(DEBUG, Logger::AGENCY)
|
LOG_TOPIC(DEBUG, Logger::AGENCY)
|
||||||
|
@ -945,8 +947,7 @@ trans_ret_t Agent::transient(query_t const& queries) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inquire_ret_t Agent::inquire(query_t const& query) {
|
write_ret_t Agent::inquire(query_t const& query) {
|
||||||
inquire_ret_t ret;
|
|
||||||
|
|
||||||
// Note that we are leading (_constituent.leading()) if and only
|
// Note that we are leading (_constituent.leading()) if and only
|
||||||
// if _constituent.leaderId == our own ID. Therefore, we do not have
|
// if _constituent.leaderId == our own ID. Therefore, we do not have
|
||||||
|
@ -954,45 +955,27 @@ inquire_ret_t Agent::inquire(query_t const& query) {
|
||||||
// look at the leaderID.
|
// look at the leaderID.
|
||||||
auto leader = _constituent.leaderID();
|
auto leader = _constituent.leaderID();
|
||||||
if (leader != id()) {
|
if (leader != id()) {
|
||||||
return inquire_ret_t(false, leader);
|
return write_ret_t(false, leader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write_ret_t ret;
|
||||||
|
|
||||||
_tiLock.assertNotLockedByCurrentThread();
|
_tiLock.assertNotLockedByCurrentThread();
|
||||||
MUTEX_LOCKER(ioLocker, _ioLock);
|
MUTEX_LOCKER(ioLocker, _ioLock);
|
||||||
|
|
||||||
auto si = _state.inquire(query);
|
ret.indices = _state.inquire(query);
|
||||||
|
|
||||||
bool found = false;
|
|
||||||
auto builder = std::make_shared<VPackBuilder>();
|
|
||||||
{
|
|
||||||
VPackArrayBuilder b(builder.get());
|
|
||||||
for (auto const& i : si) {
|
|
||||||
VPackArrayBuilder bb(builder.get());
|
|
||||||
for (auto const& j : i) {
|
|
||||||
found = true;
|
|
||||||
VPackObjectBuilder bbb(builder.get());
|
|
||||||
builder->add("index", VPackValue(j.index));
|
|
||||||
builder->add("term", VPackValue(j.term));
|
|
||||||
builder->add("query", VPackSlice(j.entry->data()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = inquire_ret_t(true, id(), builder);
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check ongoing ones:
|
// Check ongoing ones:
|
||||||
for (auto const& s : VPackArrayIterator(query->slice())) {
|
for (auto const& s : VPackArrayIterator(query->slice())) {
|
||||||
std::string ss = s.copyString();
|
std::string ss = s.copyString();
|
||||||
if (isTrxOngoing(ss)) {
|
if (isTrxOngoing(ss)) {
|
||||||
ret.result->clear();
|
ret.indices.clear();
|
||||||
ret.result->add(VPackValue("ongoing"));
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret.accepted = true;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ class Agent : public arangodb::Thread,
|
||||||
read_ret_t read(query_t const&);
|
read_ret_t read(query_t const&);
|
||||||
|
|
||||||
/// @brief Inquire success of logs given clientIds
|
/// @brief Inquire success of logs given clientIds
|
||||||
inquire_ret_t inquire(query_t const&);
|
write_ret_t inquire(query_t const&);
|
||||||
|
|
||||||
/// @brief Attempt read/write transaction
|
/// @brief Attempt read/write transaction
|
||||||
trans_ret_t transact(query_t const&) override;
|
trans_ret_t transact(query_t const&) override;
|
||||||
|
|
|
@ -508,7 +508,7 @@ RestStatus RestAgencyHandler::handleInquire() {
|
||||||
return RestStatus::DONE;
|
return RestStatus::DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
inquire_ret_t ret;
|
write_ret_t ret;
|
||||||
try {
|
try {
|
||||||
ret = _agent->inquire(query);
|
ret = _agent->inquire(query);
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
|
@ -519,7 +519,22 @@ RestStatus RestAgencyHandler::handleInquire() {
|
||||||
|
|
||||||
if (ret.accepted) { // I am leading
|
if (ret.accepted) { // I am leading
|
||||||
|
|
||||||
generateResult(rest::ResponseCode::OK, ret.result->slice());
|
|
||||||
|
Builder body;
|
||||||
|
bool failed = false;
|
||||||
|
{ VPackObjectBuilder b(&body);
|
||||||
|
if (ret.indices.empty()) {
|
||||||
|
body.add("ongoing", VPackValue(true));
|
||||||
|
} else {
|
||||||
|
body.add(VPackValue("results"));
|
||||||
|
{ VPackArrayBuilder bb(&body);
|
||||||
|
for (auto const& index : ret.indices) {
|
||||||
|
body.add(VPackValue(index));
|
||||||
|
failed = (failed || index == 0);
|
||||||
|
}}}
|
||||||
|
}
|
||||||
|
generateResult(failed ? rest::ResponseCode::PRECONDITION_FAILED :
|
||||||
|
rest::ResponseCode::OK, body.slice());
|
||||||
|
|
||||||
} else { // Redirect to leader
|
} else { // Redirect to leader
|
||||||
|
|
||||||
|
|
|
@ -1250,7 +1250,7 @@ query_t State::allLogs() const {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::vector<log_t>> State::inquire(query_t const& query) const {
|
std::vector<index_t> State::inquire(query_t const& query) const {
|
||||||
if (!query->slice().isArray()) {
|
if (!query->slice().isArray()) {
|
||||||
THROW_ARANGO_EXCEPTION_MESSAGE(
|
THROW_ARANGO_EXCEPTION_MESSAGE(
|
||||||
20001,
|
20001,
|
||||||
|
@ -1258,31 +1258,31 @@ std::vector<std::vector<log_t>> State::inquire(query_t const& query) const {
|
||||||
+ ". We got " + query->toJson());
|
+ ". We got " + query->toJson());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::vector<log_t>> result;
|
std::vector<index_t> result;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
|
|
||||||
MUTEX_LOCKER(mutexLocker, _logLock); // Cannot be read lock (Compaction)
|
MUTEX_LOCKER(mutexLocker, _logLock); // Cannot be read lock (Compaction)
|
||||||
for (auto const& i : VPackArrayIterator(query->slice())) {
|
for (auto const& i : VPackArrayIterator(query->slice())) {
|
||||||
|
|
||||||
if (!i.isString()) {
|
if (!i.isString()) {
|
||||||
THROW_ARANGO_EXCEPTION_MESSAGE(
|
THROW_ARANGO_EXCEPTION_MESSAGE(
|
||||||
210002, std::string("ClientIds must be strings. On position ")
|
210002, std::string("ClientIds must be strings. On position ")
|
||||||
+ std::to_string(pos) + " we got " + i.toJson());
|
+ std::to_string(pos++) + " we got " + i.toJson());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<log_t> transactions;
|
|
||||||
auto ret = _clientIdLookupTable.equal_range(i.copyString());
|
auto ret = _clientIdLookupTable.equal_range(i.copyString());
|
||||||
|
index_t index = 0;
|
||||||
for (auto it = ret.first; it != ret.second; ++it) {
|
for (auto it = ret.first; it != ret.second; ++it) {
|
||||||
if (it->second < _log[0].index) {
|
if (it->second < _log[0].index) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
transactions.push_back(_log.at(it->second-_cur));
|
if (index < _log.at(it->second-_cur).index) {
|
||||||
|
index = _log.at(it->second-_cur).index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
result.push_back(transactions);
|
result.push_back(index);
|
||||||
|
|
||||||
pos++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ class State {
|
||||||
bool has(index_t, term_t) const;
|
bool has(index_t, term_t) const;
|
||||||
|
|
||||||
/// @brief Get log entries by client Id
|
/// @brief Get log entries by client Id
|
||||||
std::vector<std::vector<log_t>> inquire(query_t const&) const;
|
std::vector<index_t> inquire(query_t const&) const;
|
||||||
|
|
||||||
/// @brief Get complete logged commands by lower and upper bounds.
|
/// @brief Get complete logged commands by lower and upper bounds.
|
||||||
/// Default: [first, last]
|
/// Default: [first, last]
|
||||||
|
|
|
@ -527,7 +527,9 @@ void MMFilesLogfileManager::unprepare() {
|
||||||
LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "stopping collector thread";
|
LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "stopping collector thread";
|
||||||
_collectorThread->forceStop();
|
_collectorThread->forceStop();
|
||||||
while (_collectorThread->isRunning()) {
|
while (_collectorThread->isRunning()) {
|
||||||
|
locker.unlock();
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
locker.lock();
|
||||||
}
|
}
|
||||||
delete _collectorThread;
|
delete _collectorThread;
|
||||||
_collectorThread = nullptr;
|
_collectorThread = nullptr;
|
||||||
|
|
|
@ -398,34 +398,16 @@ void AuthInfo::reloadAllUsers() {
|
||||||
|
|
||||||
// tell other coordinators to reload as well
|
// tell other coordinators to reload as well
|
||||||
AgencyComm agency;
|
AgencyComm agency;
|
||||||
|
|
||||||
|
AgencyWriteTransaction incrementVersion({
|
||||||
|
AgencyOperation("Sync/UserVersion", AgencySimpleOperationType::INCREMENT_OP)
|
||||||
|
});
|
||||||
|
|
||||||
int maxTries = 10;
|
int maxTries = 10;
|
||||||
|
|
||||||
while (maxTries-- > 0) {
|
while (maxTries-- > 0) {
|
||||||
AgencyCommResult commRes = agency.getValues("Sync/UserVersion");
|
AgencyCommResult result = agency.sendTransactionWithFailover(incrementVersion);
|
||||||
|
if (result.successful()) {
|
||||||
if (!commRes.successful()) {
|
|
||||||
// Error in communication, note that value not found is not an error
|
|
||||||
LOG_TOPIC(TRACE, Logger::AUTHENTICATION)
|
|
||||||
<< "AuthInfo: no agency communication";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
VPackSlice oldVal = commRes.slice()[0].get(
|
|
||||||
{AgencyCommManager::path(), "Sync", "UserVersion"});
|
|
||||||
|
|
||||||
if (!oldVal.isInteger()) {
|
|
||||||
LOG_TOPIC(ERR, Logger::AUTHENTICATION)
|
|
||||||
<< "Sync/UserVersion is not a number";
|
|
||||||
THROW_ARANGO_EXCEPTION(TRI_ERROR_BAD_PARAMETER);
|
|
||||||
}
|
|
||||||
|
|
||||||
VPackBuilder newVal;
|
|
||||||
newVal.add(VPackValue(oldVal.getUInt() + 1));
|
|
||||||
commRes =
|
|
||||||
agency.casValue("Sync/UserVersion", oldVal, newVal.slice(), 0.0,
|
|
||||||
AgencyCommManager::CONNECTION_OPTIONS._requestTimeout);
|
|
||||||
|
|
||||||
if (commRes.successful()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2912,4 +2912,4 @@ var cutByResolution = function (str) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="workMonitorContent" class="innerContent">
|
<div id="workMonitorContent" class="innerContent">
|
||||||
</div></script></head><body><nav class="navbar" style="display: none"><div class="primary"><div class="navlogo"><a class="logo big" href="#"><img id="ArangoDBLogo" class="arangodbLogo" src="img/arangodb-edition-optimized.svg"></a><a class="logo small" href="#"><img class="arangodbLogo" src="img/arangodb_logo_small.png"></a><a class="version"><span id="currentVersion"></span></a></div><div class="statmenu" id="statisticBar"></div><div class="navmenu" id="navigationBar"></div></div></nav><div id="modalPlaceholder"></div><div class="bodyWrapper" style="display: none"><div class="centralRow"><div id="navbar2" class="navbarWrapper secondary"><div class="subnavmenu" id="subNavigationBar"></div></div><div class="resizecontainer contentWrapper"><div id="loadingScreen" class="loadingScreen" style="display: none"><i class="fa fa-circle-o-notch fa-spin fa-3x fa-fw margin-bottom"></i> <span class="sr-only">Loading...</span></div><div id="content" class="centralContent"></div><footer class="footer"><div id="footerBar"></div></footer></div></div></div><div id="progressPlaceholder" style="display:none"></div><div id="spotlightPlaceholder" style="display:none"></div><div id="graphSettingsContent" style="display: none"></div><div id="filterSelectDiv" style="display:none"></div><div id="offlinePlaceholder" style="display:none"><div class="offline-div"><div class="pure-u"><div class="pure-u-1-4"></div><div class="pure-u-1-2 offline-window"><div class="offline-header"><h3>You have been disconnected from the server</h3></div><div class="offline-body"><p>The connection to the server has been lost. The server may be under heavy load.</p><p>Trying to reconnect in <span id="offlineSeconds">10</span> seconds.</p><p class="animation_state"><span><button class="button-success">Reconnect now</button></span></p></div></div><div class="pure-u-1-4"></div></div></div></div><div class="arangoFrame" style=""><div class="outerDiv"><div class="innerDiv"></div></div></div><script src="libs.js?version=1511375069738"></script><script src="app.js?version=1511375069738"></script></body></html>
|
</div></script></head><body><nav class="navbar" style="display: none"><div class="primary"><div class="navlogo"><a class="logo big" href="#"><img id="ArangoDBLogo" class="arangodbLogo" src="img/arangodb-edition-optimized.svg"></a><a class="logo small" href="#"><img class="arangodbLogo" src="img/arangodb_logo_small.png"></a><a class="version"><span id="currentVersion"></span></a></div><div class="statmenu" id="statisticBar"></div><div class="navmenu" id="navigationBar"></div></div></nav><div id="modalPlaceholder"></div><div class="bodyWrapper" style="display: none"><div class="centralRow"><div id="navbar2" class="navbarWrapper secondary"><div class="subnavmenu" id="subNavigationBar"></div></div><div class="resizecontainer contentWrapper"><div id="loadingScreen" class="loadingScreen" style="display: none"><i class="fa fa-circle-o-notch fa-spin fa-3x fa-fw margin-bottom"></i> <span class="sr-only">Loading...</span></div><div id="content" class="centralContent"></div><footer class="footer"><div id="footerBar"></div></footer></div></div></div><div id="progressPlaceholder" style="display:none"></div><div id="spotlightPlaceholder" style="display:none"></div><div id="graphSettingsContent" style="display: none"></div><div id="filterSelectDiv" style="display:none"></div><div id="offlinePlaceholder" style="display:none"><div class="offline-div"><div class="pure-u"><div class="pure-u-1-4"></div><div class="pure-u-1-2 offline-window"><div class="offline-header"><h3>You have been disconnected from the server</h3></div><div class="offline-body"><p>The connection to the server has been lost. The server may be under heavy load.</p><p>Trying to reconnect in <span id="offlineSeconds">10</span> seconds.</p><p class="animation_state"><span><button class="button-success">Reconnect now</button></span></p></div></div><div class="pure-u-1-4"></div></div></div></div><div class="arangoFrame" style=""><div class="outerDiv"><div class="innerDiv"></div></div></div><script src="libs.js?version=1511485026250"></script><script src="app.js?version=1511485026250"></script></body></html>
|
Binary file not shown.
|
@ -259,7 +259,7 @@ function agencyTestSuite () {
|
||||||
assertEqual(readAndCheck([["/a"]]), [{a:13}]);
|
assertEqual(readAndCheck([["/a"]]), [{a:13}]);
|
||||||
var res = accessAgency("write", [[{"/a":14},{"/a":12}]]); // fail precond {a:12}
|
var res = accessAgency("write", [[{"/a":14},{"/a":12}]]); // fail precond {a:12}
|
||||||
assertEqual(res.statusCode, 412);
|
assertEqual(res.statusCode, 412);
|
||||||
assertEqual(res.bodyParsed, {"results":[0]});
|
assertEqual(res.bodyParsed, {"results":[0]});
|
||||||
writeAndCheck([[{a:{op:"delete"}}]]);
|
writeAndCheck([[{a:{op:"delete"}}]]);
|
||||||
// fail precond oldEmpty
|
// fail precond oldEmpty
|
||||||
res = accessAgency("write",[[{"a":14},{"a":{"oldEmpty":false}}]]);
|
res = accessAgency("write",[[{"a":14},{"a":{"oldEmpty":false}}]]);
|
||||||
|
@ -415,163 +415,83 @@ function agencyTestSuite () {
|
||||||
|
|
||||||
testClientIds : function () {
|
testClientIds : function () {
|
||||||
var res;
|
var res;
|
||||||
|
var cur;
|
||||||
|
|
||||||
|
res = accessAgency("write", [[{"a":12}]]).bodyParsed;
|
||||||
|
cur = res.results[0];
|
||||||
|
|
||||||
|
writeAndCheck([[{"/a":12}]]);
|
||||||
var id = [guid(),guid(),guid(),guid(),guid(),guid(),
|
var id = [guid(),guid(),guid(),guid(),guid(),guid(),
|
||||||
guid(),guid(),guid(),guid(),guid(),guid(),
|
guid(),guid(),guid(),guid(),guid(),guid(),
|
||||||
guid(),guid(),guid()];
|
guid(),guid(),guid()];
|
||||||
var query = [{"a":12},{"a":13},{"a":13}];
|
var query = [{"a":12},{"a":13},{"a":13}];
|
||||||
var pre = [{},{"a":12},{"a":12}];
|
var pre = [{},{"a":12},{"a":12}];
|
||||||
|
cur += 2;
|
||||||
|
|
||||||
writeAndCheck([[query[0], pre[0], id[0]]]);
|
var wres = writeAndCheck([[query[0], pre[0], id[0]]]);
|
||||||
res = accessAgency("inquire",[id[0]]).bodyParsed;
|
res = accessAgency("inquire",[id[0]]).bodyParsed;
|
||||||
assertEqual(res.length, 1);
|
assertEqual(res, {"results":[cur]});
|
||||||
assertEqual(res[0].length, 1);
|
assertEqual(res, wres);
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
|
|
||||||
writeAndCheck([[query[1], pre[1], id[0]]]);
|
wres = writeAndCheck([[query[1], pre[1], id[0]]]);
|
||||||
res = accessAgency("inquire",[id[0]]).bodyParsed;
|
res = accessAgency("inquire",[id[0]]).bodyParsed;
|
||||||
assertEqual(res.length, 1);
|
assertEqual(res, {"results":[++cur]});
|
||||||
assertEqual(res[0].length, 2);
|
assertEqual(res, wres);
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
assertEqual(res[0][1].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("write",[[query[1], pre[1], id[2]]]);
|
wres = accessAgency("write",[[query[1], pre[1], id[2]]]);
|
||||||
assertEqual(res.statusCode,412);
|
assertEqual(wres.statusCode,412);
|
||||||
res = accessAgency("inquire",[id[2]]).bodyParsed;
|
res = accessAgency("inquire",[id[2]]);
|
||||||
assertEqual(res[0].length, 0);
|
assertEqual(res.bodyParsed, {"results":[0]});
|
||||||
|
assertEqual(res, wres);
|
||||||
|
|
||||||
res = accessAgency("write",[[query[0], pre[0], id[3]],
|
wres = accessAgency("write",[[query[0], pre[0], id[3]],
|
||||||
[query[1], pre[1], id[3]]]);
|
[query[1], pre[1], id[3]]]);
|
||||||
|
assertEqual(wres.statusCode,200);
|
||||||
|
cur += 2;
|
||||||
|
res = accessAgency("inquire",[id[3]]);
|
||||||
|
assertEqual(res.bodyParsed, {"results":[cur]});
|
||||||
|
assertEqual(res.bodyParsed.results[0], wres.bodyParsed.results[1]);
|
||||||
assertEqual(res.statusCode,200);
|
assertEqual(res.statusCode,200);
|
||||||
res = accessAgency("inquire",[id[3]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 1);
|
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
assertEqual(res[0][1].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("write",[[query[0], pre[0], id[4]],
|
|
||||||
[query[1], pre[1], id[4]],
|
|
||||||
[query[2], pre[2], id[4]]]);
|
|
||||||
assertEqual(res.statusCode,412);
|
|
||||||
res = accessAgency("inquire",[id[4]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 1);
|
|
||||||
assertEqual(res[0].length, 2);
|
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
assertEqual(res[0][1].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("write",[[query[0], pre[0], id[5]],
|
|
||||||
[query[2], pre[2], id[5]],
|
|
||||||
[query[1], pre[1], id[5]]]);
|
|
||||||
assertEqual(res.statusCode,412);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[5]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 1);
|
wres = accessAgency("write",[[query[0], pre[0], id[4]],
|
||||||
assertEqual(res[0].length, 2);
|
[query[1], pre[1], id[4]],
|
||||||
assertEqual(res[0][0].query, query[0]);
|
[query[2], pre[2], id[4]]]);
|
||||||
assertEqual(res[0][1].query, query[1]);
|
assertEqual(wres.statusCode,412);
|
||||||
|
cur += 2;
|
||||||
|
res = accessAgency("inquire",[id[4]]);
|
||||||
|
assertEqual(res.bodyParsed, {"results":[cur]});
|
||||||
|
assertEqual(res.bodyParsed.results[0], wres.bodyParsed.results[1]);
|
||||||
|
assertEqual(res.statusCode,200);
|
||||||
|
|
||||||
res = accessAgency("write",[[query[2], pre[2], id[6]],
|
wres = accessAgency("write",[[query[0], pre[0], id[5]],
|
||||||
[query[0], pre[0], id[6]],
|
[query[2], pre[2], id[5]],
|
||||||
[query[1], pre[1], id[6]]]);
|
[query[1], pre[1], id[5]]]);
|
||||||
assertEqual(res.statusCode,412);
|
assertEqual(wres.statusCode,412);
|
||||||
res = accessAgency("inquire",[id[6]]).bodyParsed;
|
cur += 2;
|
||||||
assertEqual(res.length, 1);
|
res = accessAgency("inquire",[id[5]]);
|
||||||
assertEqual(res[0].length, 2);
|
assertEqual(res.bodyParsed, {"results":[cur]});
|
||||||
assertEqual(res[0][0].query, query[0]);
|
assertEqual(res.bodyParsed.results[0], wres.bodyParsed.results[1]);
|
||||||
assertEqual(res[0][1].query, query[1]);
|
assertEqual(res.statusCode,200);
|
||||||
|
|
||||||
res = accessAgency("write",[[query[2], pre[2], id[7]],
|
wres = accessAgency("write",[[query[2], pre[2], id[6]],
|
||||||
|
[query[0], pre[0], id[6]],
|
||||||
|
[query[1], pre[1], id[6]]]);
|
||||||
|
assertEqual(wres.statusCode,412);
|
||||||
|
cur += 2;
|
||||||
|
res = accessAgency("inquire",[id[6]]);
|
||||||
|
assertEqual(res.bodyParsed, {"results":[cur]});
|
||||||
|
assertEqual(res.bodyParsed.results[0], wres.bodyParsed.results[2]);
|
||||||
|
assertEqual(res.statusCode,200);
|
||||||
|
|
||||||
|
wres = accessAgency("write",[[query[2], pre[2], id[7]],
|
||||||
[query[0], pre[0], id[8]],
|
[query[0], pre[0], id[8]],
|
||||||
[query[1], pre[1], id[9]]]);
|
[query[1], pre[1], id[9]]]);
|
||||||
assertEqual(res.statusCode,412);
|
assertEqual(res.statusCode,200);
|
||||||
res = accessAgency("inquire",[id[7],id[8],id[9]]).bodyParsed;
|
cur += 2;
|
||||||
assertEqual(res.length, 3);
|
res = accessAgency("inquire",[id[7],id[8],id[9]]);
|
||||||
assertEqual(res[0].length, 0);
|
assertEqual(res, wres);
|
||||||
assertEqual(res[1].length, 1);
|
|
||||||
assertEqual(res[1][0].query, query[0]);
|
|
||||||
assertEqual(res[2].length, 1);
|
|
||||||
assertEqual(res[2][0].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[9],id[7],id[8]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 1);
|
|
||||||
assertEqual(res[0][0].query, query[1]);
|
|
||||||
assertEqual(res[1].length, 0);
|
|
||||||
assertEqual(res[2].length, 1);
|
|
||||||
assertEqual(res[2][0].query, query[0]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[8],id[9],id[7]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 1);
|
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
assertEqual(res[1].length, 1);
|
|
||||||
assertEqual(res[1][0].query, query[1]);
|
|
||||||
assertEqual(res[2].length, 0);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[7],id[9],id[8]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 0);
|
|
||||||
assertEqual(res[1].length, 1);
|
|
||||||
assertEqual(res[1][0].query, query[1]);
|
|
||||||
assertEqual(res[2].length, 1);
|
|
||||||
assertEqual(res[2][0].query, query[0]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[8],id[7],id[9]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 1);
|
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
assertEqual(res[1].length, 0);
|
|
||||||
assertEqual(res[2].length, 1);
|
|
||||||
assertEqual(res[2][0].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[7],id[8],id[9]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 0);
|
|
||||||
assertEqual(res[1].length, 1);
|
|
||||||
assertEqual(res[1][0].query, query[0]);
|
|
||||||
assertEqual(res[2].length, 1);
|
|
||||||
assertEqual(res[2][0].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[7],id[8],id[9]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 0);
|
|
||||||
assertEqual(res[1].length, 1);
|
|
||||||
assertEqual(res[1][0].query, query[0]);
|
|
||||||
assertEqual(res[2].length, 1);
|
|
||||||
assertEqual(res[2][0].query, query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("write",[[query[2], pre[2], id[10]],
|
|
||||||
[query[0], pre[0], id[11]],
|
|
||||||
[query[1], pre[1], id[12]],
|
|
||||||
[query[0], pre[0], id[12]]]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[10],id[11],id[12]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 3);
|
|
||||||
assertEqual(res[0].length, 0);
|
|
||||||
assertEqual(res[1].length, 1);
|
|
||||||
assertEqual(res[1][0].query, query[0]);
|
|
||||||
assertEqual(res[2].length, 2);
|
|
||||||
assertEqual(res[2][0].query, query[1]);
|
|
||||||
assertEqual(res[2][1].query, query[0]);
|
|
||||||
|
|
||||||
res = accessAgency("transact",[[query[0], pre[0], id[13]],
|
|
||||||
[query[2], pre[2], id[13]],
|
|
||||||
[query[1], pre[1], id[13]],
|
|
||||||
["a"]]);
|
|
||||||
|
|
||||||
|
|
||||||
assertEqual(res.statusCode,412);
|
|
||||||
assertEqual(res.bodyParsed.length, 4);
|
|
||||||
assertEqual(res.bodyParsed[0] > 0, true);
|
|
||||||
assertEqual(res.bodyParsed[1] > 0, true);
|
|
||||||
assertEqual(res.bodyParsed[2], {a : 13});
|
|
||||||
assertEqual(res.bodyParsed[3], query[1]);
|
|
||||||
|
|
||||||
res = accessAgency("inquire",[id[13]]).bodyParsed;
|
|
||||||
assertEqual(res.length, 1);
|
|
||||||
assertEqual(res[0].length, 2);
|
|
||||||
assertEqual(res[0][0].query, query[0]);
|
|
||||||
assertEqual(res[0][1].query, query[2]);
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
@ -1045,7 +965,6 @@ function agencyTestSuite () {
|
||||||
writeAndCheck(huge);
|
writeAndCheck(huge);
|
||||||
assertEqual(readAndCheck([["a"]]), [{"a":20000}]);
|
assertEqual(readAndCheck([["a"]]), [{"a":20000}]);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue