# HG changeset patch # User Roman Kennke # Date 1361887000 -3600 # Node ID db242eb1da340491be9bc8b1e158bb3810be7018 # Parent db2b89cdef62743cf59a78ca14c51f939ae71ab6 Fix storage purge and update agent info. Reviewed-by: neugens, jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-February/005870.html PR 1313 diff -r db2b89cdef62 -r db242eb1da34 agent/core/src/main/java/com/redhat/thermostat/agent/Agent.java --- a/agent/core/src/main/java/com/redhat/thermostat/agent/Agent.java Fri Feb 22 16:53:10 2013 +0100 +++ b/agent/core/src/main/java/com/redhat/thermostat/agent/Agent.java Tue Feb 26 14:56:40 2013 +0100 @@ -148,6 +148,7 @@ public synchronized void start() throws LaunchException { if (!started) { agentInfo = createAgentInformation(); + agentInfo.setAgentId(id.toString()); agentDao.addAgentInformation(agentInfo); backendRegistry.start(); @@ -203,7 +204,7 @@ System.out.println("purging database"); logger.info("purging database"); agentDao.removeAgentInformation(agentInfo); - storage.purge(); + storage.purge(agentInfo.getAgentId()); } private void updateAgentStatusToStopped() { diff -r db2b89cdef62 -r db242eb1da34 agent/core/src/test/java/com/redhat/thermostat/agent/AgentTest.java --- a/agent/core/src/test/java/com/redhat/thermostat/agent/AgentTest.java Fri Feb 22 16:53:10 2013 +0100 +++ b/agent/core/src/test/java/com/redhat/thermostat/agent/AgentTest.java Tue Feb 26 14:56:40 2013 +0100 @@ -39,8 +39,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; - import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -48,6 +48,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.UUID; + import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -106,7 +108,8 @@ public void testStartAgent() throws Exception { // Start agent. - Agent agent = new Agent(backendRegistry, config, storage, agentInfoDao, backendInfoDao); + UUID uuid = UUID.randomUUID(); + Agent agent = new Agent(backendRegistry, uuid, config, storage, agentInfoDao, backendInfoDao); agent.start(); @@ -116,6 +119,7 @@ verify(agentInfoDao).addAgentInformation(argument.capture()); assertEquals(123, argument.getValue().getStartTime()); + assertEquals(uuid.toString(), argument.getValue().getAgentId()); } @Test @@ -168,7 +172,8 @@ @Test public void testStopAgentWithPurging() throws Exception { - Agent agent = new Agent(backendRegistry, config, storage, agentInfoDao, backendInfoDao); + UUID uuid = UUID.randomUUID(); + Agent agent = new Agent(backendRegistry, uuid, config, storage, agentInfoDao, backendInfoDao); agent.start(); // stop agent @@ -178,7 +183,7 @@ ArgumentCaptor argument = ArgumentCaptor.forClass(AgentInformation.class); verify(agentInfoDao, never()).updateAgentInformation(argument.capture()); - verify(storage, times(1)).purge(); + verify(storage, times(1)).purge(uuid.toString()); } @Test @@ -197,7 +202,7 @@ verify(backendRegistry).stop(); verify(agentInfoDao).updateAgentInformation(isA(AgentInformation.class)); - verify(storage, times(0)).purge(); + verify(storage, times(0)).purge(anyString()); } } diff -r db2b89cdef62 -r db242eb1da34 storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java --- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java Fri Feb 22 16:53:10 2013 +0100 +++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java Tue Feb 26 14:56:40 2013 +0100 @@ -41,11 +41,14 @@ import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import com.redhat.thermostat.storage.model.Pojo; public final class QueuedStorage implements Storage { + private static final int SHUTDOWN_TIMEOUT_SECONDS = 3; + private class QueuedReplace extends BasePut implements Replace { @Override @@ -186,13 +189,13 @@ } @Override - public void purge() { + public void purge(final String agentId) { executor.execute(new Runnable() { @Override public void run() { - delegate.purge(); + delegate.purge(agentId); } }); @@ -275,8 +278,18 @@ @Override public void shutdown() { delegate.shutdown(); - executor.shutdown(); - fileExecutor.shutdown(); + try { + executor.shutdown(); + executor.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + // Fall through. + } + try { + fileExecutor.shutdown(); + fileExecutor.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + // Fall through. + } } } diff -r db2b89cdef62 -r db242eb1da34 storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java --- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java Fri Feb 22 16:53:10 2013 +0100 +++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java Tue Feb 26 14:56:40 2013 +0100 @@ -72,7 +72,7 @@ /** * Drop all data related to the currently running agent. */ - void purge(); + void purge(String agentId); long getCount(Category category); diff -r db2b89cdef62 -r db242eb1da34 storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java --- a/storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java Fri Feb 22 16:53:10 2013 +0100 +++ b/storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java Tue Feb 26 14:56:40 2013 +0100 @@ -77,6 +77,8 @@ private Runnable task; private boolean shutdown; + private long awaitTerminationTimeout; + private TimeUnit awaitTerminationTimeUnit; @Override public void execute(Runnable task) { @@ -111,12 +113,20 @@ } @Override - public boolean awaitTermination(long timeout, TimeUnit unit) - throws InterruptedException { - // Not used. + public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { + awaitTerminationTimeout = timeout; + awaitTerminationTimeUnit = unit; return true; } + long getAwaitTerminationTimeout() { + return awaitTerminationTimeout; + } + + TimeUnit getAwaitTerminationTimeUnit() { + return awaitTerminationTimeUnit; + } + @Override public Future submit(Callable task) { // Not used. @@ -290,13 +300,13 @@ @Test public void testPurge() { - queuedStorage.purge(); + queuedStorage.purge("fluff"); Runnable r = executor.getTask(); assertNotNull(r); verifyZeroInteractions(delegateStorage); r.run(); - verify(delegateStorage, times(1)).purge(); + verify(delegateStorage, times(1)).purge("fluff"); verifyNoMoreInteractions(delegateStorage); assertNull(fileExecutor.getTask()); @@ -413,7 +423,11 @@ queuedStorage.shutdown(); verify(delegateStorage).shutdown(); assertTrue(executor.isShutdown()); + assertEquals(3, executor.getAwaitTerminationTimeout()); + assertEquals(TimeUnit.SECONDS, executor.getAwaitTerminationTimeUnit()); assertTrue(fileExecutor.isShutdown()); + assertEquals(3, fileExecutor.getAwaitTerminationTimeout()); + assertEquals(TimeUnit.SECONDS, fileExecutor.getAwaitTerminationTimeUnit()); } } diff -r db2b89cdef62 -r db242eb1da34 storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java --- a/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java Fri Feb 22 16:53:10 2013 +0100 +++ b/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java Tue Feb 26 14:56:40 2013 +0100 @@ -216,8 +216,8 @@ @Override - public void purge() { - BasicDBObject query = new BasicDBObject(Key.AGENT_ID.getName(), getAgentId()); + public void purge(String agentId) { + BasicDBObject query = new BasicDBObject(Key.AGENT_ID.getName(), agentId); for (DBCollection coll : collectionCache.values()) { coll.remove(query); } diff -r db2b89cdef62 -r db242eb1da34 web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebCursor.java --- a/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebCursor.java Fri Feb 22 16:53:10 2013 +0100 +++ b/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebCursor.java Tue Feb 26 14:56:40 2013 +0100 @@ -37,6 +37,8 @@ package com.redhat.thermostat.web.client.internal; +import java.util.NoSuchElementException; + import com.redhat.thermostat.storage.core.Cursor; import com.redhat.thermostat.storage.model.Pojo; @@ -57,6 +59,9 @@ @Override public T next() { + if (index >= data.length) { + throw new NoSuchElementException(); + } T result = data[index]; index++; return result; diff -r db2b89cdef62 -r db242eb1da34 web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java --- a/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java Fri Feb 22 16:53:10 2013 +0100 +++ b/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java Tue Feb 26 14:56:40 2013 +0100 @@ -515,8 +515,10 @@ } @Override - public void purge() throws StorageException { - post(endpoint + "/purge", (HttpEntity) null).close(); + public void purge(String agentId) throws StorageException { + NameValuePair agentIdParam = new BasicNameValuePair("agentId", agentId); + List agentIdParams = Arrays.asList(agentIdParam); + post(endpoint + "/purge", agentIdParams).close(); } @Override diff -r db2b89cdef62 -r db242eb1da34 web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java --- a/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java Fri Feb 22 16:53:10 2013 +0100 +++ b/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java Tue Feb 26 14:56:40 2013 +0100 @@ -57,6 +57,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.UUID; import javax.servlet.ServletException; @@ -255,6 +256,12 @@ assertTrue(results.hasNext()); assertEquals("fluffor2", results.next().getProperty1()); assertFalse(results.hasNext()); + try { + results.next(); + fail(); + } catch (NoSuchElementException ex) { + // Pass. + } } @Test @@ -461,10 +468,16 @@ } @Test - public void testPurge() { - storage.purge(); + public void testPurge() throws UnsupportedEncodingException, IOException { + storage.purge("fluff"); assertEquals("POST", method); assertTrue(requestURI.endsWith("/purge")); + StringReader reader = new StringReader(requestBody); + BufferedReader bufRead = new BufferedReader(reader); + String line = URLDecoder.decode(bufRead.readLine(), "UTF-8"); + String[] parts = line.split("="); + assertEquals("agentId", parts[0]); + assertEquals("fluff", parts[1]); } @Test diff -r db2b89cdef62 -r db242eb1da34 web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java --- a/web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java Fri Feb 22 16:53:10 2013 +0100 +++ b/web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java Tue Feb 26 14:56:40 2013 +0100 @@ -214,7 +214,8 @@ } private void purge(HttpServletRequest req, HttpServletResponse resp) { - storage.purge(); + String agentId = req.getParameter("agentId"); + storage.purge(agentId); resp.setStatus(HttpServletResponse.SC_OK); } diff -r db2b89cdef62 -r db242eb1da34 web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java --- a/web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java Fri Feb 22 16:53:10 2013 +0100 +++ b/web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java Tue Feb 26 14:56:40 2013 +0100 @@ -459,9 +459,10 @@ HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); + conn.getOutputStream().write("agentId=fluff".getBytes()); int status = conn.getResponseCode(); assertEquals(200, status); - verify(mockStorage).purge(); + verify(mockStorage).purge("fluff"); } private void registerCategory() {