Skip to content

maxReservedValue が maxSequenceValue を超えることがある #69

Open
@tksugimoto

Description

@tksugimoto

#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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions