Author: jukka
Date: Fri Mar 21 16:06:24 2014
New Revision: 1579965
URL: http://svn.apache.org/r1579965
Log:
OAK-1566: ArrayIndexOutOfBoundsException in Segment.getRefId()
Correct calculation of the tar index size
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java?rev=1579965&r1=1579964&r2=1579965&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java
Fri Mar 21 16:06:24 2014
@@ -100,12 +100,21 @@ class TarFile {
}
}
+ private final int getEntrySize(int size) {
+ return BLOCK_SIZE + (size + BLOCK_SIZE - 1) & ~(BLOCK_SIZE - 1);
+ }
+
synchronized boolean writeEntry(
UUID uuid, byte[] b, int offset, int size) throws IOException {
- if (position + BLOCK_SIZE + size + 4 * BLOCK_SIZE > maxFileSize) {
+ int indexSize = entries.size() * 24 + 4;
+ if (position
+ + getEntrySize(size) // this entry
+ + getEntrySize(indexSize) // index entry
+ + 2 * BLOCK_SIZE // two zero blocks at the end
+ > maxFileSize) {
writeEntryHeader(
indexEntryName, maxFileSize - 3 * BLOCK_SIZE - position);
- ByteBuffer index = ByteBuffer.allocate(entries.size() * 24 + 4);
+ ByteBuffer index = ByteBuffer.allocate(indexSize);
SortedMap<UUID, TarEntry> sorted = newTreeMap();
sorted.putAll(entries);
for (Map.Entry<UUID, TarEntry> entry : sorted.entrySet()) {
@@ -116,8 +125,9 @@ class TarFile {
}
index.putInt(sorted.size());
access.write(
- maxFileSize - 2 * BLOCK_SIZE - index.capacity(),
- index.array(), 0, index.capacity());
+ maxFileSize - 2 * BLOCK_SIZE - indexSize,
+ index.array(), 0, indexSize);
+ position = maxFileSize - 2 * BLOCK_SIZE;
return false;
}