Commit e6dfd502 authored by Christian Mohrbacher's avatar Christian Mohrbacher

added BeeGFS 7.0-rc2

parent 290bfd58
......@@ -15,7 +15,7 @@ Before building BeeGFS, install the following dependency packages:
```
$ yum install libuuid-devel libibverbs-devel librdmacm-devel libattr-devel redhat-rpm-config \
rpm-build xfsprogs-devel cppunit cppunit-devel zlib-devel openssl-devel sqlite \
sqlite-devel ant gcc-c++ gcc redhat-lsb-core java-devel unzip
sqlite-devel ant gcc-c++ gcc redhat-lsb-core java-devel unzip libcurl-devel
```
### Debian
On Debian or Ubuntu based systems run this command to install the required packages:
......@@ -23,10 +23,12 @@ On Debian or Ubuntu based systems run this command to install the required packa
$ sudo apt install build-essential autoconf automake pkg-config devscripts debhelper \
libtool libattr1-dev xfslibs-dev lsb-release kmod librdmacm-dev libibverbs-dev \
default-jdk ant dh-systemd libcppunit-dev zlib1g-dev libssl-dev sqlite3 \
libsqlite3-dev
libsqlite3-dev libcurl4-openssl-dev
```
Note: If you have an older Debian system you might have to install the
`module-init-tools` package instead of `kmod`.
You also have the choice between
the openssl, nss, or gnutls version of `libcurl-dev`. Choose the one you prefer.
## Building Packages
BeeGFS comes with a shell script that can build all BeeGFS packages for the
......
......@@ -99,7 +99,7 @@ parse_release_suffix()
# test for rc build release string ("rc...")
local is_rc_rel_str=`echo $release_suffix | grep -E '^rc[0-9]+$'`
if [ ! -z "$is_git_rel_str" ]; then
if [ ! -z "$is_rc_rel_str" ]; then
release_type=`echo $release_suffix | sed -r s/[0-9]+//`
release_num=`echo $release_suffix | sed -r s/rc//`
fi
......
......@@ -28,6 +28,8 @@ dbMaxPointsPerRequest = 5000
dbSetRetentionPolicy = true
dbRetentionDuration = 1d
collectClientOpsByNode = true
collectClientOpsByUser = true
statsRequestIntervalSecs = 5
httpTimeoutMSecs = 1000
......@@ -120,6 +122,14 @@ tuneNumWorkers = 4
# For more details please consult the InfluxDB documentation.
# Default: 1h (one hour)
# [collectClientOpsByNode]
# Sets wether mon collects the client ops stats from the nodes, grouped by the client node IP.
# Default: true
# [collectClientOpsByUser]
# Sets wether mon collects the client ops stats from the nodes, grouped by the clients user ID.
# Default: true
# [statsRequestIntervalSecs]
# Sets the waiting interval in seconds between the stats query operation in seconds.
# This does not affect the the high resolution stats (which is always measured in
......
......@@ -118,7 +118,7 @@
],
"orderByTime": "ASC",
"policy": "default",
"query": "SELECT sum(*) FROM \"metaClientOps\" WHERE time > now() - $aggregationPeriod GROUP BY node fill(null) ORDER BY time DESC LIMIT 1",
"query": "SELECT sum(*) FROM \"metaClientOpsByNode\" WHERE time > now() - $aggregationPeriod GROUP BY node ",
"rawQuery": true,
"refId": "A",
"resultFormat": "table",
......@@ -137,43 +137,6 @@
]
],
"tags": []
},
{
"dsType": "influxdb",
"groupBy": [
{
"params": [
"$__interval"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"measurement": "clientOps",
"orderByTime": "ASC",
"policy": "default",
"refId": "B",
"resultFormat": "time_series",
"select": [
[
{
"params": [
"ack"
],
"type": "field"
},
{
"params": [],
"type": "mean"
}
]
],
"tags": []
}
],
"title": "Meta Operation List",
......@@ -222,7 +185,7 @@
"rgba(50, 172, 45, 0.97)"
],
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"decimals": 2,
"decimals": 0,
"pattern": "/^sum_(.*)$/",
"thresholds": [],
"type": "number",
......@@ -236,7 +199,7 @@
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"decimals": 2,
"decimals": 0,
"pattern": "/.*/",
"thresholds": [],
"type": "number",
......@@ -262,7 +225,7 @@
],
"orderByTime": "ASC",
"policy": "default",
"query": "SELECT sum(*) FROM \"storageClientOps\" WHERE time > now() - $aggregationPeriod GROUP BY node fill(null) ORDER BY time DESC LIMIT 1",
"query": "SELECT sum(*) FROM \"storageClientOpsByNode\" WHERE time > now() - $aggregationPeriod GROUP BY node",
"rawQuery": true,
"refId": "A",
"resultFormat": "table",
......@@ -425,6 +388,6 @@
]
},
"timezone": "",
"title": "BeeGFS Client Operations",
"title": "BeeGFS Client Operations (by node)",
"version": 3
}
\ No newline at end of file
{
"__inputs": [
{
"name": "DS_BEEGFS_MON_INFLUXDB",
"label": "Data source",
"description": "",
"type": "datasource",
"pluginId": "influxdb",
"pluginName": "InfluxDB"
}
],
"__requires": [
{
"type": "grafana",
"id": "grafana",
"name": "Grafana",
"version": "4.4.1"
},
{
"type": "datasource",
"id": "influxdb",
"name": "InfluxDB",
"version": "1.0.0"
},
{
"type": "panel",
"id": "table",
"name": "Table",
"version": ""
}
],
"annotations": {
"list": []
},
"editable": true,
"gnetId": null,
"graphTooltip": 0,
"hideControls": false,
"id": null,
"links": [],
"refresh": "5s",
"rows": [
{
"collapse": false,
"height": "250px",
"panels": [
{
"columns": [],
"datasource": "${DS_BEEGFS_MON_INFLUXDB}",
"fontSize": "100%",
"id": 1,
"links": [],
"pageSize": null,
"scroll": true,
"showHeader": true,
"sort": {
"col": 0,
"desc": true
},
"span": 12,
"styles": [
{
"alias": "Time",
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"pattern": "Time",
"type": "hidden"
},
{
"alias": "$1",
"colorMode": null,
"colors": [
"rgba(50, 172, 45, 0.97)",
"rgb(19, 98, 86)",
"rgba(226, 52, 52, 0.9)"
],
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"decimals": 0,
"pattern": "/^sum_(.*)$/",
"thresholds": [
""
],
"type": "number",
"unit": "short"
},
{
"alias": "",
"colorMode": null,
"colors": [
"rgba(245, 54, 54, 0.9)",
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"decimals": 0,
"pattern": "/.*/",
"thresholds": [
"2.0"
],
"type": "number",
"unit": "short"
}
],
"targets": [
{
"dsType": "influxdb",
"groupBy": [
{
"params": [
"$__interval"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"orderByTime": "ASC",
"policy": "default",
"query": "SELECT sum(*) FROM \"metaClientOpsByUser\" WHERE time > now() - $aggregationPeriod GROUP BY \"user\" ",
"rawQuery": true,
"refId": "A",
"resultFormat": "table",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "mean"
}
]
],
"tags": []
}
],
"title": "Meta Operation List",
"transform": "table",
"type": "table"
}
],
"repeat": null,
"repeatIteration": null,
"repeatRowId": null,
"showTitle": false,
"title": "Dashboard Row",
"titleSize": "h6"
},
{
"collapse": false,
"height": 250,
"panels": [
{
"columns": [],
"datasource": "${DS_BEEGFS_MON_INFLUXDB}",
"fontSize": "100%",
"id": 2,
"links": [],
"pageSize": null,
"scroll": true,
"showHeader": true,
"sort": {
"col": 0,
"desc": true
},
"span": 12,
"styles": [
{
"alias": "Time",
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"pattern": "Time",
"type": "hidden"
},
{
"alias": "$1",
"colorMode": null,
"colors": [
"rgba(245, 54, 54, 0.9)",
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"decimals": 0,
"pattern": "/^sum_(.*)$/",
"thresholds": [],
"type": "number",
"unit": "short"
},
{
"alias": "",
"colorMode": null,
"colors": [
"rgba(245, 54, 54, 0.9)",
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"decimals": 0,
"pattern": "/.*/",
"thresholds": [],
"type": "number",
"unit": "short"
}
],
"targets": [
{
"dsType": "influxdb",
"groupBy": [
{
"params": [
"$__interval"
],
"type": "time"
},
{
"params": [
"null"
],
"type": "fill"
}
],
"orderByTime": "ASC",
"policy": "default",
"query": "SELECT sum(*) FROM \"storageClientOpsByUser\" WHERE time > now() - $aggregationPeriod GROUP BY \"user\" ",
"rawQuery": true,
"refId": "A",
"resultFormat": "table",
"select": [
[
{
"params": [
"value"
],
"type": "field"
},
{
"params": [],
"type": "mean"
}
]
],
"tags": []
}
],
"title": "Storage Operation List",
"transform": "table",
"type": "table"
}
],
"repeat": null,
"repeatIteration": null,
"repeatRowId": null,
"showTitle": false,
"title": "Dashboard Row",
"titleSize": "h6"
}
],
"schemaVersion": 14,
"style": "dark",
"tags": [],
"templating": {
"list": [
{
"auto": false,
"auto_count": 30,
"auto_min": "10s",
"current": {
"text": "1h",
"value": "1h"
},
"hide": 0,
"label": "Aggregation Period",
"name": "aggregationPeriod",
"options": [
{
"selected": false,
"text": "1s",
"value": "1s"
},
{
"selected": false,
"text": "5s",
"value": "5s"
},
{
"selected": false,
"text": "10s",
"value": "10s"
},
{
"selected": false,
"text": "20s",
"value": "20s"
},
{
"selected": false,
"text": "30s",
"value": "30s"
},
{
"selected": false,
"text": "1m",
"value": "1m"
},
{
"selected": false,
"text": "10m",
"value": "10m"
},
{
"selected": false,
"text": "30m",
"value": "30m"
},
{
"selected": true,
"text": "1h",
"value": "1h"
},
{
"selected": false,
"text": "6h",
"value": "6h"
},
{
"selected": false,
"text": "12h",
"value": "12h"
},
{
"selected": false,
"text": "1d",
"value": "1d"
},
{
"selected": false,
"text": "7d",
"value": "7d"
},
{
"selected": false,
"text": "14d",
"value": "14d"
},
{
"selected": false,
"text": "30d",
"value": "30d"
}
],
"query": "1s, 5s, 10s, 20s, 30s, 1m,10m,30m,1h,6h,12h,1d,7d,14d,30d",
"refresh": 2,
"type": "interval"
}
]
},
"time": {
"from": "now-5m",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s",
"1m",
"5m",
"15m",
"30m",
"1h",
"2h",
"1d"
],
"time_options": [
"5m",
"15m",
"1h",
"6h",
"12h",
"24h",
"2d",
"7d",
"30d"
]
},
"timezone": "",
"title": "BeeGFS Client Operations (by user)",
"version": 3
}
\ No newline at end of file
......@@ -59,4 +59,5 @@ addDatasource "$GRAFANA_DIR/influxdb.json"
addDashboard "$GRAFANA_DIR/meta.json"
addDashboard "$GRAFANA_DIR/storage.json"
addDashboard "$GRAFANA_DIR/storage_targets.json"
addDashboard "$GRAFANA_DIR/client_ops.json"
addDashboard "$GRAFANA_DIR/client_ops_node.json"
addDashboard "$GRAFANA_DIR/client_ops_user.json"
......@@ -34,8 +34,12 @@ void Config::loadDefaults(bool addDashes)
configMapRedefine("dbMaxPointsPerRequest", "5000");
configMapRedefine("dbSetRetentionPolicy", "true");
configMapRedefine("dbRetentionDuration", "1d");
configMapRedefine("collectClientOpsByNode", "true");
configMapRedefine("collectClientOpsByUser", "true");
configMapRedefine("httpTimeoutMSecs", "1000");
configMapRedefine("statsRequestIntervalSecs", "5");
configMapRedefine("statsRequestIntervalSecs", "5");
configMapRedefine("nodelistRequestIntervalSecs","30");
}
......@@ -94,6 +98,12 @@ void Config::applyConfigMap(bool enableException, bool addDashes)
if (iter->first == std::string("dbRetentionDuration"))
dbRetentionDuration = iter->second;
else
if (iter->first == std::string("collectClientOpsByNode"))
collectClientOpsByNode = StringTk::strToBool(iter->second);
else
if (iter->first == std::string("collectClientOpsByUser"))
collectClientOpsByUser = StringTk::strToBool(iter->second);
else
if (iter->first == std::string("httpTimeoutMSecs"))
httpTimeout = std::chrono::milliseconds(StringTk::strToUInt(iter->second));
else
......
......@@ -23,6 +23,8 @@ class Config : public AbstractConfig
unsigned dbMaxPointsPerRequest;
bool dbSetRetentionPolicy;
std::string dbRetentionDuration;
bool collectClientOpsByNode;
bool collectClientOpsByUser;
std::chrono::milliseconds httpTimeout;
std::chrono::seconds statsRequestInterval;
std::chrono::seconds nodelistRequestInterval;
......@@ -85,6 +87,16 @@ class Config : public AbstractConfig
return dbRetentionDuration;
}
bool getCollectClientOpsByNode() const
{
return collectClientOpsByNode;
}
bool getCollectClientOpsByUser() const
{
return collectClientOpsByUser;
}
const std::chrono::milliseconds& getHttpTimeout() const
{
return httpTimeout;
......
......@@ -49,7 +49,8 @@ unsigned CleanUp::dropIdleConnsByStore(NodeStoreServers* nodes)
{
unsigned numDroppedConns = 0;
for (auto node = nodes->referenceAllNodes().begin(); node != nodes->referenceAllNodes().end();
const auto referencedNodes = nodes->referenceAllNodes();
for (auto node = referencedNodes.begin(); node != referencedNodes.end();
node++)
{
// don't do any idle disconnect stuff with local node
......
......@@ -27,6 +27,9 @@ void StatsCollector::run()
void StatsCollector::requestLoop()
{
bool collectClientOpsByNode = app->getConfig()->getCollectClientOpsByNode();
bool collectClientOpsByUser = app->getConfig()->getCollectClientOpsByUser();
// intially wait one query interval before requesting stats to give NodeListRequestor the time
// to retrieve the node lists
while (!waitForSelfTerminateOrder(std::chrono::milliseconds(
......@@ -49,7 +52,8 @@ void StatsCollector::requestLoop()
{
workItemCounter++;
app->getWorkQueue()->addIndirectWork(
new RequestMetaDataWork(std::static_pointer_cast<MetaNodeEx>(*node), this));
new RequestMetaDataWork(std::static_pointer_cast<MetaNodeEx>(*node),
this, collectClientOpsByNode, collectClientOpsByUser));
}
const auto& storageNodes = app->getStorageNodes()->referenceAllNodes();
......@@ -58,7 +62,8 @@ void StatsCollector::requestLoop()
{
workItemCounter++;
app->getWorkQueue()->addIndirectWork(
new RequestStorageDataWork(std::static_pointer_cast<StorageNodeEx>(*node), this));
new RequestStorageDataWork(std::static_pointer_cast<StorageNodeEx>(*node),
this, collectClientOpsByNode, collectClientOpsByUser));
}
while (workItemCounter > 0)
......@@ -76,10 +81,22 @@ void StatsCollector::requestLoop()
app->getTSDB()->insertHighResMetaNodeData(iter->node, *listIter);
}
for (auto mapIter = iter->idOpsUnorderedMap.begin();
mapIter != iter->idOpsUnorderedMap.end(); mapIter++)
if (collectClientOpsByNode)
{
metaClientOps.addOpsList(mapIter->first, mapIter->second);
for (auto mapIter = iter->ipOpsUnorderedMap.begin();
mapIter != iter->ipOpsUnorderedMap.end(); mapIter++)
{
ipMetaClientOps.addOpsList(mapIter->first, mapIter->second);
}
}
if (collectClientOpsByUser)
{
for (auto mapIter = iter->userOpsUnorderedMap.begin();
mapIter != iter->userOpsUnorderedMap.end(); mapIter++)
{
userMetaClientOps.addOpsList(mapIter->first, mapIter->second);
}
}
}
......@@ -100,22 +117,43 @@ void StatsCollector::requestLoop()
app->getTSDB()->insertStorageTargetsData(iter->node, *listIter);
}
for (auto mapIter = iter->idOpsUnorderedMap.begin();
mapIter != iter->idOpsUnorderedMap.end(); mapIter++)
if (collectClientOpsByNode)
{
storageClientOps.addOpsList(mapIter->first, mapIter->second);
for (auto mapIter = iter->ipOpsUnorderedMap.begin();
mapIter != iter->ipOpsUnorderedMap.end(); mapIter++)
{
ipStorageClientOps.addOpsList(mapIter->first, mapIter->second);
}
}
if (collectClientOpsByUser)
{
for (auto mapIter = iter->userOpsUnorderedMap.begin();
mapIter != iter->userOpsUnorderedMap.end(); mapIter++)
{
userStorageClientOps.addOpsList(mapIter->first, mapIter->second);
}
}
}
processClientOps(metaClientOps, NODETYPE_Meta);
processClientOps(storageClientOps, NODETYPE_Storage);
if (collectClientOpsByNode)
{
processClientOps(ipMetaClientOps, NODETYPE_Meta, false);
processClientOps(ipStorageClientOps, NODETYPE_Storage, false);
}
if (collectClientOpsByUser)
{
processClientOps(userMetaClientOps, NODETYPE_Meta, true);
processClientOps(userStorageClientOps, NODETYPE_Storage, true);
}
app->getTSDB()->writePoints();
}