diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java index a9001f1..1d84527 100644 --- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java +++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java @@ -658,18 +658,34 @@ private boolean sendBatch(DatabaseEntry key, final DatabaseEntry data) throws Exception { boolean errors = false; OperationStatus status; - Cursor cursor = database.openCursor(null, CursorConfig.DEFAULT); + Cursor cursor = null; try { - status = cursor.getFirst(key, data, null); - - final BatchEvent batch = new BatchEvent(); - for (int i = 0; status == OperationStatus.SUCCESS && i < batchSize; ++i) { - final SimpleEvent event = createEvent(data); - if (event != null) { - batch.addEvent(event); + final BatchEvent batch = new BatchEvent(); + for (int retryIndex = 0; retryIndex < lockTimeoutRetryCount; ++retryIndex) { + try { + cursor = database.openCursor(null, CursorConfig.DEFAULT); + status = cursor.getFirst(key, data, null); + + for (int i = 0; status == OperationStatus.SUCCESS && i < batchSize; ++i) { + final SimpleEvent event = createEvent(data); + if (event != null) { + batch.addEvent(event); + } + status = cursor.getNext(key, data, null); + } + break; + } catch (final LockConflictException lce) { + if (cursor != null) { + try { + cursor.close(); + cursor = null; + } catch (final Exception ex) { + LOGGER.trace("Ignored exception closing cursor during lock conflict."); + } + } } - status = cursor.getNext(key, data, null); - } + } + try { manager.send(batch); } catch (final Exception ioe) { @@ -677,8 +693,10 @@ errors = true; } if (!errors) { - cursor.close(); - cursor = null; + if (cursor != null) { + cursor.close(); + cursor = null; + } Transaction txn = null; Exception exception = null; for (int retryIndex = 0; retryIndex < lockTimeoutRetryCount; ++retryIndex) {