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&nbsp;<span id="displayed-component-state-entries"></span>&nbsp;of&nbsp;<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&nbsp;<span id="displayed-component-state-entries"></span>&nbsp;of&nbsp;<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);