Hilo optimizer problem in case of multiple threads accessing the sequence table

Description

If 2 (or more) threads access the table storing the ids, this optimizer won't work and will try to insert entities with twice the same idea.

The problem is the way the HiLoOptimizer class generates the id :

public synchronized Serializable generate(AccessCallback callback) {
if ( lastSourceValue < 0 ) {
lastSourceValue = callback.getNextValue();
while ( lastSourceValue <= 0 ) {
lastSourceValue = callback.getNextValue();
}
hiValue = ( lastSourceValue * incrementSize ) + 1;
value = hiValue - incrementSize;
}
else if ( value >= hiValue ) {
lastSourceValue = callback.getNextValue();
hiValue = ( lastSourceValue * incrementSize ) + 1;
}
return make( value++ );
}

In the 'else if' part, the 'value' variable isn't reaffected, which means the current thread will try to insert entities with an id that has already been used by another thread. The value should be reset with hiValue - incrementSize.

Environment

None

Status

Assignee

Vlad Mihalcea

Reporter

Montagnon Cyril

Fix versions

Labels

backPortable

Backport?

Suitable for new contributors

None

Requires Release Note

None

backportDecision

None

Affects versions

Priority

Major
Configure