changeset 1000:db242eb1da34

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
author Roman Kennke <rkennke@redhat.com>
date Tue, 26 Feb 2013 14:56:40 +0100
parents db2b89cdef62
children a51dd3bfa1d1
files agent/core/src/main/java/com/redhat/thermostat/agent/Agent.java agent/core/src/test/java/com/redhat/thermostat/agent/AgentTest.java storage/core/src/main/java/com/redhat/thermostat/storage/core/QueuedStorage.java storage/core/src/main/java/com/redhat/thermostat/storage/core/Storage.java storage/core/src/test/java/com/redhat/thermostat/storage/core/QueuedStorageTest.java storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebCursor.java web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java web/server/src/main/java/com/redhat/thermostat/web/server/WebStorageEndPoint.java web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndpointTest.java
diffstat 11 files changed, 79 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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() {
--- 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<AgentInformation> 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());
     }
 }
 
--- 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. 
+        }
     }
 
 }
--- 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);
 
--- 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 <T> Future<T> submit(Callable<T> 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());
     }
 }
 
--- 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);
         }
--- 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;
--- 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<NameValuePair> agentIdParams = Arrays.asList(agentIdParam);
+        post(endpoint + "/purge", agentIdParams).close();
     }
 
     @Override
--- 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
--- 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);
     }
 
--- 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() {