Changes to RandomAccessFile in jdk9

Enrico Olivelli eolivelli at gmail.com
Fri Apr 20 17:15:09 UTC 2018


Il ven 20 apr 2018, 18:32 Ismael Juma <mlists at juma.me.uk> ha scritto:

> Hi all,
>
> I'm a Kafka committer and noticed this discussion. Kafka uses
> RandomAccessFile.setLength in two places.
>
> For the memory mapped index files:
>
> protected var mmap: MappedByteBuffer = {
>     val newlyCreated = file.createNewFile()
>     val raf = if (writable) new RandomAccessFile(file, "rw") else new
> RandomAccessFile(file, "r")
>     try {
>       /* pre-allocate the file if necessary */
>       if(newlyCreated) {
>         if(maxIndexSize < entrySize)
>           throw new IllegalArgumentException("Invalid max index size: " +
> maxIndexSize)
>         raf.setLength(roundDownToExactMultiple(maxIndexSize, entrySize))
>       }
>
>       /* memory-map the file */
>       _length = raf.length()
>       val idx = {
>         if (writable)
>           raf.getChannel.map(FileChannel.MapMode.READ_WRITE, 0, _length)
>         else
>           raf.getChannel.map(FileChannel.MapMode.READ_ONLY, 0, _length)
>       }
>       /* set the position in the index for the next entry */
>       if(newlyCreated)
>         idx.position(0)
>       else
>         // if this is a pre-existing index, assume it is valid and set
> position to last entry
>         idx.position(roundDownToExactMultiple(idx.limit(), entrySize))
>       idx
>     } finally {
>       CoreUtils.swallow(raf.close(), this)
>     }
>   }
>
> For the log segment files (written sequentially via FileChannel) if
> preallocate is true:
>
>     /**
>      * Open a channel for the given file
>      * For windows NTFS and some old LINUX file system, set preallocate to
> true and initFileSize
>      * with one value (for example 512 * 1025 *1024 ) can improve the
> kafka produce performance.
>      * @param file File path
>      * @param mutable mutable
>      * @param fileAlreadyExists File already exists or not
>      * @param initFileSize The size used for pre allocate file, for
> example 512 * 1025 *1024
>      * @param preallocate Pre-allocate file or not, gotten from
> configuration.
>      */
>     private static FileChannel openChannel(File file,
>                                            boolean mutable,
>                                            boolean fileAlreadyExists,
>                                            int initFileSize,
>                                            boolean preallocate) throws
> IOException {
>         if (mutable) {
>             if (fileAlreadyExists) {
>                 return new RandomAccessFile(file, "rw").getChannel();
>             } else {
>                 if (preallocate) {
>                     RandomAccessFile randomAccessFile = new
> RandomAccessFile(file, "rw");
>                     randomAccessFile.setLength(initFileSize);
>                     return randomAccessFile.getChannel();
>                 } else {
>                     return new RandomAccessFile(file, "rw").getChannel();
>                 }
>             }
>         } else {
>             return new FileInputStream(file).getChannel();
>         }
>     }
>
> Enrico, the change in behaviour you have seen is for the index files? I
> suspect so as `preallocate` is only typically enabled by Windows users.
>

I am running brokers on Linux with mostly default values.
The change is about index files


Enrico


> Ismael
>
> On Fri, Apr 20, 2018 at 6:50 AM, Alan Bateman <Alan.Bateman at oracle.com>
> wrote:
>
>> On 20/04/2018 13:09, Enrico Olivelli wrote:
>>
>>>
>>> Alan, Ivan
>>> Thank you for spending time on this.
>>>
>>> Do you think there will be some change (change to previous behavior) or
>>> simply some consolidation on current behavior (docs, tests in the codebase)?
>>>
>>> Should I file some issue on the bugtracker?
>>>
>> I'm confident that Ivan is correct (I have forgotten this was fixed in
>> RandomAccessFile at the same time as FileChannel). So it is a deliberate
>> change and one that should probably have had a release note.
>>
>> -Alan
>>
>
> --


-- Enrico Olivelli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/nio-dev/attachments/20180420/284f158d/attachment.html>


More information about the nio-dev mailing list