[#9254] DataFile readRecord fallback to OS file.length in rare edge case
diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessor.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessor.java
index 57df143..c9671f2 100644
--- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessor.java
+++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/journal/DataFileAccessor.java
@@ -17,7 +17,6 @@
 package org.apache.activemq.store.kahadb.disk.journal;
 
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.util.Map;
 
 import org.apache.activemq.util.ByteSequence;
@@ -85,7 +84,17 @@
                 file.seek(location.getOffset() + Journal.RECORD_HEAD_SPACE);
             }
             if ((long)location.getOffset() + location.getSize() > dataFile.length) {
-                throw new IOException("Invalid location size: " + location + ", size: " + location.getSize());
+                /**
+                 * AMQ-9254 if the read request is outside expected dataFile length, 
+                 *          perform expensive OS file length lookup operation 
+                 *          to allow read operation if it will succeed
+                 */
+                long osFileLength = dataFile.getFile().length();
+                if((long)location.getOffset() + location.getSize() > osFileLength) {
+                    throw new IOException("Invalid location size: " + location + ", size: " + location.getSize());
+                } else {
+                    LOG.warn("DataFile:{} actual length:{} larger than expected:{} for readRecord location:{} size:{}", dataFile.file.getName(), osFileLength, dataFile.length, location, location.getSize());
+                }
             }
             byte[] data = new byte[location.getSize() - Journal.RECORD_HEAD_SPACE];
             file.readFully(data);