Open
Description
#64 (comment) SequenceFactoryWorker の採番時の振る舞いについてテストケースを洗い出し by negokaz · Pull Request #64 · lerna-stack/lerna-app-library
ちなみに、reservationAmount を大きくすると、初期化時やリセット時に maxSequenceValueを超えることがあります。
また、 reservationAmount が大きくなくても、 worker が再起動した際、前回保存の maxReservedValue が maxSequenceValue に近い場合、初期化時に maxSequenceValue を超えます。
発生条件
初期化時
OR条件
- reservationAmount が大きい場合
- 常に
firstValue + (incrementStep * (reservationAmount - 1))
がmaxSequenceValue
を超えるケースがわかりやすい
- 常に
- 前回保存の maxReservedValue が maxSequenceValue に近い場合
v2.0.0, #57 merge後 どちらでも発生
予約時
- maxReservedValue が maxSequenceValue に近い場合
v2.0.0 で発生。
#57 merge後 では修正済 (59c6134 🐞fix: シーケンスの予約可能数の計算で最大シーケンス番号を考慮する
)
リセット時
- reservationAmount が大きい場合
v2.0.0, #57 merge後 どちらでも発生
問題/影響
v2.0.0
- (
maxSequenceValue
を超える)無駄な予約されることがある
※ maxSequenceValue
を超える採番がされることはない
if (nextValue <= maxSequenceValue) {
msg.replyTo ! SequenceGenerated(nextValue, sequenceSubId)
#57 merge後
- 特になし
※ maxSequenceValue <= maxSequenceValue
の場合、予約はされない
def freeAmount(implicit config: SequenceConfig): Int =
Math.min(
// 予約数制限(reservationAmount)の中で採番可能なシーケンスの数
(config.reservationAmount - remainAmount).toInt,
// 最大シーケンス番号(maxSequenceValue)までの間で採番可能なシーケンスの数
((config.maxSequenceValue - maxReservedValue) / config.incrementStep).toInt,
)
val freeAmount = nextSequence.freeAmount
if (freeAmount > 0) {
reserve(sequenceContext = nextSequence, amount = freeAmount)
※ maxSequenceValue
を超える採番がされることはない
private[this] def prepareNextSequence(nextSequence: SequenceContext): Behavior[Command] = {
if (nextSequence.isOverflow) {
reset()
empty(nextSequence)
Metadata
Metadata
Assignees
Labels
No labels