changeset 1844:53fa7cb7fe48

Fix computation of GC time PR 2789 Reviewed-by: jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-January/017412.html
author Omair Majid <omajid@redhat.com>
date Fri, 15 Jan 2016 11:16:02 -0500
parents 4823f9e48b7a
children d06754b2b04f
files vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcDataExtractor.java vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListener.java vm-gc/agent/src/test/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListenerTest.java vm-gc/common/src/main/java/com/redhat/thermostat/vm/gc/common/model/VmGcStat.java
diffstat 4 files changed, 37 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcDataExtractor.java	Thu Dec 17 17:44:50 2015 -0500
+++ b/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcDataExtractor.java	Fri Jan 15 11:16:02 2016 -0500
@@ -81,5 +81,9 @@
         return update.getPerformanceCounterLong("sun.gc.collector." + collector + ".invocations");
     }
 
+    public Long getFrequency() throws VmUpdateException {
+        return update.getPerformanceCounterLong("sun.os.hrt.frequency");
+    }
+
 }
 
--- a/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListener.java	Thu Dec 17 17:44:50 2015 -0500
+++ b/vm-gc/agent/src/main/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListener.java	Fri Jan 15 11:16:02 2016 -0500
@@ -79,9 +79,12 @@
                         Long invocations = extractor.getCollectorInvocations(i);
                         if (invocations != null) {
                             Long time = extractor.getCollectorTime(i);
-                            if (time != null) {
+                            Long frequency = extractor.getFrequency();
+                            if (time != null && frequency!= null) {
+                                // TODO check for overflow
+                                long wallTimeInMicros = ((long) (1.0E6 * time / frequency));
                                 VmGcStat stat = new VmGcStat(writerId, vmId, timestamp,
-                                        name, invocations, time);
+                                        name, invocations, wallTimeInMicros);
                                 gcDAO.putVmGcStat(stat);
                             }
                             else {
--- a/vm-gc/agent/src/test/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListenerTest.java	Thu Dec 17 17:44:50 2015 -0500
+++ b/vm-gc/agent/src/test/java/com/redhat/thermostat/vm/gc/agent/internal/VmGcVmListenerTest.java	Fri Jan 15 11:16:02 2016 -0500
@@ -45,6 +45,7 @@
 import static org.mockito.Mockito.when;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -55,6 +56,9 @@
 import com.redhat.thermostat.vm.gc.common.model.VmGcStat;
 
 public class VmGcVmListenerTest {
+
+    private static final long OS_TICKS_PER_SECOND = 1_000_000;
+
     private static final String[] GC_NAMES = new String[] { "GC1", "GC2" };
     private static final Long[] GC_INVOCS = new Long[] { 500L, 1000L };
     private static final Long[] GC_TIMES = new Long[] { 5000L, 10000L };
@@ -77,6 +81,7 @@
             mockCollectorTime(i);
         }
         
+        when(extractor.getFrequency()).thenReturn(OS_TICKS_PER_SECOND);
         when(extractor.getTotalCollectors()).thenReturn((long) GC_NAMES.length);
     }
 
@@ -165,5 +170,21 @@
         vmListener.recordGcStat(extractor);
         verify(vmGcStatDAO, never()).putVmGcStat(any(VmGcStat.class));
     }
+
+    @Test
+    public void testRecordMemoryFrequencyMismatch() throws VmUpdateException {
+        final long SOME_FREQUENCY = 100l;
+        when(extractor.getFrequency()).thenReturn(SOME_FREQUENCY);
+        vmListener.recordGcStat(extractor);
+        ArgumentCaptor<VmGcStat> captor = ArgumentCaptor.forClass(VmGcStat.class);
+        verify(vmGcStatDAO, times(2)).putVmGcStat(captor.capture());
+        List<VmGcStat> gcStats = captor.getAllValues();
+
+        VmGcStat stat = gcStats.get(0);
+        assertEquals(GC_NAMES[0], stat.getCollectorName());
+        assertEquals(GC_INVOCS[0], (Long) stat.getRunCount());
+        assertEquals(TimeUnit.SECONDS.toMicros(GC_TIMES[0]/SOME_FREQUENCY), stat.getWallTime());
+    }
+
 }
 
--- a/vm-gc/common/src/main/java/com/redhat/thermostat/vm/gc/common/model/VmGcStat.java	Thu Dec 17 17:44:50 2015 -0500
+++ b/vm-gc/common/src/main/java/com/redhat/thermostat/vm/gc/common/model/VmGcStat.java	Fri Jan 15 11:16:02 2016 -0500
@@ -48,19 +48,19 @@
     private String vmId;
     private String collectorName;
     private long runCount;
-    private long wallTime;
+    private long wallTimeInMicros;
 
     public VmGcStat() {
         super(null);
     }
 
-    public VmGcStat(String writerId, String vmId, long timestamp, String collectorName, long runCount, long wallTime) {
+    public VmGcStat(String writerId, String vmId, long timestamp, String collectorName, long runCount, long wallTimeInMicros) {
         super(writerId);
         this.timeStamp = timestamp;
         this.vmId = vmId;
         this.collectorName = collectorName;
         this.runCount = runCount;
-        this.wallTime = wallTime;
+        this.wallTimeInMicros = wallTimeInMicros;
     }
 
     @Persist
@@ -93,14 +93,15 @@
         this.runCount = runCount;
     }
 
+    /** In microseconds */
     @Persist
     public long getWallTime() {
-        return wallTime;
+        return wallTimeInMicros;
     }
 
     @Persist
-    public void setWallTime(long wallTime) {
-        this.wallTime = wallTime;
+    public void setWallTime(long wallTimeInMicros) {
+        this.wallTimeInMicros = wallTimeInMicros;
     }
 
     @Override