[ 
https://issues.apache.org/jira/browse/KAFKA-1008?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13741035#comment-13741035
 ] 

Jay Kreps commented on KAFKA-1008:
----------------------------------

Yeah, the problem is reads continue while the log is being rolled.

Here are a bunch of possible solutions I can think of
1. Lock reads
2. Delay the truncate until the larger mmap is collected

For (2) the problem is that it actually interferes with the recoverability of 
the log. If we have old log segments with a bunch of unfilled bytes in their 
index segment we need to recover those segments. But currently we only recover 
from the last flush point.

So I think we need to lock read access. This isn't the end of the world but I 
would prefer to do this only on windows. My suggestion on implementation would 
be
1. Change from synchronized in OffsetIndex to Lock
2. Add an object called Os in kafka.utils that is something like

object Os {
  private val osName = System.getProperty("os.name").toLowerCase
  val isWindows = osName.startsWith("windows")
}

We can expand this later if we need more specific OS detection capabilities or 
other OS-specific functionality.

Then elsewhere we can just do
  if(Os.isWindows) lock.lock()
and the corresponding unlock.

Does that seem like it would work?



                
> Unmap before resizing
> ---------------------
>
>                 Key: KAFKA-1008
>                 URL: https://issues.apache.org/jira/browse/KAFKA-1008
>             Project: Kafka
>          Issue Type: Bug
>          Components: core, log
>    Affects Versions: 0.8
>         Environment: Windows, Linux, Mac OS
>            Reporter: Elizabeth Wei
>            Assignee: Jay Kreps
>              Labels: patch
>             Fix For: 0.8
>
>         Attachments: unmap-v4.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> While I was studying how MappedByteBuffer works, I saw a sharing runtime 
> exception on Windows. I applied what I learned to generate a patch which uses 
> an internal open JDK API to solve this problem.
> Following Jay's advice, I made a helper method called tryUnmap(). 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to