INTERNAL: make piped insert operations process synchronously
๐ Related Issue
- https://github.com/naver/arcus-java-client/pull/795 ๋ฅผ ๋์ฒดํ ์ ์๋ PR์ ๋๋ค.
- PR ์์ฑ ์ด์ ๋ https://github.com/naver/arcus-java-client/pull/795#issuecomment-2720428907 ์ฐธ๊ณ ๋ฐ๋๋๋ค.
โจ๏ธ What I did
-
ArcusClient ํด๋์ค
-
syncCollectionPipedInsert() / syncCollectionPipedUpdate()๋ฉ์๋-
Operation ๊ฐ์ฒด๊ฐ 2๊ฐ ์ด์ ์์ฑ๋๋ ๊ฒฝ์ฐ, Operation ๊ฐ์ฒด์ next Operation ๋ณ์๋ฅผ ๋ด์ ๋๋๋ก ํฉ๋๋ค.
-
callback.complete() ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
-
ํ์ฌ Operation์ ๋ด๊ธด ๋ชจ๋ ์์ฒญ์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ, next Operation์ ํ์ Future์ ์ถ๊ฐํฉ๋๋ค.
-
ํ์ฌ Operation์ ๋ด๊ธด ์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ, ๋ค์ ์ผ์ด์ค๋ก ๋๋ฉ๋๋ค. (cancel/error ๋ฐ์ ์ ์ง๊ธ์ failedResult๋ฅผ ์กฐํํ ์ ์์ผ๋, ๋ณธ PR ๋ฐ์๋ ํ ์กฐํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ PR์ ์ฌ๋ฆฌ๊ฒ ์ต๋๋ค.)
- cancel๋ก ์ธํด ์ผ๋ถ item ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ -> Future#failedResult์ ๊ฒฐ๊ณผ๊ฐ ์ค์ง ์์ ๊ฐ์ฅ ์ฒซ ์์ดํ
์ undefined ์ํ๋ก ์ถ๊ฐํ๊ณ , ๋ค์ op์ ์ฒซ๋ฒ์งธ ์์ดํ
์ stopped ์ํ ์ถ๊ฐ (์ด๋ฅผ ํตํด
undefined ~ stopped - 1์ธ๋ฑ์ค๋ค์ ์ํ ์ฌ๋ถ๋ฅผ ์์ฉ์์ ๋ค์ ์ฒดํฌํ ์ ์์) - error๋ก ์ธํด ์ผ๋ถ item์ด ์คํ๋์ง ์์ -> Future#failedResult์ ์คํ๋์ง ์์ ์ต์ด์ item์ stopped ์ํ ์ถ๊ฐ
- item์ด ๋ชจ๋ ์ํ๋์์ง๋ง not found ๋ฑ ์คํจ ์กด์ฌ -> Future#failedResult์ ์คํจํ ์ํ๋ค ์ถ๊ฐํ๊ณ , ๋ค์ op ์์ผ๋ฉด stopped ์ํ ์ถ๊ฐ
- cancel๋ก ์ธํด ์ผ๋ถ item ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ -> Future#failedResult์ ๊ฒฐ๊ณผ๊ฐ ์ค์ง ์์ ๊ฐ์ฅ ์ฒซ ์์ดํ
์ undefined ์ํ๋ก ์ถ๊ฐํ๊ณ , ๋ค์ op์ ์ฒซ๋ฒ์งธ ์์ดํ
์ stopped ์ํ ์ถ๊ฐ (์ด๋ฅผ ํตํด
-
cancel๋ก ์ธํด ์ฐ์ฐ ์๋ต์ ๋ ์ด์ ๊ธฐ๋ค๋ฆฌ์ง ์๋ ์ํ์ด๋๋ผ๋, ๋์ค์ ์๋ต์ ์ฒ๋ฆฌํ ๋ ์ฑ๊ณต ์๋ต์ด ์ค๋ฉด failedResult์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ณ , ์คํจ ์๋ต์ด ์ค๋ฉด failedResult์ ์๋ undefined ์ํ๋ฅผ ์คํจ ์์ธ์ผ๋ก ๊ต์ฒดํ๋ค.
-
-
-
-
SingleKeyPipeOperationImpl ํด๋์ค
-
pipedCancel()๋ฉ์๋: cancel ์์ฒญ์ด ๋ค์ด์์ ๋ ํ์ฌ Operation cancel์ ์คํจํ๋ฉด, next Operation cancel์ ์๋ํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
PipedCollectionFuture ํด๋์ค
- removeEachResult() ๋ฉ์๋: cancel๋ ํ ์ฑ๊ณต ์๋ต์ ๋ฐ์์ ๋ failedResult์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋๋ก ํฉ๋๋ค.
- ๊ทธ์ธ ๋ฉ์๋๋ค์ ์์ ํ์ต๋๋ค.
@jhpark816 ๋ฆฌ๋ทฐ ๋ฐ์ํ์์ต๋๋ค.
@uhm0311 ๋ฆฌ๋ทฐ ๋ฐ๋๋๋ค.
ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋์์ฑ ๋ฌธ์ ํด๊ฒฐํด๋ ์ํ์ ๋๋ค.
-
receivedStatus๊ฐ IO/Worker ์ค๋ ๋์์ ์ค๋ณต ํธ์ถ๋๋ ๋ฌธ์
- CANCEL/์ต์ข ์คํจ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๊ณ ์ด๋ค ์ ๋ณด๊ฐ ๋จผ์ ๋ค์ด๊ฐ๋, complete ์ฝ๋ฐฑ ๋ฉ์๋์์ ์ฒ๋ฆฌ๋ ๋ฌธ์ ์๋ค. ์ฆ, ์์ฒญ์ด CANCEL ๋์์ด๋ FAIL_END ์ํ๊ฐ Future#OperationStatus ์ ์ ์ฅ๋๋ ๊ฒ์ ๋ฌธ์ ์๋ค๊ณ ํ๋จํ๋ค.
-
addEachResult(gotStatus ์ฝ๋ฐฑ) ๋ฉ์๋๊ฐ cancel๋ ํ์๋ IO ์ค๋ ๋์ ์ํด ํธ์ถ๋์ด ๊ธฐ์กด ๊ฐ(UNDEFINED) ๋ฎ์ด์ฐ๋ ๋ฌธ์
- handleLine์์ ํธ์ถ๋๋ gotStatus ์ฝ๋ฐฑ ๋ฉ์๋๊ฐ cancel ์ํ๋ฉด ๋ถ๋ฆฌ์ง ์๋๋ก ์์ ํ์๋ค.
ํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ๋ถ๋ถ์ด ๋จ์์๋๋ฐ์, ๋ค์๊ณผ ๊ฐ์ด cancel ๋ณ์์ ๋ํ ๋์์ฑ ์ ์ด๊ฐ ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ iscancelled์ cancel ๋ฉ์๋ ๊ฐ์ ๋์ ์ ๊ทผ์ ํ์ง ๋ชปํ๋๋ก synchronized ๋ฉ์๋๋ก ๋ง๋๋ ๊ฒ์ ๋ํด ๊ณ ๋ฏผ ์ค์
๋๋ค.
@oliviarla ~op์ cancelled ํ๋๊ทธ๊ฐ true์ด๋ฉด ๊ทธ op์ ์ํ๋ฅผ WRITING ์ํ๋ก ๋ณ๊ฒฝํ์ง ๋ชปํ๋ฏ๋ก, ์์ ๊ณ ๋ฏผ ์ฌํญ์ ๋ฌธ์ ๋์ง ์์ ๊ฒ์ ๋๋ค. ๊ฒํ ๋ฐ๋๋๋ค.~
@jhpark816 @uhm0311 PR ์ฒซ ์ฝ๋ฉํธ๋ฅผ ํ์ฌ ํํ์ ๋ง๊ฒ ์์ ํ์ต๋๋ค. ๋ณต์กํ๊ฒ failedResult์ ์์ดํ ๋ค์ ์ถ๊ฐํ๋ ๋ก์ง์ ๋ณธ PR๊ณผ ๋ฌด๊ดํ๊ฒ ์ถํ ๋ ผ์ํ ์์ ์ ๋๋ค. ๋ฆฌ๋ทฐ ๋ถํ๋๋ฆฝ๋๋ค.
https://github.com/jam2in/arcus-works/issues/716 ์๋ฃ ํ ๋ค์ ์งํํ๊ฒ ์ต๋๋ค.
@oliviarla ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ ๋ฌ์์ผ๋, ํ์ธ ๋ฐ๋๋๋ค.