arcus-java-client icon indicating copy to clipboard operation
arcus-java-client copied to clipboard

INTERNAL: make piped insert operations process synchronously

Open oliviarla opened this issue 1 year ago โ€ข 13 comments

๐Ÿ”— Related Issue

  • https://github.com/jam2in/arcus-works/issues/540

โŒจ๏ธ What I did

  • lop/sop/mop/bop piped insert์— ํ•œํ•ด ์ ์šฉํ•˜๋Š” PR์ž…๋‹ˆ๋‹ค.

๋™์ž‘ ๊ณผ์ •

  • 500๊ฐœ ์•„์ดํ…œ ๋‹จ์œ„๋กœ Operation ๊ฐ์ฒด๋ฅผ ๋‚˜๋ˆ„์–ด ๋น„๋™๊ธฐ๋กœ ์ผ์ œํžˆ ์š”์ฒญ์„ ๋ณด๋‚ด๋˜ ๊ฒƒ์„ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ•˜๋‚˜์”ฉ ๋ณด๋‚ด์–ด Arcus ์„œ๋ฒ„์— ๊ณผ๋„ํ•œ ๋ถ€ํ•˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์‹คํŒจ ์‹œ ๋‹ค์Œ Operation์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด์ „ operation์ด ์„ฑ๊ณตํ•ด์•ผ๋งŒ ๋‹ค์Œ operation์ด writeQueue์™€ Future์˜ operation list์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ CLIENT_ERROR, SERVER_ERROR ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ์ฆ‰์‹œ latch.countdown์„ ํ˜ธ์ถœํ•ด ๋‚จ์€ operation์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • OVERFLOWED, OUT_OF_RANGE ๊ฐ™์€ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ดํ›„ operation์˜ ์ฒซ command๊ฐ€ NOT_EXECUTED ์ƒํƒœ์ž„์„ future์˜ failedResult์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • NOT_EXECUTED ์ดํ›„์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์€ ์‹คํ–‰๋˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (CANCELED๊ฐ€ ์•„๋‹Œ NOT_EXECUTED๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ง„์งœ cancel ์ƒํ™ฉ๊ณผ์˜ ํ˜ผ์šฉ์„ ๋ง‰๊ณ ์ž ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.)

  • ๋ณธ PR ์ด์ „์— pipe ๊ด€๋ จ ํด๋ž˜์Šค ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ๊ณ , ์ด์— ๋งž์ถ”์–ด SingleKeyPipedOperationImpl ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • PipedOperationImpl ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ bulk insert๊นŒ์ง€ ์˜ํ–ฅ์ด ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, single key ์ „์šฉ operation ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ handleLine ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ํด๋ž˜์Šค๋ฅผ CollectionPipedInsertOperationImpl ๊ฐ€ ์ƒ์†๋ฐ›๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (์ถ”ํ›„ CollectionPipedUpdateOperationImpl ๋“ฑ ํด๋ž˜์Šค๋“ค๋„ ์ƒ์†๋ฐ›์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.)
    • PipedOperationImpl ํด๋ž˜์Šค๋Š” ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  Operation์— ๋Œ€ํ•œ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๊ณ , single key๋‚˜ multi key์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ด ํด๋ž˜์Šค์™€ ๊ฐ™์€ ๋ณ„๋„ ํด๋ž˜์Šค์— ๋‘์–ด ๋ถ„๋ฆฌ๋œ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

oliviarla avatar Aug 19 '24 06:08 oliviarla

@jhpark816 ๋ฆฌ๋ทฐ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

oliviarla avatar Sep 06 '24 10:09 oliviarla

@uhm0311 ๋ฆฌ๋ทฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

jhpark816 avatar Sep 09 '24 02:09 jhpark816

@oliviarla

์ปจํ”Œ๋ฆญํŠธ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

uhm0311 avatar Sep 23 '24 03:09 uhm0311

@uhm0311 @jhpark816 ์ฒซ ์ฝ”๋ฉ˜ํŠธ์— ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„๋œ ์‚ฌํ•ญ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

oliviarla avatar Feb 13 '25 02:02 oliviarla

cancel ๊ด€๋ จ ์„ค๋ช…

  • ๊ธฐ์กด์—๋Š” future๋ฅผ ํ†ตํ•œ cancel ์š”์ฒญ์ด "operation์„ complete ์ฒ˜๋ฆฌ์ค‘์ด๊ณ  nextOp๊ฐ€ ๋‚จ์•„์žˆ์—ˆ๋‹ค๋ฉด" nextOp๋ฅผ cancelํ•˜๋Š” ๋Œ€์‹  future๋ฅผ ํ†ตํ•œ cancel์„ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • cancel ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ op๋ฅผ cancel์‹œํ‚ค๊ฑฐ๋‚˜ ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ op๋ฅผ complete ์ฒ˜๋ฆฌ์ค‘์ด๋ผ๋ฉด nextOp๋ฅผ cancel ์‹œํ‚ค๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ cancel ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
    • ์ฐธ๊ณ ๋กœ nextOp์˜ cancel ์ฒ˜๋ฆฌ๋ฅผ future์—์„œ ์ง„ํ–‰ํ•ด์•ผ cancel ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, future์— ์™„๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜ ์ˆ˜ํ–‰์ค‘์ธ Op ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ˆ˜ํ–‰ ๋Œ€๊ธฐ์ค‘์ธ ๋ชจ๋“  op๊นŒ์ง€ ๋‹ด๋„๋ก ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฒ˜๋ฆฌ ํ๋ฆ„

  • ๋‹ค์Œ์€ future.cancel()์ด ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ๋”ฐ๋ฅธ ์ผ€์ด์Šค๋ฅผ ๋Œ€๋žต ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. future.cancel() ๋กœ์ง๊ณผ ๋ฉ”์„œ๋“œ ๋กœ์ง์€ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด ํ˜ธ์ถœ ์‹œ์ ๊ณผ ๋กœ์ง ์ˆ˜ํ–‰ ์‹œ์ ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋‹จ์€ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ  ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
    • ํ˜ธ์ถœ ์‹œ์ ์€ ์ฝ”๋“œ์— /* <case N> */ ๋กœ ์ ์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

    • future.cancel() ์€ ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

      public boolean cancel(boolean ign) {
         this.startCancel(); // canceling flag๋ฅผ true๋กœ ์„ค์ •
         boolean succeed;
         if (ops.get(currentOpIdx).cancel(ign)) {
           succeed = true;
         } else {
             this.lock();
             if (currentOpIdx < ops.size() - 1) {
               succeed = ops.get(++currentOpIdx).cancel(ign);
             } else {
               succeed = false;
             }
             this.unlock();
         }
         this.endCancel(); // canceling flag๋ฅผ false๋กœ ์„ค์ •
         return succeed;
      }
      

future.cancel() ํ˜ธ์ถœ์ด transitionState(OperationState.COMPLETE) ํ˜ธ์ถœ๊ณผ ๊ฒน์น  ๋•Œ

protected final void transitionState(OperationState newState) {
  state = newState;
  if (state != OperationState.WRITE_QUEUED &&
      state != OperationState.WRITING) {
    cmd = null;
  }
  /* <case 1> */
  if (state == OperationState.COMPLETE &&
          callbacked.compareAndSet(false, true)) {
    /* <case 2> */
    callback.complete();
    /* <case 3> */
  }
}
  • <case 1>
    • state๋Š” COMPLETE์ด์ง€๋งŒ cancel() ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰ ์‹œ callbacked๋ฅผ set ํ•˜๊ฒŒ ๋˜์–ด, cancel ์š”์ฒญ์€ ์„ฑ๊ณตํ•œ๋‹ค.
  • <case 2>
    • ํ•ด๋‹น op๋Š” ์™„๋ฃŒ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ cancel() ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰์— ์‹คํŒจํ•œ๋‹ค.
    • future.cancel() ์—์„œ ๋‚จ์€ op๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ cancel ์‹œ์ผœ callback.complete() ์—์„œ ๋” ์ด์ƒ op๊ฐ€ input queue์— ๋“ฑ๋ก๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
    • future.cancel() ์—์„œ ๋‚จ์€ op๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ cancel ์š”์ฒญ์„ ์‹คํŒจ ์ฒ˜๋ฆฌ ํ•œ๋‹ค.
  • <case 3>
    • ์ด๋ฏธ callback์„ ํ†ตํ•ด nextOp๊ฐ€ ๋“ฑ๋ก๋œ ์‹œ์ ์ด๋ฏ€๋กœ, ์ˆ˜ํ–‰์ค‘์ธ operation์— ๋Œ€ํ•œ cancel ์š”์ฒญ์ด ์„ฑ๊ณตํ•  ๊ฒƒ์ด๋‹ค.

future.cancel() ํ˜ธ์ถœ์ด callback.complete()์™€ ๊ฒน์น  ๋•Œ

public void complete() {
  if (rv.getOperationStatus().isSuccess()) {
    Operation op = rv.getNextOp(); // next op๊ฐ€ ์žˆ๋‹ค๋ฉด op ๊ฐ์ฒด๋ฅผ, ์—†๋‹ค๋ฉด Null ๋ฐ˜ํ™˜
    if (op != null) {
      Operation nextOp = ops.get(nextOpIdx);
      /* <case 4> */
      rv.lock();
      if (!nextOp.isCancelled() && !future.isCanceling()) {
        addOp(key, nextOp);
        rv.setCurrentOpIdx(nextOpIdx);
      }
      rv.unlock();
    } else {
      /* <case 5> */
      latch.countDown();
    }
  } else {
    /* <case 6> */
    // ...
    if (nextIndex > 0) {
      rv.addEachResult(nextIndex,
              new CollectionOperationStatus(false, "NOT_EXECUTED", CollectionResponse.NOT_EXECUTED));
    }
    latch.countDown();
  }
}
  • <case 4>
    • ํ˜„์žฌ op๊ฐ€ complete๋˜์—ˆ๊ณ  nextOp๋ฅผ input queue์— ๋„ฃ๊ธฐ ์ง์ „ future.cancel() ์š”์ฒญ์ด ๋“ค์–ด์˜จ ์ƒํ™ฉ์ด๋‹ค.
    • future.cancel ์ˆ˜ํ–‰ ์‹œ์ž‘ ์‹œ์ ์— canceling flag๋ฅผ true๋กœ ๋‘๊ณ , nextOp cancel ์ž‘์—… ๋„์ค‘์—๋Š” nextOp๋ฅผ input queue์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก lock์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • <case 5>
    • ํ˜„์žฌ op๊ฐ€ complete๋˜์—ˆ๊ณ  nextOp๊ฐ€ ์—†์œผ๋ฏ€๋กœ cancel ์š”์ฒญ์€ ์‹คํŒจํ•œ๋‹ค.
  • <case 6>
    • ํ˜„์žฌ op๊ฐ€ ์‹คํŒจํ–ˆ๊ณ  nextOp๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” flag๋ฅผ ์„ธ์›Œ์•ผ ํ•˜๋ฏ€๋กœ cancel ์š”์ฒญ์€ ์‹คํŒจํ•œ๋‹ค.

oliviarla avatar Feb 25 '25 11:02 oliviarla

@oliviarla

์ฝ”๋ฉ˜ํŠธ๋งŒ ๋ด์„œ๋Š” ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

uhm0311 avatar Feb 26 '25 09:02 uhm0311

@uhm0311 @jhpark816 ์ฝ”๋ฉ˜ํŠธ ๋‚ด์šฉ์„ ์ข€๋” ์ž์„ธํžˆ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ†  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

oliviarla avatar Feb 27 '25 05:02 oliviarla

๊ธฐ์กด PR์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋Š”์ง€๋ถ€ํ„ฐ๊ฐ€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด๋ผ์„œ, ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์„ค๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ฝ”๋ฉ˜ํŠธ๋Š” TO-BE์— ๊ด€ํ•œ ์„ค๋ช…๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. AS-IS์˜ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ด์—ˆ๋Š”์ง€, ์–ด๋– ํ•œ ์ด์œ ๋กœ ๋ฌธ์ œ์˜€๋Š”์ง€๋ถ€ํ„ฐ ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๊ธฐ์กด cancel ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ operation์„ complete ์ฒ˜๋ฆฌ์ค‘์ผ ๋•Œ future๋กœ๋ถ€ํ„ฐ cancel์„ ์š”์ฒญํ–ˆ๊ณ  nextOp๊ฐ€ ๋‚จ์•„์žˆ์—ˆ๋‹ค๋ฉด ์ด๋ฅผ cancelํ•˜๋Š” ๋Œ€์‹  ์‹คํŒจ ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‹คํŒจ ์‘๋‹ต์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

  • cancel() ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋Š” ์‘๋‹ต?
  • ์บ์‹œ ์—ฐ์‚ฐ์ด ์‹คํŒจํ–ˆ๋‹ค๋Š” ์‘๋‹ต?
  • ๋‹ค๋ฅธ ๊ธฐํƒ€ ์‘๋‹ต?

uhm0311 avatar Feb 27 '25 05:02 uhm0311

@uhm0311 ์›๋ณธ ์ฝ”๋ฉ˜ํŠธ์— ๋” ์ž์„ธํžˆ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. cancel()๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋Š” ์‘๋‹ต์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

oliviarla avatar Feb 27 '25 06:02 oliviarla

@uhm0311 @jhpark816 ์ด์ „ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰๋˜์–ด @jhpark816 ๋‹˜์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์ƒ์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

future.cancel()

  • op.cancel์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ op๊ฐ€ complete ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ complete ์ฒ˜๋ฆฌ๋œ op๋Š” ์Šคํ‚ตํ•˜๊ณ  ๋‹ค์Œ op๋ฅผ cancel ์‹œ๋„ํ•œ๋‹ค.
  • ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ op๋ถ€ํ„ฐ ์ˆœํšŒํ•˜๋ฉฐ cancel์ด ์„ฑ๊ณตํ•˜์˜€๋‹ค๋ฉด ์ฆ‰์‹œ ์„ฑ๊ณต ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.
  • cancel๋œ op๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด future๋Š” cancel๋œ ์ƒํƒœ์ด๋‹ค.
public boolean cancel(boolean ign) {
  for (int i = currentOpIdx; i < ops.size(); i++) {
    if (ops.get(i).cancel("by application.")) {
      return true;
    }
  }
  return false;
}

public boolean isCancelled() {
  for (int i=0;i<ops.size();i++) {
    if (ops.get(i).isCancelled()) {
      return true;
    }
  }
  return false;
}

callback.complete()

  • nextOp๋ฅผ cancel ์‹œํ‚ค๋Š” ๋™์‹œ์— addOpํ•˜๋Š” ๊ฒฝ์šฐ cancel ์ƒํƒœ์ด๋ฉด์„œ input queue์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์œผ๋‚˜, write queue์—์„œ ์ œ์™ธ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
public void complete() {
  if (rv.getOperationStatus().isSuccess()) {
    Operation nextOp = rv.getNextOp(); // next op๊ฐ€ ์žˆ๋‹ค๋ฉด op ๊ฐ์ฒด๋ฅผ, ์—†๋‹ค๋ฉด Null ๋ฐ˜ํ™˜
    if (nextOp != null && !nextOp.isCancelled()) {
      addOp(key, nextOp);
      rv.setCurrentOpIdx(nextOpIdx);
    } else {
      latch.countDown();
    }
  } else {
    // ...
    if (nextIndex > 0) {
      rv.addEachResult(nextIndex, new CollectionOperationStatus(false, "NOT_EXECUTED", CollectionResponse.NOT_EXECUTED));
    }
    latch.countDown();
  }
}

oliviarla avatar Feb 27 '25 08:02 oliviarla

@uhm0311 @jhpark816 ์ด์ œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฆฌ๋ทฐํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

oliviarla avatar Feb 28 '25 07:02 oliviarla

๋ฆฌ๋ทฐ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

oliviarla avatar Mar 12 '25 02:03 oliviarla

@uhm0311 @jhpark816 ํ˜„์žฌ Future์— currentOpIdx, ๋ชจ๋“  Operation์„ ๋‹ด์€ List ๋ฅผ ๋‘๋‹ค๋ณด๋‹ˆ ํ•ด๋‹น ๊ฐ’์„ callback์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ณ  future์—์„œ๋„ ์‚ฌ์šฉํ•˜์—ฌ, ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ๋†’์•„์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Future๋Š” ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์—ญํ• ๋งŒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋‹จ์ˆœํ•˜๊ณ  ์ถ”ํ›„ Future๋ฅผ ํ†ตํ•ฉํ•  ๋•Œ๋„ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Future์— ํ•ด๋‹น ๊ฐ’๋“ค์„ ๋‘์ง€ ์•Š๊ณ , ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ–ˆ๋˜๋Œ€๋กœ Future์—๋Š” ํ˜„์žฌ ์‹คํ–‰์ค‘์ด๊ฑฐ๋‚˜ ์‹คํ–‰ ์™„๋ฃŒ๋œ Operation๋งŒ์„ ๋‹ด๋Š” List๋ฅผ ๊ฐ–๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” PR์„ ๋‹ค์‹œ ์˜ฌ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด์—์„œ ํ˜„ ์ƒํƒœ๋กœ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋œ ์›์ธ์ด future.cancel() ํ˜ธ์ถœ ์‹œ nextOp๊นŒ์ง€ cancel() ํ•ด๋ณด์ง€ ์•Š๊ณ  ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜์—ฌ, nextOp์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•ด cancel() ํ˜ธ์ถœ์„ ํ•˜๊ธฐ ์œ„ํ•จ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” Future์—์„œ ์ง์ ‘ nextOp์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹ ๋Œ€์‹ , ํ•˜๋‚˜์˜ Operation์— next Operation ๋ณ€์ˆ˜๋ฅผ ๋‹ด์•„ Operation์— cancel ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ next Operation cancel()์„ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ์™„๋ฃŒ๋œ ์ƒํƒœ์ด๊ณ , ์ž์ฒด ๋ฆฌ๋ทฐ ๊ฑฐ์ณ ๋‚ด์ผ ๋‹ค์‹œ PR ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

oliviarla avatar Mar 13 '25 08:03 oliviarla