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

Adrian Crum commented on OFBIZ-2353:
------------------------------------

Jacopo,

I apologize if I offended you - that was not my intention. I was trying to 
propose an alternate method of generating sequences and I was hoping we could 
discuss the pros and cons of each method. I respect and appreciate the time you 
have invested in this rewrite, and I am not trying make you look dumb. From 
your perspective, you simply want to undo Jacques' changes and fix some 
thread-safety issues (or they might have been data-race conditions). From my 
perspective, I see this as an opportunity to re-evaluate the algorithm and the 
class as a whole to see if we can improve it. That is the motivation behind my 
comments - they are not meant to be some kind of personal attack.

I understand you are done with this issue and you want to move on, so there is 
no need for you to respond further. But I would like to clear up some 
misinformation for anyone else who is interested.

The current sequencer implementation has been documented as "an Ethernet-like 
collision detection design" - but it is not. In the CSMA/CD version of 
Ethernet, multiple devices will attempt to send their data on the medium, and 
if there is a collision (more than one device sending data simultaneously), 
then each device waits a random period of time and tries again.

The current sequencer design locks a record, reads it, increments the sequence 
value, and then writes the new value. That is nothing like CSMA/CD. A 
"CSMA/CD-like" design would attempt to update the record without locking it 
first, and if the update fails, it will retry. That is the design I proposed.

The current sequencer design is a blocking one: while one process holds the 
lock, other processes are blocked - waiting for the lock to be released. The 
design I proposed is non-blocking: there are no locks - so processes are not 
blocked.

The disadvantage to the non-blocking design is when an update fails - the 
record needs to be read and the update is tried again. This can result in more 
round trips to the database.

The disadvantage to the blocking design is the window of opportunity for 
failure after a lock is acquired and before it is released. In a best case 
scenario, the transaction manager rolls back the transaction and the blocked 
processes can proceed. In a worse case scenario, something goes wrong during 
rollback and the record is locked indefinitely. From my perspective this is a 
genuine concern and it is not something I made up just to be argumentative. 
Jacopo asked me to provide a unit test to prove this can happen. I would like 
to, but I don't know how.

There was some discussion about performance and which design performs better. 
From a pure design perspective, there is no way to measure the difference. Each 
design will perform better than the other depending upon the update scenario.

Regarding the performance of the patch I provided, I agree it performed worse 
than the current implementation - but that is because I was proposing a design, 
the patch was not a "finished product." Since my design involves a retry loop, 
I looked inside the loop to see what could be slowing it down. I came to the 
conclusion it was String concatenation combined with JDBC driver parsing of the 
SQL. Once I moved those things outside the retry loop, my design performed as 
well as the current implementation.

If anyone wants to explore these topics further, then please continue this 
discussion on the developers mailing list. If anyone wants to continue working 
on the design I proposed, then please do so. There is a bug in the initial 
sequence value, and as Jacopo mentioned, the PreparedStatement needs to be 
closed.


> SequenceUtil  may generate duplicate IDs in Load Balancing mode
> ---------------------------------------------------------------
>
>                 Key: OFBIZ-2353
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2353
>             Project: OFBiz
>          Issue Type: Bug
>          Components: framework
>    Affects Versions: Release Branch 4.0, Release Branch 09.04, Trunk
>            Reporter: Philippe Mouawad
>            Assignee: Jacopo Cappellato
>            Priority: Critical
>             Fix For: Release Branch 10.04, Upcoming Branch
>
>         Attachments: OFBIZ-2353 SELECT FOR UPDATE solution.patch, OFBIZ-2353 
> SELECT FOR UPDATE solution.patch, OFBIZ-2353-AC.patch, OFBIZ-2353-AC.patch
>
>
> If Ofbiz is deploy on 2 servers in Load Balancing Mode
> SequenceUtil will generate duplicate IDs because synchronization is done at 
> JVM level instead of doing it in DB.
> A good replacement implementation would be:
> org.hibernate.id.enhanced.TableGenerator
> But it would involve a dependency on Hibernate
> Philippe
> www.ubik-ingenierie.com



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

Reply via email to