You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by xy...@apache.org on 2018/04/24 20:13:45 UTC
[30/83] [abbrv] [partial] hadoop git commit: HDFS-13405. Ozone:
Rename HDSL to HDDS. Contributed by Ajay Kumar, Elek Marton, Mukul Kumar Singh,
Shashikant Banerjee and Anu Engineer.
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.css
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.css b/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.css
new file mode 100644
index 0000000..271ac74
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.css
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+body {
+ padding: 40px;
+ padding-top: 60px;
+}
+.starter-template {
+ padding: 40px 15px;
+ text-align: center;
+}
+
+
+.btn {
+ border: 0 none;
+ font-weight: 700;
+ letter-spacing: 1px;
+ text-transform: uppercase;
+}
+
+.btn:focus, .btn:active:focus, .btn.active:focus {
+ outline: 0 none;
+}
+
+.table-striped > tbody > tr:nth-child(2n+1).selectedtag > td:hover {
+ background-color: #3276b1;
+}
+.table-striped > tbody > tr:nth-child(2n+1).selectedtag > td {
+ background-color: #3276b1;
+}
+.tagPanel tr.selectedtag td {
+ background-color: #3276b1;
+}
+.top-buffer { margin-top:4px; }
+
+
+.sortorder:after {
+ content: '\25b2'; // BLACK UP-POINTING TRIANGLE
+}
+.sortorder.reverse:after {
+ content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE
+}
+
+.wrap-table{
+ word-wrap: break-word;
+ table-layout: fixed;
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.js
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.js b/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.js
new file mode 100644
index 0000000..37cafef
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/ozone.js
@@ -0,0 +1,355 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+ "use strict";
+
+ var isIgnoredJmxKeys = function (key) {
+ return key == 'name' || key == 'modelerType' || key == "$$hashKey" ||
+ key.match(/tag.*/);
+ };
+ angular.module('ozone', ['nvd3', 'ngRoute']);
+ angular.module('ozone').config(function ($routeProvider) {
+ $routeProvider
+ .when("/", {
+ templateUrl: "main.html"
+ })
+ .when("/metrics/rpc", {
+ template: "<rpc-metrics></rpc-metrics>"
+ })
+ .when("/config", {
+ template: "<config></config>"
+ })
+ });
+ angular.module('ozone').component('overview', {
+ templateUrl: 'static/templates/overview.html',
+ transclude: true,
+ controller: function ($http) {
+ var ctrl = this;
+ $http.get("jmx?qry=Hadoop:service=*,name=*,component=ServerRuntime")
+ .then(function (result) {
+ ctrl.jmx = result.data.beans[0]
+ })
+ }
+ });
+ angular.module('ozone').component('jvmParameters', {
+ templateUrl: 'static/templates/jvm.html',
+ controller: function ($http) {
+ var ctrl = this;
+ $http.get("jmx?qry=java.lang:type=Runtime")
+ .then(function (result) {
+ ctrl.jmx = result.data.beans[0];
+
+ //convert array to a map
+ var systemProperties = {};
+ for (var idx in ctrl.jmx.SystemProperties) {
+ var item = ctrl.jmx.SystemProperties[idx];
+ systemProperties[item.key.replace(/\./g, "_")] = item.value;
+ }
+ ctrl.jmx.SystemProperties = systemProperties;
+ })
+ }
+ });
+
+ angular.module('ozone').component('rpcMetrics', {
+ template: '<h1>Rpc metrics</h1><tabs>' +
+ '<pane ng-repeat="metric in $ctrl.metrics" ' +
+ 'title="{{metric[\'tag.serverName\']}} ({{metric[\'tag.port\']}})">' +
+ '<rpc-metric jmxdata="metric"></rpc-metric></pane>' +
+ '</tabs>',
+ controller: function ($http) {
+ var ctrl = this;
+ $http.get("jmx?qry=Hadoop:service=*,name=RpcActivityForPort*")
+ .then(function (result) {
+ ctrl.metrics = result.data.beans;
+ })
+ }
+ });
+ angular.module('ozone').component('rpcMetric', {
+ bindings: {
+ jmxdata: '<'
+ },
+ templateUrl: 'static/templates/rpc-metrics.html',
+ controller: function () {
+ var ctrl = this;
+
+
+ ctrl.percentileGraphOptions = {
+ chart: {
+ type: 'discreteBarChart',
+ height: 450,
+ margin: {
+ top: 20,
+ right: 20,
+ bottom: 50,
+ left: 55
+ },
+ x: function (d) {
+ return d.label;
+ },
+ y: function (d) {
+ return d.value;
+ },
+ showValues: true,
+ valueFormat: function (d) {
+ return d3.format(',.1f')(d);
+ },
+ duration: 500,
+ xAxis: {
+ axisLabel: 'Percentage'
+ },
+ yAxis: {
+ axisLabel: 'Latency (ms)',
+ axisLabelDistance: -10
+ }
+ }
+ };
+
+ ctrl.$onChanges = function (data) {
+ var groupedMetrics = {}
+
+ var createPercentageMetrics = function (metricName, window) {
+ groupedMetrics.percentiles = groupedMetrics['percentiles'] || {}
+ groupedMetrics.percentiles[window] = groupedMetrics.percentiles[window] || {};
+ groupedMetrics.percentiles[window][metricName] = groupedMetrics.percentiles[window][metricName] || {
+ graphdata: [{
+ key: window,
+ values: []
+ }], numOps: 0
+ };
+
+ };
+ var metrics = ctrl.jmxdata;
+ for (var key in metrics) {
+ var percentile = key.match(/(.*Time)(\d+s)(\d+th)PercentileLatency/);
+ var percentileNumOps = key.match(/(.*Time)(\d+s)NumOps/);
+ var successFailures = key.match(/(.*)(Success|Failures)/);
+ var numAverages = key.match(/(.*Time)(NumOps|AvgTime)/);
+ if (percentile) {
+ var metricName = percentile[1];
+ var window = percentile[2];
+ var percentage = percentile[3]
+ createPercentageMetrics(metricName, window);
+
+
+ groupedMetrics.percentiles[window][metricName].graphdata[0]
+ .values.push({
+ label: percentage,
+ value: metrics[key]
+ })
+ } else if (successFailures) {
+ var metricName = successFailures[1];
+ groupedMetrics.successfailures = groupedMetrics['successfailures'] || {}
+ groupedMetrics.successfailures[metricName] = groupedMetrics.successfailures[metricName] || {
+ success: 0,
+ failures: 0
+ };
+ if (successFailures[2] == 'Success') {
+ groupedMetrics.successfailures[metricName].success = metrics[key];
+ } else {
+ groupedMetrics.successfailures[metricName].failures = metrics[key];
+ }
+
+ } else if (numAverages) {
+ var metricName = numAverages[1];
+ groupedMetrics.numavgs = groupedMetrics['numavgs'] || {}
+ groupedMetrics.numavgs[metricName] = groupedMetrics.numavgs[metricName] || {
+ numOps: 0,
+ avgTime: 0
+ };
+ if (numAverages[2] == 'NumOps') {
+ groupedMetrics.numavgs[metricName].numOps = metrics[key];
+ } else {
+ groupedMetrics.numavgs[metricName].avgTime = metrics[key];
+ }
+
+ } else if (percentileNumOps) {
+ var metricName = percentileNumOps[1];
+ var window = percentileNumOps[2];
+ createPercentageMetrics(metricName, window);
+ groupedMetrics.percentiles[window][metricName].numOps = metrics[key];
+ } else if (isIgnoredJmxKeys(key)) {
+ //ignore
+ } else {
+ groupedMetrics.others = groupedMetrics.others || [];
+ groupedMetrics.others.push({
+ 'key': key,
+ 'value': metrics[key]
+ });
+ }
+
+ }
+ ctrl.metrics = groupedMetrics;
+ };
+
+ }
+ });
+ angular.module('ozone')
+ .component('tabs', {
+ transclude: true,
+ controller: function ($scope) {
+ var ctrl = this;
+ var panes = this.panes = [];
+ this.select = function (pane) {
+ angular.forEach(panes, function (pane) {
+ pane.selected = false;
+ });
+ pane.selected = true;
+ };
+ this.addPane = function (pane) {
+ if (panes.length === 0) {
+ this.select(pane);
+ }
+ panes.push(pane);
+ };
+ this.click = function(pane) {
+ ctrl.select(pane);
+ }
+ },
+ template: '<div class="nav navtabs"><div class="row"><ul' +
+ ' class="nav nav-pills">' +
+ '<li ng-repeat="pane in $ctrl.panes" ng-class="{active:pane.selected}">' +
+ '<a href="" ng-click="$ctrl.click(pane)">{{pane.title}}</a> ' +
+ '</li> </ul></div><br/><div class="tab-content" ng-transclude></div> </div>'
+ })
+ .component('pane', {
+ transclude: true,
+ require: {
+ tabsCtrl: '^tabs'
+ },
+ bindings: {
+ title: '@'
+ },
+ controller: function () {
+ this.$onInit = function () {
+ this.tabsCtrl.addPane(this);
+ };
+ },
+ template: '<div class="tab-pane" ng-if="$ctrl.selected" ng-transclude></div>'
+ });
+
+ angular.module('ozone').component('navmenu', {
+ bindings: {
+ metrics: '<'
+ },
+ templateUrl: 'static/templates/menu.html',
+ controller: function ($http) {
+ var ctrl = this;
+ ctrl.docs = false;
+ $http.head("docs/index.html")
+ .then(function (result) {
+ ctrl.docs = true;
+ },function(){
+ ctrl.docs = false;
+ });
+ }
+ });
+
+ angular.module('ozone').component('config', {
+ templateUrl: 'static/templates/config.html',
+ controller: function ($scope, $http) {
+ var ctrl = this;
+ ctrl.selectedTags = [];
+
+ $http.get("conf?cmd=getOzoneTags&group=ozone")
+ .then(function (response) {
+ ctrl.tags = response.data;
+
+ var excludedTags = ['CBLOCK', 'KSM', 'SCM'];
+ for (var i = 0; i < excludedTags.length; i++) {
+ var idx = ctrl.tags.indexOf(excludedTags[i]);
+ // Remove CBLOCK related properties
+ if (idx > -1) {
+ ctrl.tags.splice(idx, 1);
+ }
+ }
+ ctrl.loadAll();
+ });
+
+
+
+ ctrl.loadAll = function () {
+ console.log("Displaying all configs");
+ $http.get("conf?cmd=getPropertyByTag&tags=" + ctrl.tags + "&group=ozone").then(function (response) {
+ ctrl.configs = response.data;
+ console.log(ctrl.configs)
+ for (var idx in ctrl.configs) {
+ var tags = []
+ var parsedTags = ctrl.configs[idx].tag.split(",");
+ for (var t in parsedTags) {
+ tags.push(parsedTags[t].trim())
+ }
+ ctrl.configs[idx].tag = tags;
+
+ };
+ ctrl.sortBy('name');
+ });
+ };
+
+ ctrl.tagFilter = function (value, index, array) {
+ if (!ctrl.selectedTags) {
+ return true;
+ }
+ var selected = true;
+ for (var idx in ctrl.selectedTags) {
+ selected = selected && (value.tag.indexOf(ctrl.selectedTags[idx]) > -1);
+ }
+ return selected;
+ };
+ ctrl.configFilter = function (config) {
+ return false;
+ };
+ ctrl.selected = function (tag) {
+ return ctrl.selectedTags.includes(tag);
+ };
+
+ ctrl.allSelected = function () {
+ return ctrl.selectedTags.indexOf('SCM') == -1
+ && ctrl.selectedTags.indexOf('KSM') == -1
+ };
+
+ ctrl.switchto = function (tag) {
+ var tags = ctrl.selectedTags.filter(function (item) {
+ return item != 'KSM' && item != 'SCM';
+ });
+ if (tag) {
+ tags.push(tag);
+ }
+ ctrl.selectedTags = tags;
+ };
+
+ ctrl.select = function (tag) {
+ var tagIdx = ctrl.selectedTags.indexOf(tag);
+ if (tagIdx > -1) {
+ ctrl.selectedTags = ctrl.selectedTags.filter(function (item) {
+ return item != tag;
+ });
+ } else {
+ ctrl.selectedTags.push(tag);
+ }
+ console.log("Tags selected:" + ctrl.selectedTags);
+ };
+
+ ctrl.sortBy = function (propertyName) {
+ ctrl.reverse = (ctrl.propertyName === propertyName) ? !ctrl.reverse : false;
+ ctrl.propertyName = propertyName;
+ };
+
+ }
+ });
+
+})();
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/templates/config.html
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/config.html b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/config.html
new file mode 100644
index 0000000..7ca0713
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/config.html
@@ -0,0 +1,91 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<div class="row top-buffer">
+ <div class="col-md-2">
+ <input type="text" class="form-control" placeholder="Search Properties"
+ name="search" ng-model="search.$">
+ </div>
+ <div class="col-md-10">
+ <div class="btn-group btn-group-justified">
+ <a class="btn"
+ ng-class="$ctrl.allSelected() ? 'btn-primary' :'btn-secondary'"
+ ng-click="$ctrl.switchto('')">All
+ </a>
+ <a class="btn"
+ ng-class="$ctrl.selected('KSM') ? 'btn-primary' :'btn-secondary'"
+ ng-click="$ctrl.switchto('KSM')">KSM</a>
+ <a class="btn"
+ ng-class="$ctrl.selected('SCM') ? 'btn-primary' :'btn-secondary'"
+ ng-click="$ctrl.switchto('SCM')">SCM</a>
+ </div>
+ </div>
+</div>
+<div class="row">
+ <div class="col-md-2">
+
+ <table class="table table-striped table-condensed tagPanel">
+ <colgroup>
+ <col class="col-md-12">
+ </colgroup>
+ <thead>
+ <tr>
+ <th>Tag</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-click="$ctrl.select(tag)"
+ ng-class="$ctrl.selected(tag) ? 'selectedtag':''"
+ ng-repeat="tag in $ctrl.tags">
+ <td>{{tag}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="col-md-10">
+ <table class="table table-striped table-condensed table-hover wrap-table">
+ <thead>
+ <tr>
+ <th class="col-md-3" >
+ <a href="#" ng-click="$ctrl.sortBy('name')">Property</a>
+ <span class="sortorder" ng-show="propertyName === 'name'"
+ ng-class="{reverse: reverse}">
+
+ </span>
+ </th>
+ <th class="col-md-2" style="word-wrap: break-word;">
+ <a ng-click="$ctrl.sortBy('value')">Value</a>
+ <span class="sortorder" ng-show="propertyName === 'value'"
+ ng-class="{reverse: reverse}"></span>
+ </th>
+ <th class="col-md-7">
+ <a href="#" ng-click="$ctrl.sortBy('description')">Description</a>
+ <span class="sortorder" ng-show="propertyName === 'description'"
+ ng-class="{reverse: reverse}"></span>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="config in $ctrl.configs | filter:$ctrl.tagFilter | filter:search | orderBy:propertyName:reverse">
+ <td style="word-wrap: break-word;">{{config.name}}</td>
+ <td style="word-wrap: break-word;">{{config.value}}</td>
+ <td style="word-wrap: break-word;">{{config.description}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/templates/jvm.html
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/jvm.html b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/jvm.html
new file mode 100644
index 0000000..c1f7d16
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/jvm.html
@@ -0,0 +1,26 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<table class="table table-bordered table-striped">
+ <tr>
+ <th>JVM:</th>
+ <td>{{$ctrl.jmx.SystemProperties.java_vm_name}} {{$ctrl.jmx.SystemProperties.java_vm_version}}</td>
+ </tr>
+ <tr>
+ <th>Input arguments:</th>
+ <td>{{$ctrl.jmx.InputArguments}}</td>
+ </tr>
+</table>
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html
new file mode 100644
index 0000000..95f1b48
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html
@@ -0,0 +1,60 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<div id="navbar" class="collapse navbar-collapse">
+ <ul class="nav navbar-nav" id="ui-tabs">
+ <li>
+ <a class="dropdown-toggle"
+ id="metricsMenu"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="true">
+ Metrics
+ <span class="caret"></span>
+ </a>
+ <ul
+ class="dropdown-menu"
+ aria-labelledby="metricsMenu">
+ <li ng-repeat="(name, url) in $ctrl.metrics">
+ <a ng-href="{{url}}">{{name}}<span
+ aria-hidden="true"></span></a></li>
+ </ul>
+ </li>
+ <li><a href="#!/config">Configuration</a></li>
+ <li ng-show="$ctrl.docs"><a href="/docs">Documentation</a></li>
+ <li>
+ <a class="dropdown-toggle"
+ id="toolsMenu"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="true"
+ >
+ Common tools
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" aria-labelledby="toolsMenu">
+ <li><a href="jmx">JMX <span
+ aria-hidden="true"></span></a></li>
+ <li><a href="conf">Config <span
+ aria-hidden="true"></a></li>
+ <li><a href="stacks">Stacks <span
+ aria-hidden="true"></a></li>
+ <li><a href="logLevel">Log levels <span
+ aria-hidden="true"></a></li>
+ </ul>
+ </li>
+ </ul>
+</div><!--/.nav-collapse -->
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/templates/overview.html
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/overview.html b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/overview.html
new file mode 100644
index 0000000..30e2d26
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/overview.html
@@ -0,0 +1,39 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<h1>Overview</h1>
+<table class="table table-bordered table-striped">
+ <tbody>
+ <tr>
+ <th>Started:</th>
+ <td>{{$ctrl.jmx.StartedTimeInMillis | date : 'medium'}}</td>
+ </tr>
+ <tr>
+ <th>Version:</th>
+ <td>{{$ctrl.jmx.Version}}</td>
+ </tr>
+ <tr>
+ <th>Compiled:</th>
+ <td>{{$ctrl.jmx.CompileInfo}}</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2>JVM parameters</h2>
+
+<jvm-parameters></jvm-parameters>
+
+<div ng-transclude></div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/rpc-metrics.html b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
new file mode 100644
index 0000000..facb152
--- /dev/null
+++ b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/rpc-metrics.html
@@ -0,0 +1,87 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<div ng-hide="$ctrl.metrics.percentiles" class="alert alert-info">
+ Please set <b>rpc.metrics.quantile.enable</b> to <b>true</b> and define the
+ intervals in seconds with setting <b>rpc.metrics.percentiles.intervals</b>
+ (eg. set to <b>60,300</b>) in your hdfs-site.xml
+ to display Hadoop RPC related graphs.
+</div>
+<div ng-repeat="(window,windowed) in $ctrl.metrics.percentiles">
+ <h2>{{window}} window</h2>
+ <p>Quantiles based on a fixed {{window}} window. Calculated once at every
+ {{window}}</p>
+
+ <div class="row">
+ <div class="col-md-6 col-lg-4"
+ ng-repeat="(metric,percentiles) in windowed">
+ <h3>{{metric}}</h3>
+ <p>{{percentiles.numOps}} sample</p>
+ <nvd3 options="$ctrl.percentileGraphOptions"
+ data="percentiles.graphdata"></nvd3>
+ </div>
+ </div>
+
+</div>
+<div class="row">
+ <div ng-show="$ctrl.metrics.numavgs" class="col-md-6">
+ <h2>Number of ops / Averages</h2>
+
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th>Metric name</th>
+ <th>Number of ops</th>
+ <th>Average time (ms)</th>
+ </tr>
+ </thead>
+ <tr ng-repeat="(key,metric) in $ctrl.metrics.numavgs">
+ <td>{{key}}</td>
+ <td>{{metric.numOps | number}}</td>
+ <td>{{metric.avgTime | number:2}}</td>
+ </tr>
+ </table>
+ </div>
+ <div ng-show="$ctrl.metrics.successfailures" class="col-md-6">
+ <h2>Success / Failures</h2>
+
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th>Metric name</th>
+ <th>Success</th>
+ <th>Failures</th>
+ </tr>
+ </thead>
+
+ <tr ng-repeat="(key,metric) in $ctrl.metrics.successfailures">
+ <td>{{key}}</td>
+ <td>{{metric.success}}</td>
+ <td>{{metric.failures}}</td>
+ </tr>
+ </table>
+ </div>
+</div>
+<div ng-show="$ctrl.metrics.others">
+ <h2>Other JMX Metrics</h2>
+
+ <table class="table">
+ <tr ng-repeat="metric in $ctrl.metrics.others">
+ <td>{{metric.key}}</td>
+ <td>{{metric.value}}</td>
+ </tr>
+ </table>
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdsl/server/TestBaseHttpServer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdsl/server/TestBaseHttpServer.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdsl/server/TestBaseHttpServer.java
new file mode 100644
index 0000000..c6eae0e
--- /dev/null
+++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdsl/server/TestBaseHttpServer.java
@@ -0,0 +1,98 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hdds.server;
+
+import org.apache.hadoop.conf.Configuration;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test Common ozone/hdds web methods.
+ */
+public class TestBaseHttpServer {
+ @Test
+ public void getBindAddress() throws Exception {
+ Configuration conf = new Configuration();
+ conf.set("enabled", "false");
+
+ BaseHttpServer baseHttpServer = new BaseHttpServer(conf, "test") {
+ @Override
+ protected String getHttpAddressKey() {
+ return null;
+ }
+
+ @Override
+ protected String getHttpsAddressKey() {
+ return null;
+ }
+
+ @Override
+ protected String getHttpBindHostKey() {
+ return null;
+ }
+
+ @Override
+ protected String getHttpsBindHostKey() {
+ return null;
+ }
+
+ @Override
+ protected String getBindHostDefault() {
+ return null;
+ }
+
+ @Override
+ protected int getHttpBindPortDefault() {
+ return 0;
+ }
+
+ @Override
+ protected int getHttpsBindPortDefault() {
+ return 0;
+ }
+
+ @Override
+ protected String getKeytabFile() {
+ return null;
+ }
+
+ @Override
+ protected String getSpnegoPrincipal() {
+ return null;
+ }
+
+ @Override
+ protected String getEnabledKey() {
+ return "enabled";
+ }
+ };
+
+ conf.set("addresskey", "0.0.0.0:1234");
+
+ Assert.assertEquals("/0.0.0.0:1234", baseHttpServer
+ .getBindAddress("bindhostkey", "addresskey",
+ "default", 65).toString());
+
+ conf.set("bindhostkey", "1.2.3.4");
+
+ Assert.assertEquals("/1.2.3.4:1234", baseHttpServer
+ .getBindAddress("bindhostkey", "addresskey",
+ "default", 65).toString());
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/framework/src/test/resources/ozone-site.xml
----------------------------------------------------------------------
diff --git a/hadoop-hdds/framework/src/test/resources/ozone-site.xml b/hadoop-hdds/framework/src/test/resources/ozone-site.xml
new file mode 100644
index 0000000..77dd7ef
--- /dev/null
+++ b/hadoop-hdds/framework/src/test/resources/ozone-site.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Put site-specific property overrides in this file. -->
+
+<configuration>
+
+</configuration>
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/pom.xml
----------------------------------------------------------------------
diff --git a/hadoop-hdds/pom.xml b/hadoop-hdds/pom.xml
new file mode 100644
index 0000000..01b696c
--- /dev/null
+++ b/hadoop-hdds/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-project-dist</artifactId>
+ <version>3.2.0-SNAPSHOT</version>
+ <relativePath>../hadoop-project-dist</relativePath>
+ </parent>
+
+ <artifactId>hadoop-hdds</artifactId>
+ <version>3.2.0-SNAPSHOT</version>
+ <description>Apache Hadoop Distributed Data Store Parent project</description>
+ <name>Apache Hdds</name>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>client</module>
+ <module>common</module>
+ <module>framework</module>
+ <module>container-service</module>
+ <module>server-scm</module>
+ <module>tools</module>
+
+ </modules>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-common</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdfs</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdfs-client</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-common</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdfs</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <configuration>
+ <excludeFilterFile combine.self="override"></excludeFilterFile>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/server-scm/pom.xml
----------------------------------------------------------------------
diff --git a/hadoop-hdds/server-scm/pom.xml b/hadoop-hdds/server-scm/pom.xml
new file mode 100644
index 0000000..35975f4
--- /dev/null
+++ b/hadoop-hdds/server-scm/pom.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds</artifactId>
+ <version>3.2.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>hadoop-hdds-server-scm</artifactId>
+ <version>3.2.0-SNAPSHOT</version>
+ <description>Apache HDDS SCM server</description>
+ <name>Apache Hadoop HDDS SCM server</name>
+ <packaging>jar</packaging>
+
+ <properties>
+ <hadoop.component>hdds</hadoop.component>
+ <is.hadoop.component>true</is.hadoop.component>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds-common</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds-container-service</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds-client</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds-server-framework</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds-container-service</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-core</artifactId>
+ <version>1.3</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>io.dropwizard.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openjdk.jmh</groupId>
+ <artifactId>jmh-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openjdk.jmh</groupId>
+ <artifactId>jmh-generator-annprocess</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-all</artifactId>
+ <version>1.3</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy web resources</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target>
+ <copy toDir="${project.build.directory}/webapps">
+ <fileset dir="${basedir}/src/main/webapps">
+ <exclude name="**/proto-web.xml"/>
+ </fileset>
+ </copy>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-common-html</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdds-server-framework</artifactId>
+ <outputDirectory>${project.build.directory}/</outputDirectory>
+ <includes>webapps/static/**/*.*</includes>
+ </artifactItem>
+ </artifactItems>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMMXBean.java
----------------------------------------------------------------------
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMMXBean.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMMXBean.java
new file mode 100644
index 0000000..17b6814
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMMXBean.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.scm;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.hdds.server.ServiceRuntimeInfo;
+
+import java.util.Map;
+
+/**
+ *
+ * This is the JMX management interface for scm information.
+ */
+@InterfaceAudience.Private
+public interface SCMMXBean extends ServiceRuntimeInfo {
+
+ /**
+ * Get the SCM RPC server port that used to listen to datanode requests.
+ * @return SCM datanode RPC server port
+ */
+ String getDatanodeRpcPort();
+
+ /**
+ * Get the SCM RPC server port that used to listen to client requests.
+ * @return SCM client RPC server port
+ */
+ String getClientRpcPort();
+
+ /**
+ * Get container report info that includes container IO stats of nodes.
+ * @return The datanodeUUid to report json string mapping
+ */
+ Map<String, String> getContainerReport();
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/651a05a1/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMStorage.java
----------------------------------------------------------------------
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMStorage.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMStorage.java
new file mode 100644
index 0000000..27e9363
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/SCMStorage.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hdds.scm;
+
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType;
+import org.apache.hadoop.ozone.common.Storage;
+
+import java.io.IOException;
+import java.util.Properties;
+import java.util.UUID;
+
+import static org.apache.hadoop.hdds.server.ServerUtils.getOzoneMetaDirPath;
+import static org.apache.hadoop.ozone.OzoneConsts.SCM_ID;
+import static org.apache.hadoop.ozone.OzoneConsts.STORAGE_DIR;
+
+/**
+ * SCMStorage is responsible for management of the StorageDirectories used by
+ * the SCM.
+ */
+public class SCMStorage extends Storage {
+
+ /**
+ * Construct SCMStorage.
+ * @throws IOException if any directories are inaccessible.
+ */
+ public SCMStorage(OzoneConfiguration conf) throws IOException {
+ super(NodeType.SCM, getOzoneMetaDirPath(conf), STORAGE_DIR);
+ }
+
+ public void setScmId(String scmId) throws IOException {
+ if (getState() == StorageState.INITIALIZED) {
+ throw new IOException("SCM is already initialized.");
+ } else {
+ getStorageInfo().setProperty(SCM_ID, scmId);
+ }
+ }
+
+ /**
+ * Retrieves the SCM ID from the version file.
+ * @return SCM_ID
+ */
+ public String getScmId() {
+ return getStorageInfo().getProperty(SCM_ID);
+ }
+
+ @Override
+ protected Properties getNodeProperties() {
+ String scmId = getScmId();
+ if (scmId == null) {
+ scmId = UUID.randomUUID().toString();
+ }
+ Properties scmProperties = new Properties();
+ scmProperties.setProperty(SCM_ID, scmId);
+ return scmProperties;
+ }
+
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org