QuickFIX/J

SleepycatStore can enter infinite loop retrieving messages for resend.

Details

  • Type: Bug Bug
  • Status: Open Open
  • Priority: Major Major
  • Resolution: Unresolved
  • Affects Version/s: 1.3.3
  • Fix Version/s: None
  • Component/s: Engine
  • Labels:
    None

Description

SleepycatStore does not check returned OperationStatus from call to com.sleepycat.je.Cursor.getNext(...):

public synchronized void get(int startSequence, int endSequence, Collection<String> messages) throws IOException {
...
if (retVal == OperationStatus.NOTFOUND) {
log.debug(sequenceKey + "/" + messageBytes + " not matched in database "
+ messageDatabase.getDatabaseName());
return;
} else {
Integer sequenceNumber = (Integer) sequenceBinding.entryToObject(sequenceKey);
while (sequenceNumber.intValue() <= endSequence) {
messages.add(new String(messageBytes.getData(), charsetEncoding));
if (log.isDebugEnabled()) {
log.debug("Found record " + sequenceNumber + "=>"
+ new String(messageBytes.getData(), charsetEncoding) + " for search key/data: "
+ sequenceKey + "=>" + messageBytes);
}
cursor.getNext(sequenceKey, messageBytes, LockMode.DEFAULT);
sequenceNumber = (Integer) sequenceBinding.entryToObject(sequenceKey);
}
}
...
}

Should be:

public synchronized void get(int startSequence, int endSequence, Collection<String> messages) throws IOException {
...
if (retVal == OperationStatus.NOTFOUND) {
log.debug(sequenceKey + "/" + messageBytes + " not matched in database "
+ messageDatabase.getDatabaseName());
return;
} else {
Integer sequenceNumber = (Integer) sequenceBinding.entryToObject(sequenceKey);
while (retVal == OperationStatus.SUCCESS && sequenceNumber.intValue() <= endSequence) {
messages.add(new String(messageBytes.getData(), charsetEncoding));
if (log.isDebugEnabled()) {
log.debug("Found record " + sequenceNumber + "=>"
+ new String(messageBytes.getData(), charsetEncoding) + " for search key/data: "
+ sequenceKey + "=>" + messageBytes);
}
retVal = cursor.getNext(sequenceKey, messageBytes, LockMode.DEFAULT);
sequenceNumber = (Integer) sequenceBinding.entryToObject(sequenceKey);
}
}
...
}

Activity

Hide
James Olsen added a comment - 26/Aug/10 11:43 AM

For clarity, the changed lines are:

while (retVal == OperationStatus.SUCCESS && sequenceNumber.intValue() <= endSequence) {
...
}
retVal = cursor.getNext(sequenceKey, messageBytes, LockMode.DEFAULT);

Show
James Olsen added a comment - 26/Aug/10 11:43 AM For clarity, the changed lines are: while (retVal == OperationStatus.SUCCESS && sequenceNumber.intValue() <= endSequence) { ... } retVal = cursor.getNext(sequenceKey, messageBytes, LockMode.DEFAULT);

People

Vote (0)
Watch (0)

Dates

  • Created:
    26/Aug/10 11:42 AM
    Updated:
    26/Aug/10 11:43 AM