Details
-
Type:
Bug
-
Status:
Open
-
Priority:
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);
}
}
...
}
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
- All
- Comments
- History
- Activity
- Subversion Commits
- Builds
For clarity, the changed lines are:
while (retVal == OperationStatus.SUCCESS && sequenceNumber.intValue() <= endSequence) {
...
}
retVal = cursor.getNext(sequenceKey, messageBytes, LockMode.DEFAULT);