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

Michael Dürig commented on OAK-1828:
------------------------------------

FTR: In an offline discussion with [~frm] we acknowledged that the changes done 
with this refactoring can introduce cycles in the segment graph during normal 
operation: given {{SegmenBufferWriter}} instances {{w1}} and {{w2}}. Write 
records {{r1}} via {{w1}} and {{r2}} referencing {{r1}} via {{w2}}. Now the 
segment underlying {{w2}} references the one of {{w1}}. Now writing {{r3}} 
referencing {{r2}} via {{w1}} will cause the segment underlying {{w1}} to 
reference the one of {{w2}}, creating a cycle. 



> Improved SegmentWriter
> ----------------------
>
>                 Key: OAK-1828
>                 URL: https://issues.apache.org/jira/browse/OAK-1828
>             Project: Jackrabbit Oak
>          Issue Type: Sub-task
>          Components: segmentmk
>            Reporter: Jukka Zitting
>            Assignee: Alex Parvulescu
>            Priority: Minor
>              Labels: technical_debt
>             Fix For: 1.3.12
>
>         Attachments: record-writers-v0.patch, record-writers-v1.patch, 
> record-writers-v2.patch
>
>
> At about 1kLOC and dozens of methods, the SegmentWriter class currently a bit 
> too complex for one of the key components of the TarMK. It also uses a 
> somewhat non-obvious mix of synchronized and unsynchronized code to 
> coordinate multiple concurrent threads that may be writing content at the 
> same time. The synchronization blocks are also broader than what really would 
> be needed, which in some cases causes unnecessary lock contention in 
> concurrent write loads.
> To improve the readability and maintainability of the code, and to increase 
> performance of concurrent writes, it would be useful to split part of the 
> SegmentWriter functionality to a separate RecordWriter class that would be 
> responsible for writing individual records into a segment. The 
> SegmentWriter.prepare() method would return a new RecordWriter instance, and 
> the higher-level SegmentWriter methods would use the returned instance for 
> all the work that's currently guarded in synchronization blocks.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to