buddyLevel = getFileLevel(buddyPointer);
buddyIndex = getPageIndex(buddyPointer);
}
OCacheEntry buddyCacheEntry = loadPageEntry(buddyIndex, buddyLevel);
buddyCacheEntry.acquireExclusiveLock();
try {
diskCache.loadPinnedPage(hashStateEntry);
hashStateEntry.acquireExclusiveLock();
try {
buddyBucket = new OHashIndexBucket<K, V>(buddyCacheEntry, keySerializer, valueSerializer, keyTypes, getTrackMode());
if (buddyBucket.getDepth() != bucketDepth)
return;
if (bucket.mergedSize(buddyBucket) >= OHashIndexBucket.MAX_BUCKET_SIZE_BYTES)
return;
OHashIndexFileLevelMetadataPage metadataPage = new OHashIndexFileLevelMetadataPage(hashStateEntry, getTrackMode(), false);
hashStateEntry.markDirty();
metadataPage.setBucketsCount(buddyLevel, metadataPage.getBucketsCount(buddyLevel) - 2);
int newBuddyLevel = buddyLevel - 1;
long newBuddyIndex = buddyBucket.getSplitHistory(newBuddyLevel);
metadataPage.setBucketsCount(buddyLevel, metadataPage.getBucketsCount(buddyLevel) + 1);
final OCacheEntry newBuddyCacheEntry = loadPageEntry(newBuddyIndex, newBuddyLevel);
newBuddyCacheEntry.acquireExclusiveLock();
try {
final OHashIndexBucket<K, V> newBuddyBucket = new OHashIndexBucket<K, V>(bucketDepth - 1, newBuddyCacheEntry,
keySerializer, valueSerializer, keyTypes, getTrackMode());
for (OHashIndexBucket.Entry<K, V> entry : buddyBucket)
newBuddyBucket.appendEntry(entry.hashCode, entry.key, entry.value);
for (OHashIndexBucket.Entry<K, V> entry : bucket)
newBuddyBucket.addEntry(entry.hashCode, entry.key, entry.value);
logPageChanges(newBuddyBucket, newBuddyCacheEntry.getFileId(), newBuddyCacheEntry.getPageIndex(), false);
} finally {
newBuddyCacheEntry.markDirty();
newBuddyCacheEntry.releaseExclusiveLock();
diskCache.release(newBuddyCacheEntry);
}
final long bucketPointer = directory.getNodePointer(nodePath.nodeIndex, nodePath.itemIndex + nodePath.hashMapOffset);