You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ra...@apache.org on 2008/05/22 13:38:34 UTC
svn commit: r659082 - in /activemq/trunk/activemq-core/src:
main/java/org/apache/activemq/util/BitArrayBin.java
test/java/org/apache/activemq/ActiveMQMessageAuditTest.java
test/java/org/apache/activemq/util/BitArrayBinTest.java
Author: rajdavies
Date: Thu May 22 04:38:33 2008
New Revision: 659082
URL: http://svn.apache.org/viewvc?rev=659082&view=rev
Log:
Apply patch for https://issues.apache.org/activemq/browse/AMQ-1742
Added:
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/util/BitArrayBinTest.java (with props)
Modified:
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/util/BitArrayBin.java
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ActiveMQMessageAuditTest.java
Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/util/BitArrayBin.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/util/BitArrayBin.java?rev=659082&r1=659081&r2=659082&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/main/java/org/apache/activemq/util/BitArrayBin.java (original)
+++ activemq/trunk/activemq-core/src/main/java/org/apache/activemq/util/BitArrayBin.java Thu May 22 04:38:33 2008
@@ -28,7 +28,6 @@
private LinkedList<BitArray> list;
private int maxNumberOfArrays;
private int firstIndex = -1;
- private int firstBin = -1;
private long lastInOrderBit=-1;
/**
@@ -54,16 +53,13 @@
* @return true if set
*/
public boolean setBit(long index, boolean value) {
- boolean answer = true;
+ boolean answer = false;
BitArray ba = getBitArray(index);
if (ba != null) {
int offset = getOffset(index);
if (offset >= 0) {
answer = ba.set(offset, value);
}
- if (value) {
- }else {
- }
}
return answer;
}
@@ -117,14 +113,16 @@
int bin = getBin(index);
BitArray answer = null;
if (bin >= 0) {
- if (firstIndex < 0) {
- firstIndex = 0;
- }
- if (bin >= list.size()) {
- list.removeFirst();
- firstIndex += BitArray.LONG_SIZE;
- list.add(new BitArray());
- bin = list.size() - 1;
+ if (bin >= maxNumberOfArrays) {
+ int overShoot = bin - maxNumberOfArrays + 1;
+ while (overShoot > 0) {
+ list.removeFirst();
+ firstIndex += BitArray.LONG_SIZE;
+ list.add(new BitArray());
+ overShoot--;
+ }
+
+ bin = maxNumberOfArrays - 1;
}
answer = list.get(bin);
if (answer == null) {
@@ -143,8 +141,8 @@
*/
private int getBin(long index) {
int answer = 0;
- if (firstBin < 0) {
- firstBin = 0;
+ if (firstIndex < 0) {
+ firstIndex = (int) (index - (index % BitArray.LONG_SIZE));
} else if (firstIndex >= 0) {
answer = (int)((index - firstIndex) / BitArray.LONG_SIZE);
}
Modified: activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ActiveMQMessageAuditTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ActiveMQMessageAuditTest.java?rev=659082&r1=659081&r2=659082&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ActiveMQMessageAuditTest.java (original)
+++ activemq/trunk/activemq-core/src/test/java/org/apache/activemq/ActiveMQMessageAuditTest.java Thu May 22 04:38:33 2008
@@ -67,8 +67,9 @@
list.add(id);
assertFalse(audit.isDuplicate(id));
}
- for (String id : list) {
- assertTrue(audit.isDuplicate(id));
+ List<String> windowList = list.subList(list.size() -1 -audit.getAuditDepth(), list.size() -1);
+ for (String id : windowList) {
+ assertTrue("duplicate, id:" + id, audit.isDuplicate(id));
}
}
@@ -90,8 +91,9 @@
list.add(msg);
assertFalse(audit.isDuplicate(msg.getMessageId()));
}
- for (MessageReference msg : list) {
- assertTrue(audit.isDuplicate(msg));
+ List<MessageReference> windowList = list.subList(list.size() -1 -audit.getAuditDepth(), list.size() -1);
+ for (MessageReference msg : windowList) {
+ assertTrue("duplicate msg:" + msg, audit.isDuplicate(msg));
}
}
Added: activemq/trunk/activemq-core/src/test/java/org/apache/activemq/util/BitArrayBinTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/util/BitArrayBinTest.java?rev=659082&view=auto
==============================================================================
--- activemq/trunk/activemq-core/src/test/java/org/apache/activemq/util/BitArrayBinTest.java (added)
+++ activemq/trunk/activemq-core/src/test/java/org/apache/activemq/util/BitArrayBinTest.java Thu May 22 04:38:33 2008
@@ -0,0 +1,108 @@
+package org.apache.activemq.util;
+
+import junit.framework.TestCase;
+
+public class BitArrayBinTest extends TestCase {
+
+ public void testSetAroundWindow() throws Exception {
+ doTestSetAroundWindow(500, 2000);
+ doTestSetAroundWindow(512, 2000);
+ doTestSetAroundWindow(128, 512);
+ }
+
+ private void doTestSetAroundWindow(int window, int dataSize) throws Exception {
+
+ BitArrayBin toTest = new BitArrayBin(window);
+
+ for (int i=0; i <= dataSize; i++) {
+ assertTrue("not already set", !toTest.setBit(i, Boolean.TRUE));
+ }
+
+ int windowOfValidData = roundWindow(dataSize, window);
+ int i=dataSize;
+ for (; i >= dataSize -windowOfValidData; i--) {
+ assertTrue("was already set, id=" + i, toTest.setBit(i, Boolean.TRUE));
+ }
+
+ for (; i >= 0; i--) {
+ assertTrue("was not already set, id=" + i, !toTest.setBit(i, Boolean.TRUE));
+ }
+
+ for (int j= dataSize +1; j<(2*dataSize); j++) {
+ assertTrue("not already set: id=" + j, !toTest.setBit(j, Boolean.TRUE));
+ }
+ }
+
+ public void testSetUnsetAroundWindow() throws Exception {
+ doTestSetUnSetAroundWindow(500, 2000);
+ doTestSetUnSetAroundWindow(512, 2000);
+ doTestSetUnSetAroundWindow(128, 512);
+ }
+
+ private void doTestSetUnSetAroundWindow(int dataSize, int window) throws Exception {
+
+ BitArrayBin toTest = new BitArrayBin(window);
+
+ for (int i=0; i <=dataSize; i++) {
+ assertTrue("not already set", !toTest.setBit(i, Boolean.TRUE));
+ }
+
+ int windowOfValidData = roundWindow(dataSize, window);
+ for (int i=dataSize; i >= 0 && i >=dataSize -windowOfValidData; i--) {
+ assertTrue("was already set, id=" + i, toTest.setBit(i, Boolean.FALSE));
+ }
+
+ for (int i=0; i <=dataSize; i++) {
+ assertTrue("not already set, id:" + i, !toTest.setBit(i, Boolean.TRUE));
+ }
+
+ for (int j= 2*dataSize; j< 4*dataSize; j++) {
+ assertTrue("not already set: id=" + j, !toTest.setBit(j, Boolean.TRUE));
+ }
+ }
+
+ public void testSetAroundLongSizeMultiplier() throws Exception {
+ int window = 512;
+ int dataSize = 1000;
+ for (int muliplier=1; muliplier <8; muliplier++) {
+ for (int value=0; value <dataSize; value++) {
+ BitArrayBin toTest = new BitArrayBin(window);
+
+ int instance = value +muliplier*BitArray.LONG_SIZE;
+ assertTrue("not already set: id=" + instance, !toTest.setBit(instance, Boolean.TRUE));
+ assertTrue("not already set: id=" + value, !toTest.setBit(value, Boolean.TRUE));
+ }
+ }
+ }
+
+ public void testLargeGapInData(int window) throws Exception {
+ doTestLargeGapInData(128);
+ doTestLargeGapInData(500);
+ }
+
+ public void doTestLargeGapInData(int window) throws Exception {
+ BitArrayBin toTest = new BitArrayBin(window);
+
+ int instance = BitArray.LONG_SIZE;
+ assertTrue("not already set: id=" + instance, !toTest.setBit(instance, Boolean.TRUE));
+
+ instance = 12 *BitArray.LONG_SIZE;
+ assertTrue("not already set: id=" + instance, !toTest.setBit(instance, Boolean.TRUE));
+
+ instance = 9 *BitArray.LONG_SIZE;
+ assertTrue("not already set: id=" + instance, !toTest.setBit(instance, Boolean.TRUE));
+ }
+
+ // window moves in increments of BitArray.LONG_SIZE.
+ // valid data window on low end can be larger than window
+ private int roundWindow(int dataSetEnd, int windowSize) {
+
+ int validData = dataSetEnd - windowSize;
+ int validDataBin = validData / BitArray.LONG_SIZE;
+ validDataBin += (windowSize % BitArray.LONG_SIZE > 0? 1:0);
+ int startOfValid = validDataBin * BitArray.LONG_SIZE;
+
+ return dataSetEnd - startOfValid;
+ }
+
+}
Propchange: activemq/trunk/activemq-core/src/test/java/org/apache/activemq/util/BitArrayBinTest.java
------------------------------------------------------------------------------
svn:eol-style = native