You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by jo...@apache.org on 2016/02/10 03:03:00 UTC
nifi git commit: NIFI-1492: - Limiting the amount of state entries
returned to a client. - Code clean up.
Repository: nifi
Updated Branches:
refs/heads/master 8a05f6880 -> f4487dd5f
NIFI-1492: - Limiting the amount of state entries returned to a client. - Code clean up.
Signed-off-by: joewitt <jo...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/f4487dd5
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/f4487dd5
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/f4487dd5
Branch: refs/heads/master
Commit: f4487dd5f6338c9b5fa384e36e3e2ee62aeab987
Parents: 8a05f68
Author: Matt Gilman <ma...@gmail.com>
Authored: Tue Feb 9 00:06:48 2016 -0500
Committer: joewitt <jo...@apache.org>
Committed: Tue Feb 9 20:48:56 2016 -0500
----------------------------------------------------------------------
.../apache/nifi/web/api/dto/StateMapDTO.java | 15 +++++
.../cluster/manager/impl/WebClusterManager.java | 15 ++++-
.../nifi/controller/state/SortedStateUtils.java | 62 ++++++++++++++++++++
.../org/apache/nifi/web/api/dto/DtoFactory.java | 14 ++++-
.../partials/canvas/component-state-dialog.jsp | 16 +++--
.../src/main/webapp/css/component-state.css | 9 +++
.../webapp/js/nf/canvas/nf-component-state.js | 21 ++++++-
.../js/nf/canvas/nf-processor-configuration.js | 4 +-
8 files changed, 144 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/StateMapDTO.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/StateMapDTO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/StateMapDTO.java
index be5e808..6f67287 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/StateMapDTO.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/StateMapDTO.java
@@ -28,6 +28,7 @@ import java.util.List;
public class StateMapDTO {
private String scope;
+ private int totalEntryCount;
private List<StateEntryDTO> state;
/**
@@ -45,6 +46,20 @@ public class StateMapDTO {
}
/**
+ * @return The total number of state entries. When the state map is lengthy, only of portion of the entries are returned.
+ */
+ @ApiModelProperty(
+ value = "The total number of state entries. When the state map is lengthy, only of portion of the entries are returned."
+ )
+ public int getTotalEntryCount() {
+ return totalEntryCount;
+ }
+
+ public void setTotalEntryCount(int totalEntryCount) {
+ this.totalEntryCount = totalEntryCount;
+ }
+
+ /**
* @return The state
*/
@ApiModelProperty(
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java
index a8f6118..e98e8e7 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java
@@ -151,6 +151,7 @@ import org.apache.nifi.controller.service.ControllerServiceNode;
import org.apache.nifi.controller.service.ControllerServiceProvider;
import org.apache.nifi.controller.service.ControllerServiceState;
import org.apache.nifi.controller.service.StandardControllerServiceProvider;
+import org.apache.nifi.controller.state.SortedStateUtils;
import org.apache.nifi.controller.state.manager.StandardStateManagerProvider;
import org.apache.nifi.controller.status.ProcessGroupStatus;
import org.apache.nifi.controller.status.RemoteProcessGroupStatus;
@@ -2574,8 +2575,9 @@ public class WebClusterManager implements HttpClusterManager, ProtocolHandler, C
}
private void mergeComponentState(final ComponentStateDTO componentState, Map<NodeIdentifier, ComponentStateDTO> componentStateMap) {
- final List<StateEntryDTO> localStateEntries = new ArrayList<>();
+ List<StateEntryDTO> localStateEntries = new ArrayList<>();
+ int totalStateEntries = 0;
for (final Map.Entry<NodeIdentifier, ComponentStateDTO> nodeEntry : componentStateMap.entrySet()) {
final ComponentStateDTO nodeComponentState = nodeEntry.getValue();
final NodeIdentifier nodeId = nodeEntry.getKey();
@@ -2583,6 +2585,8 @@ public class WebClusterManager implements HttpClusterManager, ProtocolHandler, C
final StateMapDTO nodeLocalStateMap = nodeComponentState.getLocalState();
if (nodeLocalStateMap.getState() != null) {
+ totalStateEntries += nodeLocalStateMap.getTotalEntryCount();
+
for (final StateEntryDTO nodeStateEntry : nodeLocalStateMap.getState()) {
nodeStateEntry.setClusterNodeId(nodeId.getId());
nodeStateEntry.setClusterNodeAddress(nodeAddress);
@@ -2591,7 +2595,16 @@ public class WebClusterManager implements HttpClusterManager, ProtocolHandler, C
}
}
+ // ensure appropriate sort
+ Collections.sort(localStateEntries, SortedStateUtils.getEntryDtoComparator());
+
+ // sublist if necessary
+ if (localStateEntries.size() > SortedStateUtils.MAX_COMPONENT_STATE_ENTRIES) {
+ localStateEntries = localStateEntries.subList(0, SortedStateUtils.MAX_COMPONENT_STATE_ENTRIES);
+ }
+
// add all the local state entries
+ componentState.getLocalState().setTotalEntryCount(totalStateEntries);
componentState.getLocalState().setState(localStateEntries);
}
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/state/SortedStateUtils.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/state/SortedStateUtils.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/state/SortedStateUtils.java
new file mode 100644
index 0000000..2eb8f22
--- /dev/null
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/state/SortedStateUtils.java
@@ -0,0 +1,62 @@
+/*
+ * 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.nifi.controller.state;
+
+import org.apache.nifi.web.api.dto.StateEntryDTO;
+
+import java.text.Collator;
+import java.util.Comparator;
+import java.util.Locale;
+
+public class SortedStateUtils {
+
+ /**
+ * The maximum number of state entries to return to a client
+ */
+ public static final int MAX_COMPONENT_STATE_ENTRIES = 500;
+
+ /**
+ * Gets a comparator for comparing state entry keys.
+ *
+ * @return comparator for comparing state entry keys
+ */
+ public static Comparator<String> getKeyComparator() {
+ final Collator collator = Collator.getInstance(Locale.US);
+ return new Comparator<String>() {
+ @Override
+ public int compare(String s1, String s2) {
+ return collator.compare(s1, s2);
+ }
+ };
+ }
+
+ /**
+ * Gets a comparator for comparing state entry keys.
+ *
+ * @return comparator for comparing state entry keys
+ */
+ public static Comparator<StateEntryDTO> getEntryDtoComparator() {
+ final Collator collator = Collator.getInstance(Locale.US);
+ return new Comparator<StateEntryDTO>() {
+ @Override
+ public int compare(StateEntryDTO o1, StateEntryDTO o2) {
+ return collator.compare(o1.getKey(), o2.getKey());
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index 339b725..652fd04 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -71,6 +71,7 @@ import org.apache.nifi.controller.repository.claim.ContentClaim;
import org.apache.nifi.controller.repository.claim.ResourceClaim;
import org.apache.nifi.controller.service.ControllerServiceNode;
import org.apache.nifi.controller.service.ControllerServiceReference;
+import org.apache.nifi.controller.state.SortedStateUtils;
import org.apache.nifi.controller.status.ConnectionStatus;
import org.apache.nifi.controller.status.PortStatus;
import org.apache.nifi.controller.status.ProcessGroupStatus;
@@ -137,11 +138,13 @@ import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
@@ -319,14 +322,21 @@ public final class DtoFactory {
final StateMapDTO dto = new StateMapDTO();
dto.setScope(scope.toString());
- final List<StateEntryDTO> stateEntries = new ArrayList<>();
+ final TreeMap<String, String> sortedState = new TreeMap(SortedStateUtils.getKeyComparator());
final Map<String, String> state = stateMap.toMap();
- for (final Map.Entry<String, String> entry : state.entrySet()) {
+ sortedState.putAll(state);
+
+ int count = 0;
+ final List<StateEntryDTO> stateEntries = new ArrayList<>();
+ final Set<Map.Entry<String, String>> entrySet = sortedState.entrySet();
+ for (final Iterator<Entry<String, String>> iter = entrySet.iterator(); iter.hasNext() && count++ < SortedStateUtils.MAX_COMPONENT_STATE_ENTRIES;) {
+ final Map.Entry<String, String> entry = iter.next();
final StateEntryDTO entryDTO = new StateEntryDTO();
entryDTO.setKey(entry.getKey());
entryDTO.setValue(entry.getValue());
stateEntries.add(entryDTO);
}
+ dto.setTotalEntryCount(state.size());
dto.setState(stateEntries);
return dto;
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/component-state-dialog.jsp
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/component-state-dialog.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/component-state-dialog.jsp
index abc1140..5338756 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/component-state-dialog.jsp
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/component-state-dialog.jsp
@@ -29,13 +29,19 @@
<div id="component-state-description" class="ellipsis multiline"></div>
</div>
</div>
- <div id="component-state-filter-controls">
- <div id="component-state-filter-container">
- <input type="text" id="component-state-filter"/>
+ <div>
+ <div id="component-state-partial-results-container" class="hidden">
+ Showing partial results
</div>
- <div id="component-state-filter-status">
- Displaying <span id="displayed-component-state-entries"></span> of <span id="total-component-state-entries"></span>
+ <div id="component-state-filter-controls">
+ <div id="component-state-filter-container">
+ <input type="text" id="component-state-filter"/>
+ </div>
+ <div id="component-state-filter-status">
+ Displaying <span id="displayed-component-state-entries"></span> of <span id="total-component-state-entries"></span>
+ </div>
</div>
+ <div class="clear"></div>
</div>
<div id="component-state-table"></div>
<div id="clear-link-container">
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/component-state.css
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/component-state.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/component-state.css
index 34797b1..b3f321e 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/component-state.css
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/component-state.css
@@ -39,6 +39,15 @@
Component state filter
*/
+#component-state-partial-results-container {
+ float: left;
+ color: #9f6000;
+ font-size: 9px;
+ font-weight: bold;
+ line-height: normal;
+ margin-top: 34px;
+}
+
#component-state-filter-controls {
float: right;
margin-top: 10px;
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-component-state.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-component-state.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-component-state.js
index 769256c..fd2f4f6 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-component-state.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-component-state.js
@@ -121,6 +121,9 @@ nf.ComponentState = (function () {
var componentStateData = componentStateGrid.getData();
componentStateData.setItems([]);
+ // hide the partial results details message
+ $('#component-state-partial-results-container').hide();
+
// clear the total number entries
$('#displayed-component-state-entries').text('0');
$('#total-component-state-entries').text('0');
@@ -133,6 +136,8 @@ nf.ComponentState = (function () {
*/
var loadComponentState = function (localState, clusterState) {
var count = 0;
+ var totalEntries = 0;
+ var showPartialDetails = false;
var componentStateGrid = $('#component-state-table').data('gridInstance');
var componentStateData = componentStateGrid.getData();
@@ -148,6 +153,11 @@ nf.ComponentState = (function () {
scope: stateEntry.clusterNodeAddress
}, stateEntry));
});
+ totalEntries += localState.totalEntryCount;
+
+ if (nf.Common.isDefinedAndNotNull(localState.state) && localState.totalEntryCount !== localState.state.length) {
+ showPartialDetails = true;
+ }
}
if (nf.Common.isDefinedAndNotNull(clusterState)) {
@@ -157,14 +167,23 @@ nf.ComponentState = (function () {
scope: 'Cluster'
}, stateEntry));
});
+ totalEntries += clusterState.totalEntryCount;
+
+ if (nf.Common.isDefinedAndNotNull(clusterState.state) && clusterState.totalEntryCount !== clusterState.state.length) {
+ showPartialDetails = true;
+ }
}
// complete the update
componentStateData.endUpdate();
componentStateData.reSort();
+ if (showPartialDetails) {
+ $('#component-state-partial-results-container').show();
+ }
+
// update the total number of state entries
- $('#total-component-state-entries').text(count);
+ $('#total-component-state-entries').text(nf.Common.formatInteger(totalEntries));
};
/**
http://git-wip-us.apache.org/repos/asf/nifi/blob/f4487dd5/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
index 872555c..2bbb813 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
@@ -590,15 +590,13 @@ nf.ProcessorConfiguration = (function () {
}
// once everything is loaded, show the dialog
- $.when.apply(window, requests).done(function (processorResponse, historyResponse, stateResponse) {
+ $.when.apply(window, requests).done(function (processorResponse, historyResponse) {
// get the updated processor
processor = processorResponse[0].processor;
// get the processor history
var processorHistory = historyResponse[0].componentHistory;
- console.log(stateResponse);
-
// record the processor details
$('#processor-configuration').data('processorDetails', processor);