}
}
/** A blocking method to force-migrate from a RAMBucket to a FileBucket */
public final boolean migrateToDisk() throws IOException {
Bucket toMigrate = null;
long size;
synchronized(this) {
if(!isRAMBucket() || hasBeenFreed)
// Nothing to migrate! We don't want to switch back to ram, do we?
return false;
toMigrate = currentBucket;
RandomAccessBucket tempFB = _makeFileBucket();
size = currentSize;
if(os != null) {
os.flush();
os.close();
// DO NOT INCREMENT THE osIndex HERE!
os = tempFB.getOutputStreamUnbuffered();
if(size > 0)
BucketTools.copyTo(toMigrate, os, size);
} else {
if(size > 0) {
OutputStream temp = tempFB.getOutputStreamUnbuffered();
try {
BucketTools.copyTo(toMigrate, temp, size);
} finally {
temp.close();
}
}
}
if(toMigrate.isReadOnly())
tempFB.setReadOnly();
closeInputStreams(false);
currentBucket = tempFB;
// We need streams to be reset to point to the new bucket
}
if(logMINOR)
Logger.minor(this, "We have migrated "+toMigrate.hashCode());
synchronized(ramBucketQueue) {
ramBucketQueue.remove(getReference());
}
// We can free it on-thread as it's a rambucket
toMigrate.free();
// Might have changed already so we can't rely on currentSize!
_hasFreed(size);
return true;
}