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

Jay Kreps commented on KAFKA-191:
---------------------------------

Neha--Sounds good. I have a patch (since it is just deleting and reordering, 
the code change itself is trivial), I will attach. Here are my thoughts. I 
think we can just remove the synchronization and re-order things so that the 
unflushed counter and lastFlushTime both remain valid lower bounds. It is 
possible that the time we set could get overwritten by another thread but it is 
unlikely to make any practical difference. See if you agree with that logic, I 
am not 100% positive.

I am not at all sure that this will actually help performance though for two 
reasons. First, I think it is possible that the file itself may be 
synchronized. Either at the java level or the OS level. So I am not sure if one 
can write to the file while a flush is occurring in another thread. This may 
take some research to understand. 

Second, if it is possible to do parallel write and flush, I think this still 
may not be ideal (though maybe a good short term hack). My reasoning is that 
this patch only fixes the blocking behavior for the time-based flush, but my 
question is why would I ever want to block?

I really see two use cases:
1. I want every message I write immediately flushed to disk in a blocking 
fashion before the append() is considered completed. This corresponds to 
flush.interval=1 in the current system.
2. I want to periodically flush data, which could be based on the number of 
messages, or time, (or theoretically based on unflushed bytes, though we 
haven't implemented that).

So what I am thinking is that case (1) clearly needs to be blocking to make 
sense. But for any periodic flush I don't see a reason to block appends. It is 
true that this makes the intervals inexact, but I think that is probably fine.. 
For example, even if I set flush.interval=5, it is unlikely that I could 
actually care that it is exactly 5, I just want to flush often, say ~5 
messages. (Even if I did want it exact, since we always write the full 
messageset, I still might not get that). So I am thinking a better long-term 
approach might be to have a central threadpool that handles all flushing and 
have that always be asynchronous. So if I set flush.interval=5, then that means 
the background thread is triggered every 5 messages BUT no one blocks on this. 
In addition to this we add an immediate.commit=true/false option to force data 
to be flushed in a blocking way as part of the append.

Obviously the above only works if a parallel append and flush are possible.
                
> Investigate removing the synchronization in Log.flush
> -----------------------------------------------------
>
>                 Key: KAFKA-191
>                 URL: https://issues.apache.org/jira/browse/KAFKA-191
>             Project: Kafka
>          Issue Type: New Feature
>          Components: core
>    Affects Versions: 0.8
>            Reporter: Jay Kreps
>            Assignee: Neha Narkhede
>         Attachments: KAFKA-191.patch
>
>
> Currently we have the following synchronization in Log.scala:
> 1. append, roll, and flush all share a write lock
> 2. read is non-blocking
> Unfortunately this means that flush time latency is added to appends (even if 
> the flush is done by a background thread). To fix this we should investigate 
> a scheme to make append and flush not block each other.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to