diff --git a/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java b/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java index 5fba87532..3794d8ebd 100644 --- a/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java +++ b/org.apache.ace.log/src/org/apache/ace/log/server/store/impl/LogStoreImpl.java @@ -554,6 +554,10 @@ public Event put(String targetID, int type, Dictionary dict) throws IOException // 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 list = new ArrayList<>(); list.add(result); @@ -577,6 +581,7 @@ public void setLowestID(String targetID, long logID, long lowestID) throws IOExc 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 @@ private long getLowestIDInternal(String targetID, long logID) { 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 { diff --git a/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java b/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java index a072df3c2..8f9aee93f 100644 --- a/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java +++ b/org.apache.ace.log/test/org/apache/ace/log/server/store/impl/ServerLogStoreTester.java @@ -26,6 +26,7 @@ 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 void testLogLowestID() throws IOException { assert stored.size() == 0 : "No events should have been stored"; } - private List getStoredEvents() throws IOException { + @SuppressWarnings("serial") + @Test(groups = { UNIT }) + public void testLogIDGenerationWithLowestID() throws IOException { + Dictionary 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 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 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 getStoredEvents() throws IOException { List stored = new ArrayList(); 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;