You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ma...@apache.org on 2014/11/18 17:35:02 UTC

svn commit: r1640384 - in /ace/trunk/org.apache.ace.log: src/org/apache/ace/log/server/store/impl/LogStoreImpl.java test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java

Author: marrs
Date: Tue Nov 18 16:35:02 2014
New Revision: 1640384

URL: http://svn.apache.org/r1640384
Log:
ACE-495 Added a test and a fix for this bug.

Modified:
    ace/trunk/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java
    ace/trunk/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java

Modified: ace/trunk/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java?rev=1640384&r1=1640383&r2=1640384&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java (original)
+++ ace/trunk/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java Tue Nov 18 16:35:02 2014
@@ -554,6 +554,10 @@ public class LogStoreImpl implements Log
         	// re-fetch within the lock
         	descriptor = getDescriptorInternal(targetID, storeID);
             long high = descriptor.getRangeSet().getHigh();
+            long lowestID = getLowestIDInternal(targetID, storeID);
+            if (high < lowestID) {
+                high = lowestID - 1;
+            }
             Event result = new Event(targetID, storeID, high + 1, System.currentTimeMillis(), type, props);
             List<Event> list = new ArrayList<>();
             list.add(result);
@@ -577,6 +581,7 @@ public class LogStoreImpl implements Log
 		        	File index = getLogFileIndex(targetID, logID);
 					fw = new FileWriter(index);
 		        	fw.write(Long.toString(lowestID));
+		        	System.out.println("SLID: " + index.getAbsolutePath() + "=" + lowestID);
 		        	m_fileToLowestID.put(index.getAbsolutePath(), lowestID);
 		        }
 		        finally {
@@ -615,11 +620,13 @@ public class LogStoreImpl implements Log
     			br.close();
     			result = Long.parseLong(line);
     			m_fileToLowestID.put(index.getAbsolutePath(), result);
+                System.out.println("GLID: " + index.getAbsolutePath() + "=" + result);
     		}
     		catch (Exception nfe) {
     			// if the file somehow got corrupted, or does not exist,
     			// we simply assume 0 as the default
     			m_fileToLowestID.put(index.getAbsolutePath(), 0L);
+                System.out.println("GLID: " + index.getAbsolutePath() + "=0!!!");
     			return 0L;
     		}
     		finally {

Modified: ace/trunk/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java?rev=1640384&r1=1640383&r2=1640384&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java (original)
+++ ace/trunk/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java Tue Nov 18 16:35:02 2014
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -193,11 +194,63 @@ public class ServerLogStoreTester {
         assert stored.size() == 0 : "No events should have been stored";
     }
 
-	private List<Event> getStoredEvents() throws IOException {
+    @SuppressWarnings("serial")
+    @Test(groups = { UNIT })
+    public void testLogIDGenerationWithLowestID() throws IOException {
+        Dictionary<String, String> props = new Hashtable<>();
+        props.put("test", "foo");
+
+        long logID = 0;
+        for (long id = 1; id <= 20; id++) {
+            Event event = m_logStore.put("target", 1, props);
+            System.out.println("Event: " + event.toRepresentation());
+            logID = event.getStoreID();
+        }
+
+        List<Descriptor> descriptors = m_logStore.getDescriptors();
+        assert descriptors.size() == 1 : "Incorrect amount of ranges returned from store";
+        String range = descriptors.get(0).getRangeSet().toRepresentation();
+        assert range.equals("1-20") : "Incorrect range in descriptor: " + range;
+        List<Event> stored = getStoredEvents();
+        assert stored.size() == 20 : "Exactly 20 events should have been stored";
+        
+        m_logStore.setLowestID("target", logID, 10);
+        assert 10 == m_logStore.getLowestID("target", logID) : "Lowest ID should be 10, not: " + m_logStore.getLowestID("target", logID);
+        
+        stored = getStoredEvents();
+        assert stored.size() == 11 : "Exactly 11 events should have been stored, we found " + stored.size();
+        descriptors = m_logStore.getDescriptors();
+        assert descriptors.size() == 1 : "Incorrect amount of ranges returned from store";
+        range = descriptors.get(0).getRangeSet().toRepresentation();
+        assert range.equals("10-20") : "Incorrect range in descriptor: " + range;
+
+        m_logStore.setLowestID("target", logID, 21);
+        stored = getStoredEvents();
+        assert stored.size() == 0 : "No events should have been stored, we found " + stored.size();
+        descriptors = m_logStore.getDescriptors();
+        assert descriptors.size() == 1 : "Incorrect amount of ranges returned from store";
+        range = descriptors.get(0).getRangeSet().toRepresentation();
+        assert range.equals("") : "Incorrect range in descriptor: " + range;
+
+        for (long id = 1; id <= 20; id++) {
+            System.out.println("Event: " + m_logStore.put("target", 1, props).toRepresentation());
+        }
+        
+        stored = getStoredEvents();
+        assert stored.size() == 20 : "Exactly 20 events should have been stored, we found " + stored.size();
+        descriptors = m_logStore.getDescriptors();
+        assert descriptors.size() == 1 : "Incorrect amount of ranges returned from store";
+        range = descriptors.get(0).getRangeSet().toRepresentation();
+        assert range.equals("21-40") : "Incorrect range in descriptor: " + range;
+    }
+    
+    private List<Event> getStoredEvents() throws IOException {
 		List<Event> stored = new ArrayList<Event>();
         for (Descriptor range : m_logStore.getDescriptors()) {
+            System.out.println("TID: " + range.getTargetID());
             for (Descriptor range2 : m_logStore.getDescriptors(range.getTargetID())) {
                 stored.addAll(m_logStore.get(m_logStore.getDescriptor(range2.getTargetID(), range2.getStoreID())));
+                System.out.println("  Range: " + range2.getRangeSet());
             }
         }
 		return stored;