You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by jj...@apache.org on 2019/06/11 15:07:29 UTC

[geode] branch develop updated: GEODE-6851: Prevent Div by Zero in Pulse (#3694)

This is an automated email from the ASF dual-hosted git repository.

jjramos pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new bdcdf0c  GEODE-6851: Prevent Div by Zero in Pulse (#3694)
bdcdf0c is described below

commit bdcdf0c1171b77de87289c83ef7b5a680507eaac
Author: Juan José Ramos <ju...@users.noreply.github.com>
AuthorDate: Tue Jun 11 16:07:17 2019 +0100

    GEODE-6851: Prevent Div by Zero in Pulse (#3694)
    
    - Added Unit tests.
    - Prevent div by zero when updating client details per member in pulse.
---
 .../geode/tools/pulse/internal/data/Cluster.java   |  15 +-
 .../tools/pulse/internal/data/MemberTest.java      | 187 +++++++++++++++++++++
 2 files changed, 193 insertions(+), 9 deletions(-)

diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/Cluster.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/Cluster.java
index 74af659..d06af15 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/Cluster.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/Cluster.java
@@ -750,7 +750,6 @@ public class Cluster extends Thread {
     }
 
     public void updateMemberClientsHMap(HashMap<String, Cluster.Client> memberClientsHM) {
-
       if (Cluster.LAST_UPDATE_TIME == 0) {
         Cluster.LAST_UPDATE_TIME = System.nanoTime();
       }
@@ -778,11 +777,13 @@ public class Cluster extends Thread {
           existingClient.setUptime(updatedClient.getUptime());
 
           // set cpu usage
-          long lastCPUTime = existingClient.getProcessCpuTime();
           long currCPUTime = updatedClient.getProcessCpuTime();
+          long lastCPUTime = existingClient.getProcessCpuTime();
 
-          double newCPUTime =
-              (double) (((currCPUTime - lastCPUTime) / elapsedTime) / 1_000_000_000L);
+          double newCPUTime = 0;
+          if (elapsedTime > 0) {
+            newCPUTime = (double) (((currCPUTime - lastCPUTime) / elapsedTime) / 1_000_000_000L);
+          }
 
           double newCPUUsage = 0;
           int availableCpus = updatedClient.getCpus();
@@ -792,16 +793,14 @@ public class Cluster extends Thread {
 
           existingClient.setCpuUsage(newCPUUsage);
           existingClient.setProcessCpuTime(currCPUTime);
-
         } else {
           // Add client to clients list
           memberClientsHMap.put(clientId, client);
         }
-
       }
 
       // Remove unwanted entries from clients list
-      HashMap<String, Cluster.Client> memberClientsHMapNew = new HashMap<String, Cluster.Client>();
+      HashMap<String, Cluster.Client> memberClientsHMapNew = new HashMap<>();
       for (Map.Entry<String, Cluster.Client> entry : memberClientsHMap.entrySet()) {
         String clientId = entry.getKey();
         if (memberClientsHM.get(clientId) != null) {
@@ -813,9 +812,7 @@ public class Cluster extends Thread {
 
       // update last update time
       Cluster.LAST_UPDATE_TIME = systemNanoTime;
-
     }
-
   }
 
   /**
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/internal/data/MemberTest.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/internal/data/MemberTest.java
new file mode 100644
index 0000000..eaa20a0
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/internal/data/MemberTest.java
@@ -0,0 +1,187 @@
+/*
+ * 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.geode.tools.pulse.internal.data;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+
+public class MemberTest {
+  private Cluster.Member member;
+
+  @Rule
+  public TestName testName = new TestName();
+
+  @Before
+  public void setUp() {
+    member = new Cluster.Member();
+  }
+
+  @Test
+  public void updateMemberClientsHMapShouldAddClientInformationIfItDoeNotExistAlready() {
+    Cluster.Client newClient = new Cluster.Client();
+    newClient.setId(testName.getMethodName());
+    newClient.setConnected(true);
+    newClient.setGets(1);
+    newClient.setPuts(2);
+    newClient.setCpus(3);
+    newClient.setQueueSize(4);
+    newClient.setStatus("Status");
+    newClient.setThreads(5);
+    newClient.setClientCQCount(6);
+    newClient.setSubscriptionEnabled(true);
+    newClient.setUptime(7);
+    newClient.setProcessCpuTime(8);
+    HashMap<String, Cluster.Client> updatedClientsMap = new HashMap<>();
+    updatedClientsMap.put(newClient.getId(), newClient);
+    member.updateMemberClientsHMap(updatedClientsMap);
+
+    Cluster.Client resultingClient = member.getMemberClientsHMap().get(testName.getMethodName());
+    assertThat(resultingClient).isNotNull();
+    assertThat(resultingClient.isConnected()).isTrue();
+    assertThat(resultingClient.getGets()).isEqualTo(1);
+    assertThat(resultingClient.getPuts()).isEqualTo(2);
+    assertThat(resultingClient.getCpus()).isEqualTo(3);
+    assertThat(resultingClient.getQueueSize()).isEqualTo(4);
+    assertThat(resultingClient.getStatus()).isEqualTo("Status");
+    assertThat(resultingClient.getThreads()).isEqualTo(5);
+    assertThat(resultingClient.getClientCQCount()).isEqualTo(6);
+    assertThat(resultingClient.isSubscriptionEnabled()).isTrue();
+    assertThat(resultingClient.getUptime()).isEqualTo(7);
+    assertThat(resultingClient.getProcessCpuTime()).isEqualTo(8);
+  }
+
+  @Test
+  public void updateMemberClientsHMapShouldUpdateExistingClientInformation() {
+    Cluster.Client existingClient = new Cluster.Client();
+    existingClient.setId(testName.getMethodName());
+    existingClient.setUptime(1);
+    existingClient.setProcessCpuTime(1000000000);
+    HashMap<String, Cluster.Client> existingClientsMap = new HashMap<>();
+    existingClientsMap.put(existingClient.getId(), existingClient);
+    member.setMemberClientsHMap(existingClientsMap);
+
+    Cluster.Client updatedClient = new Cluster.Client();
+    updatedClient.setId(testName.getMethodName());
+    updatedClient.setConnected(true);
+    updatedClient.setGets(30);
+    updatedClient.setPuts(60);
+    updatedClient.setCpus(5);
+    updatedClient.setQueueSize(5);
+    updatedClient.setStatus("Status");
+    updatedClient.setThreads(100);
+    updatedClient.setClientCQCount(0);
+    updatedClient.setSubscriptionEnabled(true);
+    updatedClient.setUptime(2);
+    updatedClient.setProcessCpuTime(2000000000);
+    HashMap<String, Cluster.Client> updatedClientsMap = new HashMap<>();
+    updatedClientsMap.put(updatedClient.getId(), updatedClient);
+
+    member.updateMemberClientsHMap(updatedClientsMap);
+    Cluster.Client resultingClient = member.getMemberClientsHMap().get(testName.getMethodName());
+    assertThat(resultingClient).isNotNull();
+    assertThat(resultingClient.isConnected()).isTrue();
+    assertThat(resultingClient.getGets()).isEqualTo(30);
+    assertThat(resultingClient.getPuts()).isEqualTo(60);
+    assertThat(resultingClient.getCpus()).isEqualTo(5);
+    assertThat(resultingClient.getQueueSize()).isEqualTo(5);
+    assertThat(resultingClient.getStatus()).isEqualTo("Status");
+    assertThat(resultingClient.getThreads()).isEqualTo(100);
+    assertThat(resultingClient.getClientCQCount()).isEqualTo(0);
+    assertThat(resultingClient.isSubscriptionEnabled()).isTrue();
+    assertThat(resultingClient.getCpuUsage()).isEqualTo(0.2);
+    assertThat(resultingClient.getUptime()).isEqualTo(2);
+    assertThat(resultingClient.getProcessCpuTime()).isEqualTo(2000000000);
+  }
+
+  @Test
+  public void updateMemberClientsHMapShouldDeleteNonSeenClients() {
+    HashMap<String, Cluster.Client> existingClientsMap = new HashMap<>();
+    for (int i = 0; i < 100; i++) {
+      Cluster.Client existingClient = new Cluster.Client();
+      existingClient.setId(testName.getMethodName() + "_" + i);
+      existingClient.setUptime(1);
+      existingClient.setProcessCpuTime(1000000000);
+      existingClientsMap.put(existingClient.getId(), existingClient);
+    }
+    member.setMemberClientsHMap(existingClientsMap);
+
+    String remainingClientId = testName.getMethodName() + "_0";
+    Cluster.Client updatedClient = new Cluster.Client();
+    updatedClient.setId(remainingClientId);
+    updatedClient.setConnected(true);
+    updatedClient.setGets(30);
+    updatedClient.setPuts(60);
+    updatedClient.setCpus(5);
+    updatedClient.setQueueSize(5);
+    updatedClient.setStatus("Status");
+    updatedClient.setThreads(100);
+    updatedClient.setClientCQCount(0);
+    updatedClient.setSubscriptionEnabled(true);
+    updatedClient.setUptime(2);
+    updatedClient.setProcessCpuTime(2000000000);
+    HashMap<String, Cluster.Client> updatedClientsMap = new HashMap<>();
+    updatedClientsMap.put(updatedClient.getId(), updatedClient);
+
+    member.updateMemberClientsHMap(updatedClientsMap);
+    Map<String, Cluster.Client> clients = member.getMemberClientsHMap();
+    assertThat(clients.size()).isEqualTo(1);
+    Cluster.Client resultingClient = clients.get(remainingClientId);
+    assertThat(resultingClient).isNotNull();
+    assertThat(resultingClient.isConnected()).isTrue();
+    assertThat(resultingClient.getGets()).isEqualTo(30);
+    assertThat(resultingClient.getPuts()).isEqualTo(60);
+    assertThat(resultingClient.getCpus()).isEqualTo(5);
+    assertThat(resultingClient.getQueueSize()).isEqualTo(5);
+    assertThat(resultingClient.getStatus()).isEqualTo("Status");
+    assertThat(resultingClient.getThreads()).isEqualTo(100);
+    assertThat(resultingClient.getClientCQCount()).isEqualTo(0);
+    assertThat(resultingClient.isSubscriptionEnabled()).isTrue();
+    assertThat(resultingClient.getCpuUsage()).isEqualTo(0.2);
+    assertThat(resultingClient.getUptime()).isEqualTo(2);
+    assertThat(resultingClient.getProcessCpuTime()).isEqualTo(2000000000);
+  }
+
+  @Test
+  public void updateMemberClientsHMapShouldNotDivideByZero() {
+    Cluster.Client oldClient = new Cluster.Client();
+    oldClient.setId(testName.getMethodName());
+    oldClient.setCpus(0);
+    oldClient.setUptime(100);
+    HashMap<String, Cluster.Client> oldClientsMap = new HashMap<>();
+    oldClientsMap.put(oldClient.getId(), oldClient);
+    member.setMemberClientsHMap(oldClientsMap);
+
+    Cluster.Client newClient = new Cluster.Client();
+    newClient.setId(testName.getMethodName());
+    newClient.setCpus(0);
+    newClient.setUptime(100);
+    HashMap<String, Cluster.Client> newClientsMap = new HashMap<>();
+    newClientsMap.put(oldClient.getId(), oldClient);
+
+    assertThatCode(() -> member.updateMemberClientsHMap(newClientsMap)).doesNotThrowAnyException();
+    Cluster.Client resultingClient = member.getMemberClientsHMap().get(testName.getMethodName());
+    assertThat(resultingClient).isNotNull();
+    assertThat(resultingClient.getCpuUsage()).isEqualTo(0);
+    assertThat(resultingClient.getProcessCpuTime()).isEqualTo(0);
+  }
+}