Mercurial > hg > release > thermostat-0.7
changeset 709:decac7295693
MemoryStatController fetches data repeatedly
MemoryStatController currently fetches all data for the last hour
from the storage, even if already has that data. Only fetch new data
from the storage.
Reviewed-by: neugens
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-October/003788.html
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Mon, 22 Oct 2012 17:34:00 -0400 |
parents | da7f134762f6 |
children | 3a47a18e5b4a |
files | client/memory-stats-panel/src/main/java/com/redhat/thermostat/client/stats/memory/MemoryStatsController.java client/memory-stats-panel/src/test/java/com/redhat/thermostat/client/stats/memory/MemoryStatsControllerTest.java |
diffstat | 2 files changed, 68 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/client/memory-stats-panel/src/main/java/com/redhat/thermostat/client/stats/memory/MemoryStatsController.java Fri Oct 19 21:58:18 2012 +0200 +++ b/client/memory-stats-panel/src/main/java/com/redhat/thermostat/client/stats/memory/MemoryStatsController.java Mon Oct 22 17:34:00 2012 -0400 @@ -72,9 +72,12 @@ private VMCollector collector; class VMCollector implements Runnable { + + private long desiredUpdateTimeStamp = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1); + @Override public void run() { - List<VmMemoryStat> vmInfo = vmDao.getLatestVmMemoryStats(ref, System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1)); + List<VmMemoryStat> vmInfo = vmDao.getLatestVmMemoryStats(ref, desiredUpdateTimeStamp); for (VmMemoryStat memoryStats: vmInfo) { List<Generation> generations = memoryStats.getGenerations(); @@ -129,6 +132,7 @@ } view.requestRepaint(); + desiredUpdateTimeStamp = Math.max(desiredUpdateTimeStamp, memoryStats.getTimeStamp()); } } }
--- a/client/memory-stats-panel/src/test/java/com/redhat/thermostat/client/stats/memory/MemoryStatsControllerTest.java Fri Oct 19 21:58:18 2012 +0200 +++ b/client/memory-stats-panel/src/test/java/com/redhat/thermostat/client/stats/memory/MemoryStatsControllerTest.java Mon Oct 22 17:34:00 2012 -0400 @@ -40,14 +40,18 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.isA; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -71,6 +75,7 @@ private List<Generation> generations = new ArrayList<>(); + private VmMemoryStatDAO memoryStatDao; private MemoryStatsView view; private Timer timer; @@ -79,6 +84,7 @@ private MemoryStatsController controller; private Space canary; + @SuppressWarnings({ "unchecked", "rawtypes" }) @Before @@ -125,7 +131,7 @@ generations.get(0).spaces.add(canary); - VmMemoryStatDAO memoryStatDao = mock(VmMemoryStatDAO.class); + memoryStatDao = mock(VmMemoryStatDAO.class); when(memoryStatDao.getLatestVmMemoryStats(any(VmRef.class), anyLong())).thenReturn(vmInfo); view = mock(MemoryStatsView.class); @@ -200,6 +206,62 @@ assertEquals(tooltip, payload.getTooltip()); } + + @Test + public void testTimerFetchesMemoryDataDeltaOnly() { + ArgumentCaptor<Long> timeStampCaptor = ArgumentCaptor.forClass(Long.class); + + final long DATA_TIMESTAMP = System.currentTimeMillis() + 1000000000; + Space space = new Space(); + space.capacity = 10; + space.maxCapacity = 20; + space.used = 5; + Generation gen = new Generation(); + gen.name = "foobar"; + gen.spaces = Arrays.asList(space); + VmMemoryStat stat = new VmMemoryStat(); + stat.setTimeStamp(DATA_TIMESTAMP); + stat.setGenerations(Arrays.asList(gen)); + + when(memoryStatDao.getLatestVmMemoryStats(isA(VmRef.class), anyLong())).thenReturn(Arrays.asList(stat)); + + Runnable timerAction = controller.getCollector(); + + timerAction.run(); + timerAction.run(); + + verify(memoryStatDao, times(2)).getLatestVmMemoryStats(isA(VmRef.class), timeStampCaptor.capture()); + + long timeStamp1 = timeStampCaptor.getAllValues().get(0); + assertTimeStampIsAround(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1), timeStamp1); + + long timeStamp2 = timeStampCaptor.getAllValues().get(1); + assertTimeStampIsAround(DATA_TIMESTAMP, timeStamp2); + } + + @Test + public void testTimerFetchesMemoryDataDeltaOnlyEvenWithNoData() { + ArgumentCaptor<Long> timeStampCaptor = ArgumentCaptor.forClass(Long.class); + + Runnable timerAction = controller.getCollector(); + + timerAction.run(); + timerAction.run(); + + verify(memoryStatDao, times(2)).getLatestVmMemoryStats(isA(VmRef.class), timeStampCaptor.capture()); + + long timeStamp1 = timeStampCaptor.getAllValues().get(0); + assertTimeStampIsAround(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1), timeStamp1); + + long timeStamp2 = timeStampCaptor.getAllValues().get(1); + assertTimeStampIsAround(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1), timeStamp2); + } + + private void assertTimeStampIsAround(long expected, long actual) { + assertTrue(actual <= expected + 1000); + assertTrue(actual >= expected - 1000); + } + @After public void tearDown() { ApplicationContextUtil.resetApplicationContext();