1
0
Fork 0

Merge branch 'devel' of https://github.com/arangodb/arangodb into devel

This commit is contained in:
Simon Grätzer 2017-05-10 14:54:46 +02:00
commit 5464763c8e
19 changed files with 73 additions and 75 deletions

View File

@ -565,7 +565,7 @@ int ContinuousSyncer::processDocument(TRI_replication_operation_e type,
return TRI_ERROR_REPLICATION_UNEXPECTED_TRANSACTION;
}
trx->addCollectionAtRuntime(cid, "", AccessMode::Type::WRITE);
trx->addCollectionAtRuntime(cid, "", AccessMode::Type::EXCLUSIVE);
int res = applyCollectionDumpMarker(*trx, trx->name(cid), type, old, doc, errorMsg);
if (res == TRI_ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED && isSystem) {
@ -580,7 +580,7 @@ int ContinuousSyncer::processDocument(TRI_replication_operation_e type,
// standalone operation
// update the apply tick for all standalone operations
SingleCollectionTransaction trx(transaction::StandaloneContext::Create(_vocbase),
cid, AccessMode::Type::WRITE);
cid, AccessMode::Type::EXCLUSIVE);
if (_supportsSingleOperations) {
trx.addHint(transaction::Hints::Hint::SINGLE_OPERATION);

View File

@ -735,7 +735,7 @@ int InitialSyncer::handleCollectionDump(arangodb::LogicalCollection* col,
if (res.ok()) {
SingleCollectionTransaction trx(
transaction::StandaloneContext::Create(_vocbase), col->cid(),
AccessMode::Type::WRITE);
AccessMode::Type::EXCLUSIVE);
res = trx.begin();
@ -937,7 +937,7 @@ int InitialSyncer::handleCollectionSync(arangodb::LogicalCollection* col,
// remote collection has no documents. now truncate our local collection
SingleCollectionTransaction trx(
transaction::StandaloneContext::Create(_vocbase), col->cid(),
AccessMode::Type::WRITE);
AccessMode::Type::EXCLUSIVE);
Result res = trx.begin();
@ -1095,7 +1095,7 @@ int InitialSyncer::handleCollection(VPackSlice const& parameters,
SingleCollectionTransaction trx(
transaction::StandaloneContext::Create(_vocbase), col->cid(),
AccessMode::Type::WRITE);
AccessMode::Type::EXCLUSIVE);
Result res = trx.begin();
@ -1212,7 +1212,7 @@ int InitialSyncer::handleCollection(VPackSlice const& parameters,
try {
SingleCollectionTransaction trx(
transaction::StandaloneContext::Create(_vocbase), col->cid(),
AccessMode::Type::WRITE);
AccessMode::Type::EXCLUSIVE);
res = trx.begin();

View File

@ -236,6 +236,7 @@ DatabaseFeature::DatabaseFeature(ApplicationServer* server)
setOptional(false);
requiresElevatedPrivileges(false);
startsAfter("Authentication");
startsAfter("CacheManager");
startsAfter("DatabasePath");
startsAfter("EngineSelector");
startsAfter("MMFilesLogfileManager");
@ -243,6 +244,7 @@ DatabaseFeature::DatabaseFeature(ApplicationServer* server)
startsAfter("MMFilesEngine");
startsAfter("MMFilesPersistentIndex");
startsAfter("RocksDBEngine");
startsAfter("Scheduler");
}
DatabaseFeature::~DatabaseFeature() {

View File

@ -138,10 +138,6 @@ int RocksDBComparator::compareIndexedValues(VPackSlice const& lhs,
size_t const rLength = rhs.length();
size_t const n = lLength < rLength ? rLength : lLength;
// LOG_TOPIC(ERR, Logger::FIXME) << "COMPARING INDEX VALUES: " << lhs.toJson()
// << "; " << rhs.toJson() << "; LLENGTH: " << lLength << ", RLENGTH: " <<
// rLength << ", N: " << n;
for (size_t i = 0; i < n; ++i) {
int res = arangodb::basics::VelocyPackHelper::compare(
(i < lLength ? lhs[i] : VPackSlice::noneSlice()),

View File

@ -117,10 +117,6 @@ RocksDBEntryType RocksDBKey::type(RocksDBKey const& key) {
return type(key._buffer.data(), key._buffer.size());
}
RocksDBEntryType RocksDBKey::type(rocksdb::Slice const& slice) {
return type(slice.data(), slice.size());
}
uint64_t RocksDBKey::counterObjectId(rocksdb::Slice const& s) {
TRI_ASSERT(s.size() >= (sizeof(char) + sizeof(uint64_t)));
return uint64FromPersistent(s.data() + sizeof(char));
@ -351,12 +347,6 @@ RocksDBKey::RocksDBKey(RocksDBEntryType type, uint64_t first,
// ====================== Private Methods ==========================
RocksDBEntryType RocksDBKey::type(char const* data, size_t size) {
TRI_ASSERT(data != nullptr);
TRI_ASSERT(size >= sizeof(char));
return static_cast<RocksDBEntryType>(data[0]);
}
TRI_voc_tick_t RocksDBKey::databaseId(char const* data, size_t size) {
TRI_ASSERT(data != nullptr);
TRI_ASSERT(size >= sizeof(char));

View File

@ -142,7 +142,10 @@ class RocksDBKey {
/// May be called on any valid key (in our keyspace)
//////////////////////////////////////////////////////////////////////////////
static RocksDBEntryType type(RocksDBKey const&);
static RocksDBEntryType type(rocksdb::Slice const&);
static inline RocksDBEntryType type(rocksdb::Slice const& slice) {
return type(slice.data(), slice.size());
}
//////////////////////////////////////////////////////////////////////////////
/// @brief Extracts the object id
@ -249,7 +252,12 @@ class RocksDBKey {
arangodb::StringRef const& third);
private:
static RocksDBEntryType type(char const* data, size_t size);
static inline RocksDBEntryType type(char const* data, size_t size) {
TRI_ASSERT(data != nullptr);
TRI_ASSERT(size >= sizeof(char));
return static_cast<RocksDBEntryType>(data[0]);
}
static TRI_voc_tick_t databaseId(char const* data, size_t size);
static TRI_voc_cid_t collectionId(char const* data, size_t size);
static TRI_voc_cid_t objectId(char const* data, size_t size);

View File

@ -221,7 +221,7 @@ bool Scheduler::start(ConditionVariable* cv) {
TRI_ASSERT(_nrMinimum <= _nrDesired);
TRI_ASSERT(_nrDesired <= _nrMaximum);
for (size_t i = 0; i < (size_t)_nrMinimum; ++i) {
for (uint64_t i = 0; i < _nrMinimum; ++i) {
startNewThread();
}

View File

@ -121,29 +121,29 @@ class Scheduler {
std::atomic<bool> _stopping;
// maximal number of outstanding user requests
int64_t const _maxQueueSize;
uint64_t const _maxQueueSize;
// minimum number of running SchedulerThreads
int64_t const _nrMinimum;
uint64_t const _nrMinimum;
// desired number of running SchedulerThreads
int64_t const _nrDesired;
uint64_t const _nrDesired;
// maximal number of outstanding user requests
int64_t const _nrMaximum;
uint64_t const _nrMaximum;
// number of jobs currently been worked on
// use signed values just in case we have an underflow
std::atomic<int64_t> _nrWorking;
std::atomic<uint64_t> _nrWorking;
// number of jobs that are currently been queued, but not worked on
std::atomic<int64_t> _nrQueued;
std::atomic<uint64_t> _nrQueued;
// number of jobs that entered a potentially blocking situation
std::atomic<int64_t> _nrBlocked;
std::atomic<uint64_t> _nrBlocked;
// number of SchedulerThread that are running
std::atomic<int64_t> _nrRunning;
std::atomic<uint64_t> _nrRunning;
std::unique_ptr<JobQueue> _jobQueue;

View File

@ -52,7 +52,6 @@ SchedulerFeature::SchedulerFeature(
: ApplicationFeature(server, "Scheduler"), _scheduler(nullptr) {
setOptional(true);
requiresElevatedPrivileges(false);
startsAfter("Database");
startsAfter("FileDescriptors");
startsAfter("Logger");
startsAfter("WorkMonitor");
@ -260,10 +259,10 @@ bool CtrlHandler(DWORD eventType) {
void SchedulerFeature::buildScheduler() {
_scheduler =
std::make_unique<Scheduler>(static_cast<uint64_t>(_nrMinimalThreads),
static_cast<uint64_t>(_nrServerThreads),
static_cast<uint64_t>(_nrMaximalThreads),
static_cast<uint64_t>(_queueSize));
std::make_unique<Scheduler>(_nrMinimalThreads,
_nrServerThreads,
_nrMaximalThreads,
_queueSize);
SCHEDULER = _scheduler.get();
}

View File

@ -78,6 +78,7 @@ class StorageEngine : public application_features::ApplicationFeature {
// storage engines must not use elevated privileges for files etc
requiresElevatedPrivileges(false);
startsAfter("CacheManager");
startsAfter("DatabasePath");
startsAfter("EngineSelector");
startsAfter("FileDescriptors");

File diff suppressed because one or more lines are too long

View File

@ -420,13 +420,13 @@
<div id="requests">
<div class="contentDiv">
<div class="dashboard-row pure-u"> <% largeChart("requestsChart", "Requests per Second") %> <% tendency("Request Types", "asyncRequests", false); %> <% tendency("Number of Client Connections", "clientConnections", false); %> </div>
<div class="dashboard-row pure-u cluster-values" id="node-info" style="width: 100%; margin-top: 0; padding-right: 2px; box-sizing: border-box;">
</div> <% if (hideStatistics !== true) { %> <div class="dashboard-row pure-u"> <% largeChart("requestsChart", "Requests per Second") %> <% tendency("Request Types", "asyncRequests", false); %> <% tendency("Number of Client Connections", "clientConnections", false); %> </div>
<div class="dashboard-row pure-u small-label-padding"> <% largeChart("dataTransferChart", "Transfer Size per Second") %> <% smallChart("dataTransferDistribution", "Transfer Size per Second (distribution)", false) %> </div>
<div class="dashboard-row pure-u small-label-padding"> <% largeChart("totalTimeChart", "Average Request Time (seconds)") %> <% smallChart("totalTimeDistribution", "Average Request Time (distribution)", false) %> </div>
</div>
</div>
</div> <% } %> </div>
<div id="system" class="tendency-box-sizing" style="display: none";>
@ -2161,21 +2161,18 @@ if (list.length > 0) {
<div class="pure-g cluster-nodes-title pure-table pure-table-header pure-title" style="clear: both">
<div class="pure-table-row">
<div class="pure-u-9-24 left">Name</div>
<div class="pure-u-9-24 left">Endpoint</div>
<div class="pure-u-2-24 mid hide-small">Since</div>
<div class="pure-u-2-24 mid">Info</div>
<div class="pure-u-2-24 mid">Status</div>
<div class="pure-u-10-24 left">Name</div>
<div class="pure-u-10-24 left">Endpoint</div>
<div class="pure-u-3-24 mid hide-small">Since</div>
<div class="pure-u-1-24 mid"></div>
</div>
</div>
<div class="pure-g cluster-nodes coords-nodes pure-table pure-table-body"> <% _.each(coords, function(node, name) { %> <% var id = name + "-node"; %> <div class="pure-table-row <%= disabled %>" node="<%= id %>">
<div class="pure-u-9-24 left"> <%= node.ShortName %> <i class="fa fa-bar-chart"></i> <% if(node.Status === 'FAILED') { %> <i class="fa fa-trash-o"></i> <% } %> </div>
<div class="pure-u-9-24 left"><%= node.Endpoint %></div> <% var formatted = (node.LastHeartbeatAcked).substr(11, 18).slice(0, -1); %> <div class="pure-u-2-24 hide-small mid"><%= formatted %></div>
<div class="pure-u-2-24 mid"><i class="fa fa-info-circle"></i></div> <% if(node.Status === 'GOOD') { %> <div class="pure-u-2-24 mid state"><i class="fa fa-check-circle tippy" title="<%= node.LastHeartbeatStatus %>"></i></div> <% } else { %> <div class="pure-u-2-24 mid state"><i class="fa fa-exclamation-circle"></i></div> <% } %> </div> <% }); %> </div>
</div> <% } %> <% if (Object.keys(dbs).length > 0) { %> <% var disabled = ''; %> <% disabled = " disabled"; %> <div class="pure-u-1-1 pure-u-md-1-1 pure-u-lg-1-1 pure-u-xl-1-2">
<div class="pure-u-10-24 left"> <%= node.ShortName %> <i class="fa fa-bar-chart"></i> <% if(node.Status === 'FAILED') { %> <i class="fa fa-trash-o"></i> <% } %> </div>
<div class="pure-u-10-24 left"><%= node.Endpoint %></div> <% var formatted = (node.LastHeartbeatAcked).substr(11, 18).slice(0, -1); %> <div class="pure-u-3-24 hide-small mid"><%= formatted %></div> <% if(node.Status === 'GOOD') { %> <div class="pure-u-1-24 mid state"><i class="fa fa-check-circle tippy" title="<%= node.LastHeartbeatStatus %>"></i></div> <% } else { %> <div class="pure-u-1-24 mid state"><i class="fa fa-exclamation-circle"></i></div> <% } %> </div> <% }); %> </div>
</div> <% } %> <% if (Object.keys(dbs).length > 0) { %> <% var disabled = ''; %> <% disabled = " dbserver"; %> <div class="pure-u-1-1 pure-u-md-1-1 pure-u-lg-1-1 pure-u-xl-1-2">
<div class="sectionHeader pure-g">
<div class="pure-u-1-5">
<div class="title">
@ -2199,18 +2196,15 @@ if (list.length > 0) {
<div class="pure-g cluster-nodes-title pure-table pure-table-header pure-title">
<div class="pure-table-row">
<div class="pure-u-9-24 left">Name</div>
<div class="pure-u-9-24 left">Endpoint</div>
<div class="pure-u-2-24 mid hide-small">Since</div>
<div class="pure-u-2-24 mid">Info</div>
<div class="pure-u-2-24 mid">Status</div>
<div class="pure-u-10-24 left">Name</div>
<div class="pure-u-10-24 left">Endpoint</div>
<div class="pure-u-3-24 mid hide-small">Since</div>
<div class="pure-u-1-24 mid"></div>
</div>
</div> <% } %> <div class="pure-g cluster-nodes dbs-nodes pure-table pure-table-body"> <% _.each(dbs, function(node, name) { %> <% var id = name + "-node"; %> <div class="pure-table-row <%= disabled %>" node="<%= id %>">
<div class="pure-u-9-24 left"><%= node.ShortName %></div>
<div class="pure-u-9-24 left"><%= node.Endpoint %></div> <% var formatted = (node.LastHeartbeatAcked).substr(11, 18).slice(0, -1); %> <div class="pure-u-2-24 mid hide-small"><%= formatted %></div>
<div class="pure-u-2-24 mid"><i class="fa fa-info-circle"></i></div> <% if(node.Status === 'GOOD') { %> <div class="pure-u-2-24 mid state"><i class="fa fa-check-circle tippy" title="<%= node.LastHeartbeatStatus %>"></i></div> <% } else { %> <div class="pure-u-2-24 mid state"><i class="fa fa-exclamation-circle"></i></div> <% } %> </div> <% }); %> </div>
<div class="pure-u-10-24 left"><%= node.ShortName %></div>
<div class="pure-u-10-24 left"><%= node.Endpoint %></div> <% var formatted = (node.LastHeartbeatAcked).substr(11, 18).slice(0, -1); %> <div class="pure-u-3-24 mid hide-small"><%= formatted %></div> <% if(node.Status === 'GOOD') { %> <div class="pure-u-1-24 mid state"><i class="fa fa-check-circle tippy" title="<%= node.LastHeartbeatStatus %>"></i></div> <% } else { %> <div class="pure-u-1-24 mid state"><i class="fa fa-exclamation-circle"></i></div> <% } %> </div> <% }); %> </div>
</div>
</div>
@ -2785,4 +2779,4 @@ var cutByResolution = function (str) {
</div>
<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=1493730160275"></script><script src="app.js?version=1493730160275"></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=1494419319160"></script><script src="app.js?version=1494419319160"></script></body></html>

File diff suppressed because one or more lines are too long

View File

@ -624,7 +624,7 @@ function ReplicationSuite() {
assertTrue(replication.applier.state().state.running);
return "wait";
} catch (err) {
// task does not exist. we're done
// task does not exist anymore. we're done
state.lastLogTick = replication.logger.state().state.lastLogTick;
state.checksum = collectionChecksum(cn);
state.count = collectionCount(cn);

View File

@ -32,6 +32,8 @@
#include <rocksdb/options.h>
#include <thread>
using namespace arangodb;
using namespace arangodb::application_features;
using namespace arangodb::options;
@ -71,9 +73,15 @@ RocksDBOptionFeature::RocksDBOptionFeature(
_useDirectWrites(rocksDBDefaults.use_direct_writes),
_useFSync(rocksDBDefaults.use_fsync),
_skipCorrupted(false) {
setOptional(true);
requiresElevatedPrivileges(false);
startsAfter("DatabasePath");
// increase parallelism and re-fetch the number of threads
rocksDBDefaults.IncreaseParallelism(std::thread::hardware_concurrency());
_numThreadsHigh = rocksDBDefaults.max_background_flushes;
_numThreadsLow = rocksDBDefaults.max_background_compactions;
}
void RocksDBOptionFeature::collectOptions(