1
0
Fork 0

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

This commit is contained in:
Michael Hackstein 2017-04-26 18:32:38 +02:00
commit 5ef52aefe8
24 changed files with 584 additions and 338 deletions

View File

@ -1,9 +1,11 @@
devel
-----
* --server.maximal-queue-size is now an absolute maximum. If the queue is
* `--server.maximal-queue-size` is now an absolute maximum. If the queue is
full, then 503 is returned. Setting it to 0 means "no limit".
* (Enterprise only) added authentication against a LDAP server
v3.2.alpha4 (2017-04-25)
------------------------

View File

@ -5,60 +5,200 @@ The following list shows in detail which features have been added or improved in
ArangoDB 3.2. ArangoDB 3.2 also contains several bugfixes that are not listed
here.
SmartGraphs
-----------
Memory management
-----------------
Data format
-----------
* added startup options `--vm.resident-limit` and `--vm.path` for file-backed
memory mapping after reaching a configurable maximum RAM size
This prevents ArangoDB from using all available RAM when using large datasets.
This will also lower the chances of the arangod process being killed by the
operation system's OOM killer.
Note: these options are only available in all builds and environments.
* make arangod start with less V8 JavaScript contexts
This speeds up the server start and makes arangod use less memory at start.
Whenever a V8 context is needed by a Foxx action or some other JavaScript operation
and there is no usable V8 context, a new context will be created dynamically now.
Up to `--javascript.v8-contexts` V8 contexts will be created, so this option
will change its meaning. Previously as many V8 contexts as specified by this
option were created at server start, and the number of V8 contexts did not
change at runtime. Now up to this number of V8 contexts will be in use at the
same time, but the actual number of V8 contexts is dynamic.
The garbage collector thread will automatically delete unused V8 contexts after
a while. The number of spare contexts will go down to as few as configured in
the new option `--javascript.v8-contexts-minimum`. Actually that many V8 contexts
are also created at server start.
The first few requests in new V8 contexts may take longer than in contexts
that have been there already. Performance may therefore suffer a bit for the
initial requests sent to ArangoDB or when there are only few but performance-
critical situations in which new V8 contexts need to be created. If this is a
concern, it can easily be fixed by setting `--javascipt.v8-contexts-minimum`
and `--javascript.v8-contexts` to a relatively high value, which will guarantee
that many number of V8 contexts to be created at startup and kept around even
when unused.
Waiting for an unused V8 context will now also abort and write a log message
in case no V8 context can be acquired/created after 60 seconds.
* the number of pending operations in arangod can now be limited to a configurable
number. If this number is exceeded, the server will now respond with HTTP 503
(service unavailable). The maximum size of pending operations is controlled via
the startup option `--server.maximal-queue-size`. Setting it to 0 means "no limit".
* the in-memory document revisions cache was removed entirely because it did not
provide the expected benefits. The 3.1 implementation shadowed document data in
RAM, which increased the server's RAM usage but did not speed up document lookups
too much.
This also obsoletes the startup options `--database.revision-cache-chunk-size` and
`--database.revision-cache-target-size`.
The MMFiles engine now does not use a document revisions cache but has in-memory
indexes and maps documents to RAM automatically via mmap when documents are
accessed. The RocksDB engine has its own mechanism for caching accessed documents.
Communication Layer
-------------------
* HTTP responses returned by arangod will now include the extra HTTP header
`x-content-type-options: nosniff` to work around a cross-site scripting bug
in MSIE
Cluster
-------
* the default value for `--ssl.protocol` was changed from TLSv1 to TLSv1.2.
When not explicitly set, arangod and all client tools will now use TLSv1.2.
* the JSON data in all incoming HTTP requests in now validated for duplicate
attribute names.
Incoming JSON data with duplicate attribute names will now be rejected as
invalid. Previous versions of ArangoDB only validated the uniqueness of
attribute names inside incoming JSON for some API endpoints, but not
consistently for all APIs.
* Internal JavaScript REST actions will now hide their stack traces to the client
unless in HTTP responses. Instead they will always log to the logfile.
Document revisions cache
------------------------
JavaScript
----------
* updated V8 version to 5.7.0.0
* change undocumented behaviour in case of invalid revision ids in
`If-Match` and `If-None-Match` headers from 400 (BAD) to 412 (PRECONDITION
FAILED).
* change default string truncation length from 80 characters to 256 characters for
`print`/`printShell` functions in ArangoShell and arangod. This will emit longer
prefixes of string values before truncating them with `...`, which is helpful
for debugging. This change is mostly useful when using the ArangoShell (arangosh).
AQL
---
### Functions added
### Optimizer improvements
* Geo indexes are now implicitly and automatically used when using appropriate SORT/FILTER
statements in AQL, without the need to use the somewhat limited special-purpose geo AQL
functions `NEAR` or `WITHIN`.
Compared to using thespecial purpose AQL functions this approach has the
advantage that it is more composable, and will also honor any `LIMIT` values
used in the AQL query.
The special purpose `NEAR` AQL function can now be substituted with the
following AQL (provided there is a geo index present on the `doc.latitude`
and `doc.longitude` attributes):
FOR doc in geoSort
SORT DISTANCE(doc.latitude, doc.longitude, 0, 0)
LIMIT 5
RETURN doc
`WITHIN` can be substituted with the following AQL:
FOR doc in geoFilter
FILTER DISTANCE(doc.latitude, doc.longitude, 0, 0) < 2000
RETURN doc
Note that this will work in the MMFiles engine only.
### Miscellaneous improvements
* the slow query list now contains the values of bind variables used in the
slow queries. Bind variables are also provided for the currently running
queries. This helps debugging slow or blocking queries that use dynamic
collection names via bind parameters.
Audit Log
---------
* AQL breaking change in cluster:
The SHORTEST_PATH statement using edge collection names instead
of a graph names now requires to explicitly name the vertex collection names
within the AQL query in the cluster. It can be done by adding `WITH <name>`
at the beginning of the query.
Example:
```
FOR v,e IN OUTBOUND SHORTEST_PATH @start TO @target edges [...]
```
Now has to be:
```
WITH vertices
FOR v,e IN OUTBOUND SHORTEST_PATH @start TO @target edges [...]
```
This change is due to avoid deadlock sitations in clustered case.
An error stating the above is included.
Client tools
------------
Added the tool _arangoexport_ to export collections to json and jsonl. It can also export graphs or collections to xgmml.
* added data export tool, arangoexport.
Web Admin Interface
-------------------
arangoexport can be used to export collections to json, jsonl or xml
and export a graph or collections to xgmml.
* added "jsonl" as input file type for arangoimp
* added `--translate` option for arangoimp to translate attribute names from
the input files to attriubte names expected by ArangoDB
The `--translate` option can be specified multiple times (once per translation
to be executed). The following example renames the "id" column from the input
file to "_key", and the "from" column to "_from", and the "to" column to "_to":
arangoimp --type csv --file data.csv --translate "id=_key" --translate "from=_from" --translate "to=_to"
`--translate` works for CSV and TSV inputs only.
* changed default value for client tools option `--server.max-packet-size` from 128 MB
to 256 MB. this allows transferring bigger result sets from the server without the
client tools rejecting them as invalid.
Authentication
--------------
* added [LDAP](../Administration/Configuration/Ldap.md) authentication (Enterprise only)
Foxx
----
The [cookie session transport](../Foxx/Sessions/Transports/Cookie.md) now supports all options supported by the [cookie method of the response object](../Foxx/Router/Response.md#cookie).
* the [cookie session transport](../Foxx/Sessions/Transports/Cookie.md) now supports all options supported by the [cookie method of the response object](../Foxx/Router/Response.md#cookie).
It's now possible to provide your own version of the `graphql-sync` module when using the [GraphQL extensions for Foxx](../Foxx/GraphQL.md) by passing a copy of the module using the new _graphql_ option.
* it's now possible to provide your own version of the `graphql-sync` module when using the [GraphQL extensions for Foxx](../Foxx/GraphQL.md) by passing a copy of the module using the new _graphql_ option.
Endpoints can now be tagged using the [tag method](../Foxx/Router/Endpoints.md#tag) to generate a cleaner Swagger documentation.
* custom API endpoints can now be tagged using the [tag method](../Foxx/Router/Endpoints.md#tag) to generate a cleaner Swagger documentation.

View File

@ -210,11 +210,13 @@ void AgencyFeature::start() {
// Find the agency prefix:
auto feature = ApplicationServer::getFeature<ClusterFeature>("Cluster");
arangodb::consensus::Supervision::setAgencyPrefix(
if (!feature->agencyPrefix().empty()) {
arangodb::consensus::Supervision::setAgencyPrefix(
std::string("/") + feature->agencyPrefix());
arangodb::consensus::Job::agencyPrefix
= std::string("/") + feature->agencyPrefix();
arangodb::consensus::Job::agencyPrefix
= std::string("/") + feature->agencyPrefix();
}
// TODO: Port this to new options handling
std::string endpoint;

View File

@ -566,7 +566,7 @@ std::string Supervision::serverHealth(std::string const& serverName) {
return status;
} catch (...) {
LOG_TOPIC(WARN, Logger::SUPERVISION)
<< "Couldn't read server health status for server " << serverName;
<< "Couldn't read server health status for server " << serverName;
return "";
}
}

View File

@ -119,7 +119,9 @@ class Supervision : public arangodb::Thread {
}
static void setAgencyPrefix(std::string prefix) {
LOG_TOPIC(WARN, Logger::SUPERVISION) << "WTF? " << _agencyPrefix;
_agencyPrefix = prefix;
LOG_TOPIC(WARN, Logger::SUPERVISION) << "WTF? " << _agencyPrefix;
}
private:

View File

@ -23,8 +23,9 @@
#ifndef GENERAL_SERVER_AUTHENTICATION_HANDLER_H
#define GENERAL_SERVER_AUTHENTICATION_HANDLER_H 1
#include "VocBase/AuthInfo.h"
#include "Basics/Common.h"
#include "Basics/Result.h"
#include "VocBase/AuthInfo.h"
namespace arangodb {
@ -33,16 +34,16 @@ enum class AuthSource;
class AuthenticationResult : public arangodb::Result {
public:
AuthenticationResult(AuthSource source) : AuthenticationResult(TRI_ERROR_FAILED, source) {}
explicit AuthenticationResult(AuthSource const& source) : AuthenticationResult(TRI_ERROR_FAILED, source) {}
AuthenticationResult(int errorNumber, AuthSource source) : Result(errorNumber), _authSource(source) {}
AuthenticationResult(std::unordered_map<std::string, std::string> permissions, AuthSource source) :
AuthenticationResult(int errorNumber, AuthSource const& source) : Result(errorNumber), _authSource(source) {}
AuthenticationResult(std::unordered_map<std::string, std::string> const& permissions, AuthSource const& source) :
Result(0),
_authSource(source),
_permissions(permissions) {}
AuthSource source() { return _authSource; }
std::unordered_map<std::string, std::string> permissions() { return _permissions; }
AuthSource source() const { return _authSource; }
std::unordered_map<std::string, std::string> permissions() const { return _permissions; }
protected:
AuthSource _authSource;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -369,7 +369,7 @@
<div id="collectionsThumbnailsIn" class="tileList pure-g">
<div class="tile pure-u-1-1 pure-u-sm-1-2 pure-u-md-1-3 pure-u-lg-1-4 pure-u-xl-1-6">
<div class="fullBorderBox">
<a href="#" id="createCollection" class="add"><span id="newCollection" class="pull-left add-Icon"><i class="fa fa-plus-circle"></i>
<a id="createCollection" class="add"><span id="newCollection" class="pull-left add-Icon"><i class="fa fa-plus-circle"></i>
</span> Add Collection</a>
</div>
</div>
@ -815,9 +815,8 @@ if (list.length > 0) {
<input type="hidden" id="newEdgeDefinitions<%= number%>" value="" placeholder="Edge definitions" tabindex="-1" class="select2-offscreen">
<button id="remove_newEdgeDefinitions<%= number%>" class="graphViewer-icon-button gv_internal_remove_line gv-icon-small delete"></button>
</th><th>
<a class="modalTooltips" title="Some info for edge definitions">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Some info for edge definitions">
</span>
</th>
</tr>
<tr class="tableRow" id="row_fromCollections<%= number%>">
@ -825,9 +824,8 @@ if (list.length > 0) {
<th class="collectionTh">
<input type="hidden" id="fromCollections<%= number%>" value="" placeholder="fromCollections" tabindex="-1" class="select2-offscreen">
</th><th>
<a class="modalTooltips" title="The collection that contain the start vertices of the relation.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="The collection that contain the start vertices of the relation.">
</span>
</th>
</tr>
<tr class="tableRow" id="row_toCollections<%= number%>">
@ -835,9 +833,8 @@ if (list.length > 0) {
<th class="collectionTh">
<input type="hidden" id="toCollections<%= number%>" value="" placeholder="toCollections" tabindex="-1" class="select2-offscreen">
</th><th>
<a class="modalTooltips" title="The collection that contain the end vertices of the relation.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="The collection that contain the end vertices of the relation.">
</span>
</th>
</tr></script><script id="editListEntryView.ejs" type="text/template"><td class="writable sorting_1"> <% if (isReadOnly) { %> <span class="key"><%=key%></span> <% } else { %> <input type="text" class="key" placeholder="attribute" <%=key?"value=" + key:""%>></input> <% } %> </td>
<td class="writeable rightCell"> <% if (isReadOnly) { %> <span class="val"><%=value%></span> <% } else { %> <textarea class="val" placeholder="value"><%=value?value:""%></textarea> <% } %> </td>
@ -846,7 +843,19 @@ if (list.length > 0) {
<a class="deleteAttribute">
<span class="icon_arangodb_roundminus" data-original-title="Delete attribute"></span>
</a>
</td></script><script id="footerView.ejs" type="text/template"> <%
</td></script><script id="filterSelect.ejs" type="text/template"><div class="filterSelectBox">
<div class="filterLabel"><%=name%><span><i class="fa fa-close" id="closeFilter"></i></span></div>
<div class="filterInput">
<input type="text" id="<%=name%>-filter" placeholder="Filter <%=name%>" aria-label="Filter labels" autocomplete="off">
</div>
<div class="filterOptions">
<div id="showAll"><strong>Show all</strong></div> <% var cssClass; %> <% _.each(options, function (option) { %> <% if (option.active) { %> <% cssClass = 'active'; %> <% } else { %> <% cssClass = 'inactive'; %> <% } %> <div class="<%=cssClass%>" name="<%=option.name%>" id="<%=option.name%>-option"> <% var color = option.color || '#f6f8fa'; %> <% if (cssClass === 'active') { %> <span class="marked"><i class="fa fa-check"/></span> <% } else { %> <span style="visibility: hidden;" class="marked"><i class="fa fa-check"/></span> <% } %> <span class="color" style="background-color: <%=color%>">&nbsp;</span>
<span class="name"><%=option.name%></span>
</div> <% }); %> </div>
</div></script><script id="footerView.ejs" type="text/template"> <%
var n,v,db;
if (name) {
n = name || "";
@ -896,7 +905,7 @@ if (list.length > 0) {
<tr>
<th class="collectionTh">Mount:</th>
<th class="collectionTh"><input type="text" id="change-mount-point" name="mountpoint" value="<%=attributes.mount%>"/></th>
<th><a class="modalTooltips" title="The path where the app can be reached."><i class="arangoicon icon_arangodb_info"></i></a></th>
<th><span class="modalTooltips arangoicon icon_arangodb_info" title="The path where the app can be reached."></span></th>
</tr>
<tr>
<th class="collectionTh">Version:</th>
@ -1135,13 +1144,7 @@ if (list.length > 0) {
<tr>
<th class="collectionTh">Type:</th>
<th class="">
<select id="newIndexType">
<option value="Geo">Geo Index</option>
<option value="Hash">Hash Index</option>
<option value="Persistent">Persistent Index</option>
<option value="Fulltext">Fulltext Index</option>
<option value="Skiplist">Skip-List Index</option>
</select>
<select id="newIndexType"> <% if (supported.indexOf('geo') > -1) { %> <option value="Geo">Geo Index</option> <% } %> <% if (supported.indexOf('hash') > -1) { %> <option value="Hash">Hash Index</option> <% } %> <% if (supported.indexOf('persistent') > -1) { %> <option value="Persistent">Persistent Index</option> <% } %> <% if (supported.indexOf('fulltext') > -1) { %> <option value="Fulltext">Fulltext Index</option> <% } %> <% if (supported.indexOf('skiplist') > -1) { %> <option value="Skiplist">Skip-List Index</option> <% } %> </select>
</th>
<th class="" style="width: 18px"/>
</tr>
@ -1353,7 +1356,50 @@ if (list.length > 0) {
<tr class="odd">
<td valign="top" class="dataTables_empty">Loading...</td>
</tr>
</tbody></script><script id="loginView.ejs" type="text/template"><div class="loginFixedWindow">
</tbody></script><script id="loggerView.ejs" type="text/template"><div id="loggerContent" class="logger-content-id innerContent">
<div class="arangoToolbar arangoToolbarTop">
<div class="pull-left">
</div>
<div class="pull-right">
<button id="logTopicSelection" class="button-default filterSelect">Topic <i class="fa fa-caret-down"></i></button>
<button id="logLevelSelection" class="button-default filterSelect">Level <i class="fa fa-caret-down"></i></button>
<button style="display: none" class="button-default filterSelect" id="logFilters">
<i class="fa fa-close"></i>Clear current <a id="filterDesc"></a> filter
</button>
</div>
</div>
<div id="noLogEntries" style="display: none">
<span>No suitable log entries found </span>
</div>
<div id="logEntries">
</div>
<div class="actions">
<button id="loadMoreEntries" class="button-success">Load older entries</button>
</div>
</div></script><script id="loggerViewEntries.ejs" type="text/template"> <% _.each(entries, function (entry) { %> <div class="pure-g" level="<%=entry.status.toLowerCase()%>" topic="<%=entry.topic.toLowerCase()%>">
<div class="pure-u-1-24">
<p class="labels"> <% var lcolor = arangoHelper.statusColors[entry.status.toLowerCase()];%> <% var tcolor = arangoHelper.alphabetColors[entry.topic.charAt(0).toLowerCase()];%> <span class="tippy level" title="Level: <%=entry.status%>" style="background: <%=lcolor%>"></span>
<span class="tippy topic" title="Topic: <%=entry.topic%>" style="background: <%=tcolor%>"></span>
</p>
</div>
<div class="pure-u-19-24 desc">
<p class="msg"><%=entry.msg%></p>
</div>
<div class="pure-u-4-24 date">
<p> <% var x = moment(entry.timestamp, "X").fromNow() %> <i class="fa fa-clock-o" aria-hidden="true"></i>
<span class="tippy" title="<%=entry.date%>"><%= x %></span>
</p>
</div>
<div class="logBorder"></div>
</div> <% }); %> </script><script id="loginView.ejs" type="text/template"><div class="loginFixedWindow">
<div id="loginWindow" class="login-window">
<div class="login-logo-round">
@ -1385,9 +1431,7 @@ if (list.length > 0) {
<button id="logout" class="button-danger pull-right">Logout</button>
</div>
</div>
</div></script><script id="logsView.ejs" type="text/template"><div id="logContent" class="log-content-id innerContent">
</div>
<!-- <div id="logPaginationDiv" class="pagination-line"></div> --></script><script id="modalApplicationMount.ejs" type="text/template"><table>
</div></script><script id="modalApplicationMount.ejs" type="text/template"><table>
<tr class="tableRow"> <% if (content === true) { %> <th class="collectionInfoTh">
Run teardown:
</th>
@ -1400,9 +1444,8 @@ if (list.length > 0) {
<input type="text" id="new-app-mount" value="" placeholder="/my/foxx"></input>
</th>
<th>
<a class="modalTooltips" title="The path the app will be mounted. Has to start with /. Is not allowed to start with /_">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="The path the app will be mounted. Has to start with /. Is not allowed to start with /_">
</span>
</th> <% } %> </tr>
</table>
@ -1467,9 +1510,8 @@ if (list.length > 0) {
<input type="hidden" id="new-app-document-collections" value="" placeholder="Document Collections"></input>
</th>
<th>
<a class="modalTooltips" title="A list of document collections that will be created specifically for this Service. A CRUD API for these will be generated.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="A list of document collections that will be created specifically for this Service. A CRUD API for these will be generated.">
</span>
</th>
</tr>
<tr class="tableRow">
@ -1480,9 +1522,8 @@ if (list.length > 0) {
<input type="hidden" id="new-app-edge-collections" value="" placeholder="Edge Collections"></input>
</th>
<th>
<a class="modalTooltips" title="A list of edge collections that will be created specifically for this Service. A CRUD API for these will be generated.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="A list of edge collections that will be created specifically for this Service. A CRUD API for these will be generated.">
</span>
</th>
</tr>
</table>
@ -1526,9 +1567,8 @@ if (list.length > 0) {
<input type="checkbox" id="github-app-islegacy" value="true">
</th>
<th>
<a class="modalTooltips" title="Legacy Compatibility Mode allows mounting some Foxx services written for ArangoDB 2.8 or older. This overrides the ArangoDB version specified in the service manifest. See the Foxx documentation for more information on running legacy services in ArangoDB 3.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Legacy Compatibility Mode allows mounting some Foxx services written for ArangoDB 2.8 or older. This overrides the ArangoDB version specified in the service manifest. See the Foxx documentation for more information on running legacy services in ArangoDB 3.">
</span>
</th>
</tr>
</table>
@ -1552,9 +1592,8 @@ if (list.length > 0) {
<input type="checkbox" id="zip-app-islegacy" value="true">
</th>
<th>
<a class="modalTooltips" title="Legacy Compatibility Mode allows mounting some Foxx services written for ArangoDB 2.8 or older. This overrides the ArangoDB version specified in the service manifest. See the Foxx documentation for more information on running legacy services in ArangoDB 3.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Legacy Compatibility Mode allows mounting some Foxx services written for ArangoDB 2.8 or older. This overrides the ArangoDB version specified in the service manifest. See the Foxx documentation for more information on running legacy services in ArangoDB 3.">
</span>
</th>
</tr>
</table>
@ -1593,9 +1632,8 @@ if (list.length > 0) {
</th>
<th class="tooltipInfoTh">
<div>
<a class="modalTooltips" data-toggle="tooltip" data-placement="left" title="The maximal size of a journal or datafile (in MB). Must be at least 1.">
<span rel="tooltip" class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="The maximal size of a journal or datafile (in MB). Must be at least 1.">
</span>
</div>
</th>
</tr>
@ -1606,9 +1644,8 @@ if (list.length > 0) {
</th>
<th class="tooltipInfoTh">
<div>
<a class="modalTooltips" data-toggle="tooltip" data-placement="left" title="Synchronize to disk before returning from a create or update of a document.">
<span rel="tooltip" class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Synchronize to disk before returning from a create or update of a document.">
</span>
</div>
</th>
</tr>
@ -1706,9 +1743,8 @@ if (list.length > 0) {
<th class="modal-text"> <%=prettyBytes(figuresData.figures.alive.size)%> </th>
<th class="modal-text"> -</th>
<th class="tooltipInfoTh">
<a class="modalTooltips" title="Total number and size of all living documents.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number and size of all living documents.">
</span>
</th>
</tr>
<tr>
@ -1719,9 +1755,8 @@ if (list.length > 0) {
<th class="tooltipInfoTh">
<div>
<a class="modalTooltips" title="Total number and size of all dead documents.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number and size of all dead documents.">
</span>
</div>
</th>
@ -1744,9 +1779,8 @@ if (list.length > 0) {
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<div>
<a class="modalTooltips" data-toggle="tooltip" data-placement="left" title="Number and total size of active datafiles.">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" data-toggle="tooltip" data-placement="left" title="Number and total size of active datafiles.">
</span>
</div>
</th>
</tr>
@ -1756,8 +1790,8 @@ if (list.length > 0) {
<th class="modal-text"> <%=prettyBytes(figuresData.figures.journals.fileSize)%> </th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<a class="modalTooltips" title="Number and total size of journal files.">
<span class="arangoicon icon_arangodb_info"></span></a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total size of journal files.">
</span>
</th>
</tr>
<tr>
@ -1766,8 +1800,7 @@ if (list.length > 0) {
<th class="modal-text"> <%=prettyBytes(figuresData.figures.compactors.fileSize)%> </th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<a class="modalTooltips" title="Number and total size of compactor files.">
<span class="arangoicon icon_arangodb_info"></span></a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total size of compactor files."></span>
</th>
</tr>
<tr>
@ -1776,8 +1809,7 @@ if (list.length > 0) {
<th class="modal-text"> <%=prettyBytes(figuresData.figures.indexes.size)%> </th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<a class="modalTooltips" title="Number and total memory usage of indexes.">
<span class="arangoicon icon_arangodb_info"></span></a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total memory usage of indexes."></span>
</th>
</tr>
</table>
@ -1796,8 +1828,8 @@ if (list.length > 0) {
<th class="modal-text">&nbsp;</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<a class="modalTooltips" title="Total number of uncollected WAL entries">
<span class="arangoicon icon_arangodb_info"></span></a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number of uncollected WAL entries">
</span>
</th>
</tr>
<tr>
@ -1806,8 +1838,8 @@ if (list.length > 0) {
<th class="modal-text">&nbsp;</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<a class="modalTooltips" title="Total number of objects pointing to documents in collection datafiles">
<span class="arangoicon icon_arangodb_info"></span></a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number of objects pointing to documents in collection datafiles">
</span>
</th>
</tr>
</table></script><script id="modalDownloadFoxx.ejs" type="text/template"><div>
@ -1902,9 +1934,8 @@ if (list.length > 0) {
if (row.info) {
%> <th>
<a class="modalTooltips" title="<%=row.info%>">
<span class="arangoicon icon_arangodb_info"></span>
</a>
<span class="modalTooltips arangoicon icon_arangodb_info" title="<%=row.info%>">
</span>
</th> <%
}
%> </tr> <%
@ -1982,9 +2013,8 @@ if (list.length > 0) {
}
%> <% if (row.info) { %> </th>
<th>
<a class="modalTooltips" title="<%=row.info%>">
<span class="arangoicon icon_arangodb_info"></span>
</a> <% } %> </th>
<span class="modalTooltips arangoicon icon_arangodb_info" title="<%=row.info%>">
</span> <% } %> </th>
</tr> <%
};
%> <% if (content) { %> <table>
@ -2099,7 +2129,21 @@ if (list.length > 0) {
<p><a href="https://slack.arangodb.com" target="_blank"><i class="fa fa-slack"></i></a></p>
<p><a href="https://stackoverflow.com/questions/tagged/arangodb" target="_blank"><i class="fa fa-stack-overflow"></i></a></p>
<p><a href="https://groups.google.com/group/arangodb" target="_blank"><i class="fa fa-google"></i></a></p>
</div></script><script id="nodesView.ejs" type="text/template"><div id="nodesContent" class="innerContent"> <% if (Object.keys(coords).length > 0) { %> <% var disabled = ''; %> <div class="pure-g">
</div></script><script id="nodeInfoView.ejs" type="text/template"><div class="nodeInfoView">
<div class="modal-body">
<table id="serverInfoTable" class="arango-table">
<tbody> <% _.each(entries, function (entry, name) { %> <tr>
<th class="collectionInfoTh2"><%=name%></th>
<th class="collectionInfoTh">
<div id="server-<%=name%>" class="modal-text"><%=entry%></div>
</th>
<th> <% if (entry.description) { %> <th class="tooltipInfoTh">
<span class="tippy" title="<%=entry.description%>"></span>
</th> <% } %> </th>
</tr> <% }); %> </tbody>
</table>
</div>
</div></script><script id="nodesView.ejs" type="text/template"><div id="nodesContent" class="innerContent"> <% if (Object.keys(coords).length > 0) { %> <% var disabled = ''; %> <div class="pure-g">
<div class="pure-u-1-1 pure-u-md-1-1 pure-u-lg-1-1 pure-u-xl-1-2">
@ -2127,18 +2171,19 @@ 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-8-24 left">Endpoint</div>
<div class="pure-u-3-24 mid hide-small">Heartbeat</div>
<div class="pure-u-3-24 mid">Status</div>
<div class="pure-u-1-24 mid"></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>
</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-8-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>
<div class="pure-u-3-24 mid"><%= node.LastHeartbeatStatus %></div> <% if(node.Status === 'GOOD') { %> <div class="pure-u-1-24 mid state"><i class="fa fa-check-circle"></i></div> <% } else { %> <div class="pure-u-1-24 mid state"><i class="fa fa-exclamation-circle"></i></div> <% } %> </div> <% }); %> </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="sectionHeader pure-g">
<div class="pure-u-1-5">
@ -2164,16 +2209,17 @@ 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-8-24 left">Endpoint</div>
<div class="pure-u-3-24 mid hide-small">Heartbeat</div>
<div class="pure-u-3-24 mid">Status</div>
<div class="pure-u-1-24 mid"></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>
</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 %>" id="<%= id %>">
</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-8-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>
<div class="pure-u-3-24 mid"><%= node.LastHeartbeatStatus %></div> <% if(node.Status === 'GOOD') { %> <div class="pure-u-1-24 mid state"><i class="fa fa-check-circle"></i></div> <% } else { %> <div class="pure-u-1-24 mid state"><i class="fa fa-exclamation-circle"></i></div> <% } %> </div> <% }); %> </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>
</div>
@ -2385,7 +2431,7 @@ if (list.length > 0) {
<div class="<%= genClass1 %> left">Sync</div>
</div>
</div> <% var counter = 0; var shardClass; %> <% _.each(collection.Plan, function(shard, name) { %> <div class="pure-g pure-table pure-table-body"> <% if (shard.progress) { %> <% shardClass = 'disabled';%> <% } %> <div class="pure-table-row noHover <%= shardClass %>" collection="<%= collectionName %>" shard="<%= name %>" leader="<%= shard.leader%>"> <% if (shard.leader.substring(0,1) === '_') { %> <% shard.leader = shard.leader.slice(1) %> <% } %> <div class="<%= genClass1 %> left"><%= name %></div>
<div class="shardLeader <%= genClass1 %> positive left"><span><%= shard.leader %></span></div> <% var found = null; %> <% _.each(shard.followers, function(db) { %> <% if (db === shard.leader) { %> <% found = true; %> <% } %> <% }); %> <% if (found) { %> <div class="<%= genClass2 %> mid"><i class="fa fa-circle-o-notch fa-spin"></i></div> <% } else { %> <% if (shard.followers.length === 0) { %> <div class="<%= genClass2 %> left"> no followers </div> <% } else { %> <% var string = ''; %> <% var counter2 = 0; %> <% _.each(shard.followers, function(db) { %> <% if (shard.followers.length === 1) { %> <% string += '<span>' + db + '</span> '; %> <% } else { %> <% if (counter2 === 0) { %> <% string += '<span>' + db + '</span>'; counter2++; %> <% } else { %> <% string += ", " + '<span>' + db + '</span>'; %> <% } %> <% } %> <% }); %> <div class="shardFollowers <%= genClass2 %> left"><%= string %></div> <% } %> <% if (shard.progress) { %> <% var percent = numeral(shard.progress.current / shard.progress.total).format('0.00%'); %> <div class="<%= genClass1 %> left"><%= percent %></div> <% } else { %> <div class="<%= genClass1 %> left"><i style="margin-left: 10px;" class="fa fa-check-circle"></i></div> <% } %> <% } %> </div>
<div class="shardLeader <%= genClass1 %> positive left"><span><%= shard.leader %></span></div> <% var found = null; %> <% _.each(shard.followers, function(db) { %> <% if (db === shard.leader) { %> <% found = true; %> <% } %> <% }); %> <% if (found) { %> <div class="<%= genClass2 %> mid"><i class="fa fa-circle-o-notch fa-spin"></i></div> <% } else { %> <% if (shard.followers.length === 0) { %> <div class="<%= genClass2 %> left"> no followers </div> <% } else { %> <% var string = ''; %> <% var counter2 = 0; %> <% _.each(shard.followers, function(db) { %> <% if (shard.followers.length === 1) { %> <% string += '<span>' + db + '</span> '; %> <% } else { %> <% if (counter2 === 0) { %> <% string += '<span>' + db + '</span>'; counter2++; %> <% } else { %> <% string += ", " + '<span>' + db + '</span>'; %> <% } %> <% } %> <% }); %> <div class="shardFollowers <%= genClass2 %> left"><%= string %></div> <% } %> <% if (shard.progress) { %> <% var percent; %> <% if (shard.progress.total === 0) { %> <% percent = numeral(0).format('0.00%'); %> <% } else { %> <% percent = numeral(shard.progress.current / shard.progress.total).format('0.00%'); %> <% } %> <div class="<%= genClass1 %> left"><%= percent %></div> <% } else { %> <div class="<%= genClass1 %> left"><i style="margin-left: 10px;" class="fa fa-check-circle"></i></div> <% } %> <% } %> </div>
</div> <% counter++; %> <% }); %> <% } %> <% }); %> <button id="rebalanceShards" style="margin-top: 20px;" class="button-success pull-right">Rebalance Shards</button>
</div></script><script id="shellView.ejs" type="text/template"><div class="headerBar">
<a class="arangoHeader">JS Shell</a>
@ -2685,7 +2731,7 @@ var cutByResolution = function (str) {
<div id="userManagementThumbnailsIn" class="tileList pure-u">
<div class="tile pure-u-1-1 pure-u-sm-1-2 pure-u-md-1-3 pure-u-lg-1-4 pure-u-xl-1-6">
<div class="fullBorderBox">
<a href="#" id="createUser" class="add">
<a id="createUser" class="add">
<span id="newUser" class="pull-left add-Icon"><i class="fa fa-plus-circle"></i></span>
Add User
</a>
@ -2748,4 +2794,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="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=1490207594829"></script><script src="app.js?version=1490207594829"></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=1493213897414"></script><script src="app.js?version=1493213897414"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,20 +5,22 @@
%>
<table id="collectionInfoTable" class="arango-table">
<tr id="collectionSizeBox">
<th class="collectionInfoTh2">Journal size:</th>
<th class="collectionInfoTh">
<div id="show-collection-size" class="modal-text">
<%=prettyBytes(figuresData.journalSize)%>
</div>
</th>
<th class="tooltipInfoTh">
<div>
<span class="modalTooltips arangoicon icon_arangodb_info" title="The maximal size of a journal or datafile (in MB). Must be at least 1.">
</span>
</div>
</th>
</tr>
<% if (figuresData.journalSize) { %>
<tr id="collectionSizeBox">
<th class="collectionInfoTh2">Journal size:</th>
<th class="collectionInfoTh">
<div id="show-collection-size" class="modal-text">
<%=prettyBytes(figuresData.journalSize)%>
</div>
</th>
<th class="tooltipInfoTh">
<div>
<span class="modalTooltips arangoicon icon_arangodb_info" title="The maximal size of a journal or datafile (in MB). Must be at least 1.">
</span>
</div>
</th>
</tr>
<% } %>
<tr id="collectionSyncBox">
<th class="collectionInfoTh2">Wait for sync:</th>
<th class="collectionInfoTh">
@ -105,161 +107,174 @@
</tr>
<% } %>
<tr>
<th class="collectionInfoTh2">Index buckets:</th>
<th class="collectionInfoTh">
<div class="modal-text"><%=figuresData.indexBuckets%></div>
</th>
<th class="collectionInfoTh">
</th>
</tr>
<% if (!frontendConfig.isCluster) { %>
<% if (figuresData.indexBuckets) { %>
<tr>
<th class="collectionInfoTh2">Compaction status:</th>
<th class="collectionInfoTh2">Index buckets:</th>
<th class="collectionInfoTh">
<div class="modal-text"><%=figuresData.figures.compactionStatus.message + " (" + figuresData.figures.compactionStatus.time + ")" %></div>
<div class="modal-text"><%=figuresData.indexBuckets%></div>
</th>
<th class="collectionInfoTh">
</th>
</tr>
<% } %>
<% if (!frontendConfig.isCluster) { %>
<% if (figuresData.figures.compactionStatus) { %>
<tr>
<th class="collectionInfoTh2">Compaction status:</th>
<th class="collectionInfoTh">
<div class="modal-text"><%=figuresData.figures.compactionStatus.message + " (" + figuresData.figures.compactionStatus.time + ")" %></div>
</th>
<th class="collectionInfoTh">
</th>
</tr>
<% } %>
<% } %>
<% if (figuresData.figures.waitingFor) { %>
<tr>
<th class="collectionInfoTh2">Waiting for:</th>
<th class="collectionInfoTh">
<div class="modal-text"><%=figuresData.figures.waitingFor%></div>
</th>
<th class="collectionInfoTh">
</th>
</tr>
<% } %>
<tr>
<th class="collectionInfoTh2">Waiting for:</th>
<th class="collectionInfoTh">
<div class="modal-text"><%=figuresData.figures.waitingFor%></div>
</th>
<th class="collectionInfoTh">
</th>
</tr>
</table>
</div>
<table class="figures1 arango-table">
<tr class="figuresHeader">
<th>Type</th>
<th>Count</th>
<th>Size</th>
<th>Deletion</th>
<th>Info</th>
</tr>
<tr>
<th class="modal-text">Alive</th>
<th class="modal-text"><%=numeral(figuresData.figures.alive.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.alive.size)%>
</th>
<th class="modal-text"> -</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number and size of all living documents.">
</span>
</th>
</tr>
<tr>
<th class="modal-text">Dead</th>
<th class="modal-text"><%=numeral(figuresData.figures.dead.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.dead.size)%>
</th>
<th class="modal-text"><%=figuresData.figures.dead.deletion%></th>
<th class="tooltipInfoTh">
<div>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number and size of all dead documents.">
<% if (figuresData.figures.alive && figuresData.figures.dead) { %>
<table class="figures1 arango-table">
<tr class="figuresHeader">
<th>Type</th>
<th>Count</th>
<th>Size</th>
<th>Deletion</th>
<th>Info</th>
</tr>
<tr>
<th class="modal-text">Alive</th>
<th class="modal-text"><%=numeral(figuresData.figures.alive.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.alive.size)%>
</th>
<th class="modal-text"> -</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number and size of all living documents.">
</span>
</div>
</th>
</th>
</tr>
<tr>
<th class="modal-text">Dead</th>
<th class="modal-text"><%=numeral(figuresData.figures.dead.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.dead.size)%>
</th>
<th class="modal-text"><%=figuresData.figures.dead.deletion%></th>
</tr>
<tr><th><div> </div></th></tr>
</table>
<table class="figures2 arango-table">
<tr class="figuresHeader">
<th>Type</th>
<th>Count</th>
<th>Size</th>
<th></th>
<th>Info</th>
</tr>
<tr>
<th class="modal-text">Datafiles</th>
<th class="modal-text"><%=numeral(figuresData.figures.datafiles.count).format('0,0')%></th>
<th class="modal-text">
<%= prettyBytes(figuresData.figures.datafiles.fileSize) %>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<div>
<span class="modalTooltips arangoicon icon_arangodb_info" data-toggle="tooltip" data-placement="left" title="Number and total size of active datafiles.">
</span>
<th class="tooltipInfoTh">
<div>
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number and size of all dead documents.">
</span>
</div>
</th>
</tr>
<tr>
<th class="modal-text">Journals</th>
<th class="modal-text"><%=numeral(figuresData.figures.journals.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.journals.fileSize)%>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total size of journal files.">
</span>
</th>
</tr>
<tr>
<th class="modal-text">Compactors</th>
<th class="modal-text"><%=numeral(figuresData.figures.compactors.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.compactors.fileSize)%>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total size of compactor files."></span>
</th>
</tr>
<tr>
<th class="modal-text">Indexes</th>
<th class="modal-text"><%=numeral(figuresData.figures.indexes.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.indexes.size)%>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total memory usage of indexes."></span>
</th>
</tr>
</table>
</th>
<table class="figures3 arango-table">
<tr class="figuresHeader">
<th>Type</th>
<th>Count</th>
<th></th>
<th></th>
<th>Info</th>
</tr>
<tr>
<th class="modal-text">Uncollected</th>
<th class="modal-text"><%=figuresData.figures.uncollectedLogfileEntries%></th>
<th class="modal-text">&nbsp;</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number of uncollected WAL entries">
</span>
</th>
</tr>
<tr>
<th class="modal-text">References</th>
<th class="modal-text"><%=figuresData.figures.documentReferences%></th>
<th class="modal-text">&nbsp;</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number of objects pointing to documents in collection datafiles">
</span>
</th>
</tr>
</table>
</tr>
<tr><th><div> </div></th></tr>
</table>
<% } %>
<% if (figuresData.figures.datafiles && figuresData.figures.journals && figuresData.figures.compactors) { %>
<table class="figures2 arango-table">
<tr class="figuresHeader">
<th>Type</th>
<th>Count</th>
<th>Size</th>
<th></th>
<th>Info</th>
</tr>
<tr>
<th class="modal-text">Datafiles</th>
<th class="modal-text"><%=numeral(figuresData.figures.datafiles.count).format('0,0')%></th>
<th class="modal-text">
<%= prettyBytes(figuresData.figures.datafiles.fileSize) %>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<div>
<span class="modalTooltips arangoicon icon_arangodb_info" data-toggle="tooltip" data-placement="left" title="Number and total size of active datafiles.">
</span>
</div>
</th>
</tr>
<tr>
<th class="modal-text">Journals</th>
<th class="modal-text"><%=numeral(figuresData.figures.journals.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.journals.fileSize)%>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total size of journal files.">
</span>
</th>
</tr>
<tr>
<th class="modal-text">Compactors</th>
<th class="modal-text"><%=numeral(figuresData.figures.compactors.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.compactors.fileSize)%>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total size of compactor files."></span>
</th>
</tr>
<tr>
<th class="modal-text">Indexes</th>
<th class="modal-text"><%=numeral(figuresData.figures.indexes.count).format('0,0')%></th>
<th class="modal-text">
<%=prettyBytes(figuresData.figures.indexes.size)%>
</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Number and total memory usage of indexes."></span>
</th>
</tr>
</table>
<% } %>
<% if (figuresData.figures.documentReferences && figuresData.figures.uncollectedLogfileEntries) { %>
<table class="figures3 arango-table">
<tr class="figuresHeader">
<th>Type</th>
<th>Count</th>
<th></th>
<th></th>
<th>Info</th>
</tr>
<tr>
<th class="modal-text">Uncollected</th>
<th class="modal-text"><%=figuresData.figures.uncollectedLogfileEntries%></th>
<th class="modal-text">&nbsp;</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number of uncollected WAL entries">
</span>
</th>
</tr>
<tr>
<th class="modal-text">References</th>
<th class="modal-text"><%=figuresData.figures.documentReferences%></th>
<th class="modal-text">&nbsp;</th>
<th class="modal-text">&nbsp;</th>
<th class="tooltipInfoTh">
<span class="modalTooltips arangoicon icon_arangodb_info" title="Total number of objects pointing to documents in collection datafiles">
</span>
</th>
</tr>
</table>
<% } %>
</script>

View File

@ -141,7 +141,7 @@
<% _.each(dbs, function(node, name) { %>
<% var id = name + "-node"; %>
<div class="pure-table-row <%= disabled %>" id="<%= id %>">
<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>

View File

@ -110,26 +110,33 @@
var error = 0;
_.each(window.clusterHealth, function (node) {
if (node.Status !== 'GOOD') {
error++;
}
});
if (Object.keys(window.clusterHealth).length !== 0) {
_.each(window.clusterHealth, function (node) {
if (node.Status !== 'GOOD') {
error++;
}
});
if (error > 0) {
if (error > 0) {
$('#healthStatus').removeClass('positive');
$('#healthStatus').addClass('negative');
if (error === 1) {
$('.health-state').html(error + ' NODE ERROR');
} else {
$('.health-state').html(error + ' NODES ERROR');
}
$('.health-icon').html('<i class="fa fa-exclamation-circle"></i>');
} else {
$('#healthStatus').removeClass('negative');
$('#healthStatus').addClass('positive');
$('.health-state').html('NODES OK');
$('.health-icon').html('<i class="fa fa-check-circle"></i>');
}
} else {
$('.health-state').html('HEALTH ERROR');
$('#healthStatus').removeClass('positive');
$('#healthStatus').addClass('negative');
if (error === 1) {
$('.health-state').html(error + ' NODE ERROR');
} else {
$('.health-state').html(error + ' NODES ERROR');
}
$('.health-icon').html('<i class="fa fa-exclamation-circle"></i>');
} else {
$('#healthStatus').removeClass('negative');
$('#healthStatus').addClass('positive');
$('.health-state').html('NODES OK');
$('.health-icon').html('<i class="fa fa-check-circle"></i>');
}
};

View File

@ -56,11 +56,21 @@
}
var renderObj = {};
renderObj.Name = model.name;
renderObj.Address = model.address;
renderObj.Status = model.status;
renderObj.Protocol = model.protocol;
renderObj.Role = model.role;
if (model.name) {
renderObj.Name = model.name;
}
if (model.address) {
renderObj.Address = model.address;
}
if (model.status) {
renderObj.Status = model.status;
}
if (model.protocol) {
renderObj.Protocol = model.protocol;
}
if (model.role) {
renderObj.Role = model.role;
}
this.$el.html(this.template.render({entries: renderObj}));
},

View File

@ -12,6 +12,7 @@
events: {
'click #nodesContent .coords-nodes .pure-table-row': 'navigateToNode',
'click #nodesContent .dbs-nodes .pure-table-row': 'navigateToInfo',
'click #nodesContent .coords-nodes .pure-table-row .fa-trash-o': 'deleteNode',
'click #addCoord': 'addCoord',
'click #removeCoord': 'removeCoord',
@ -128,6 +129,13 @@
return false;
},
navigateToInfo: function (elem) {
var name = $(elem.currentTarget).attr('node').slice(0, -5);
if ($(elem.target).hasClass('fa-info-circle')) {
window.App.navigate('#nodeInfo/' + encodeURIComponent(name), {trigger: true});
}
},
navigateToNode: function (elem) {
var name = $(elem.currentTarget).attr('node').slice(0, -5);
@ -303,7 +311,6 @@
this.setCoordSize(coords);
this.setDBsSize(dbs);
} catch (ignore) {
console.log(ignore);
arangoHelper.arangoError('Plan', 'Could not abort Cluster Plan');
}
},

View File

@ -290,7 +290,7 @@
JSON.stringify({
version: lastVersion,
tasks: lastTasks
}));
}, true));
}
} else {
logger.error('Executing ' + taskName + ' failed. Aborting ' + procedure + ' procedure.');
@ -306,7 +306,7 @@
JSON.stringify({
version: currentVersion,
tasks: lastTasks
}));
}, true));
}
if (0 < activeTasks.length) {

View File

@ -2549,7 +2549,7 @@ static void JS_Write(v8::FunctionCallbackInfo<v8::Value> const& args) {
TRI_V8_TRY_CATCH_BEGIN(isolate)
v8::HandleScope scope(isolate);
if (args.Length() != 2) {
if (args.Length() < 2) {
TRI_V8_THROW_EXCEPTION_USAGE("write(<filename>, <content>)");
}
@ -2559,6 +2559,11 @@ static void JS_Write(v8::FunctionCallbackInfo<v8::Value> const& args) {
TRI_V8_THROW_TYPE_ERROR("<filename> must be a string");
}
bool flush = false;
if (args.Length() > 2) {
flush = TRI_ObjectToBoolean(args[2]);
}
if (args[1]->IsObject() && V8Buffer::hasInstance(isolate, args[1])) {
// content is a buffer
char const* data = V8Buffer::data(args[1].As<v8::Object>());
@ -2575,6 +2580,9 @@ static void JS_Write(v8::FunctionCallbackInfo<v8::Value> const& args) {
if (file.is_open()) {
file.write(data, size);
if (flush) {
file.flush();
}
file.close();
TRI_V8_RETURN_TRUE();
}
@ -2591,6 +2599,9 @@ static void JS_Write(v8::FunctionCallbackInfo<v8::Value> const& args) {
if (file.is_open()) {
file << *content;
if (flush) {
file.flush();
}
file.close();
TRI_V8_RETURN_TRUE();
}