-
Notifications
You must be signed in to change notification settings - Fork 3
Write Durability
commit()์ด ๋์ค์ ๋๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋๋๊ฐ, ๋ค๋ฅธ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์ ์ด ๋ฌธ์ ๋ฅผ
์ด๋ป๊ฒ ํธ๋๊ฐ, ์ฐ๋ฆฌ๋ ๋ฌด์์ ํด์ผ ํ๋๊ฐ์ ๋ํ ์ ๋ฆฌ๋ค.
๋ฐ๋จ์ ๋จ์ํ ์ง๋ฌธ์ด์๋ค. ๋์คํฌ๊ฐ ๊ฝ ์ฐจ๊ธฐ ์ง์ ์ ์ปค๋ฐ์ ํ๋ค๊ฐ ๋ง์ง๋ง ๋ถ๋ถ์ ์ฐ๋ ์ค ์ค๋ฅ๊ฐ ๋๋ฉด, ๋ฒ์ ํ์ผ์ ์ด๋ฆด ์ ์๋?
์ด๋ฆด ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ง๊ธ ์ฝ๋๋ ๋ ๋ค ๋ชป ์ด๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฆด ์ ์์๋ ๊ฒฝ์ฐ๊ฐ ์๊ฐ๋ณด๋ค ๋ง๋ค๋ ๊ฒ ์ด ๋ฌธ์๋ฅผ ์ด ์ด์ ๋ค.
-
commit()์ ์ HEAD๋ฅผ ์ ์๋ฆฌ์์ ํ๊ดด์ ์ผ๋ก ๋ค์ ์ด๋ค. ๋๋๋ฆด ๊ธฐ๋ก์ด ์๋ค. -
write()ํ ๋ฒ์ ์์์ ์ด์ง ์๋ค. ์ฝ๋ ์ฃผ์์ด ๊ทธ๋ ๋ค๊ณ ์ ์ ํ๊ณ ์๋๋ฐ ์ฌ์ค์ด ์๋๊ณ , ์ค์ธก์ผ๋ก ๋ฐ๋ก๋ฅผ ๋ง๋ค์๋ค. - ์ฝ๋ ์ ์ฒด์
fsync๊ฐ ํ๋๋ ์๋ค. ๋ค๋ง ์ด๊ฑด RCS์ hg๋ ๋ง์ฐฌ๊ฐ์ง๋ผ ํน๋ณํ ์ด์ํ ๊ฑด ์๋๋ค. - ์ ๋ง ์ด์ํ ๊ฑด ์ฐ๋ฆฌ๋ง ํ๊ดด์ ์ ์๋ฆฌ ์ฐ๊ธฐ๋ฅผ ํ๋ค๋ ์ ์ด๋ค. RCSยทgitยทhg ์ค ์ด๋ ๊ฒ๋ ์ด์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ฐ์ง ์๋๋ค.
- ๋ฐ๋๋ก ๋นํธ ํ๋ฆฝ ๊ด์ ์์๋ ์ฐ๋ฆฌ๊ฐ RCS๋ณด๋ค ๋ซ๋ค. ์ปค๋ฐํ ๋ ์ ๋ธ๋ก์ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ํด์ ์ฒด์ธ์ด ์์์ ํ์งํ๋ค.
commit()์ ๋ ๋ฒ์งธ ์ดํ ์ปค๋ฐ ๊ฒฝ๋ก๋ค.
# Single write() call: two separate writes would leave the file with an
# overwritten old HEAD but no new HEAD if the process dies in between.
self.stream.seek(self.head_info["start"])
self.stream.write(old_block_bytes + new_block_bytes)
self.stream.truncate()์ HEAD๊ฐ ์๋ ์๋ฆฌ๋ก ๋๋์๊ฐ์, ๊ทธ๊ฒ์ ๋ธํ๋ก ๊ฐ๋ฑํ ๋ฐ์ดํธ์ ์ HEAD์
full text๋ฅผ ์ด์ด ์ด๋ค. ์ฃผ์์ write() ํ ๋ฒ์ด๋ฉด ์ค๊ฐ์ ์ฃฝ์ด๋ ์์ ํ๋ค๋
์ทจ์ง์ธ๋ฐ, ๊ทธ๋ ์ง ์๋ค. ๋ฒํผ๊ฐ ๋ถ๋ถ์ ์ผ๋ก flush๋ ์ ์๊ณ , ์ค์ ๋ก
๊ทธ๋ ๊ฒ ๋๋ค.
RLIMIT_FSIZE๋ก ๋์คํฌ ๋ถ์กฑ์ ํ๋ด ๋ด์, 300์ค ํ์ผ์ ์ธ ๋ฒ์งธ ๋ฒ์ ์
์ปค๋ฐํ๋ค๊ฐ ์๋ฆฌ๋ ์ง์ ์ ์ฎ๊ฒจ๊ฐ๋ฉฐ ์ธก์ ํ๋ค.
| ๋๊ธด ์ง์ | commit() |
checkout 1.2 / 1.1 / 1.0 |
verify() |
|---|---|---|---|
| ๋ธํ ~ ์ HEAD ๋ณธ๋ฌธ ๋์ค | OSError | ์ ๋ถ ์ค๋ต (len 0 / 7 / 14) | KeyError๋ก ์ฃฝ์ |
| ๋ณธ๋ฌธ ์๋ฃ ํ hash ๋์ค | OSError | ์ ๋ถ ์ ์ |
False (์ ์ ํ์ง) |
| ์๋ฃ | ์ ์ | ์ ๋ถ ์ ์ | True |
์ฒซ ์ค์ด ์ต์ ์ด๋ค. ์ธ ๋ฒ์ ์ด ๋์์ ์ค๋ต์ด ๋๋ค. ์ญ๋ธํ ๊ตฌ์กฐ๋ผ ๊ตฌ๋ฒ์ ์ ์ ๋ถ HEAD ๊ธฐ์ค ์ฒด์ธ์ด๊ณ , HEAD ํ๋๊ฐ ๊นจ์ง๋ฉด ๊ทธ ์ด์ ์ ์ฒด๊ฐ ๋ณต์ ๋ถ๊ฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ํ์งํ๋ผ๊ณ ์๋ verify()๊ฐ KeyError๋ก ์ฃฝ์๋ค. ์๋ฆฐ ๋ธ๋ก์
text ํ๋ ์์ด ํ์ฑ๋๋๋ฐ ๊ทธ๊ฑธ ๊ทธ๋๋ก ์ธ๋ฑ์ฑํ๊ณ ์์๋ค. ์ด๊ฑด
PR #17์์ ๊ณ ์ณค๋ค โ ์ด์
False๋ฅผ ๋ฐํํ๋ค.
๋ธํ ๋ธ๋ก๊น์ง๋ ์จ์ ํ ์ฐ์๊ณ ์ HEAD๋ฅผ ์ฐ๋ค๊ฐ ๋๊ธด ๊ฒฝ์ฐ๋ฅผ ๋ณด์. ์ฐ๋ฆฌ๋
RCS์ ci์ ๋ฌ๋ฆฌ ์์
ํ์ผ์ ์๋นํ์ง ์๊ณ ๊ทธ๋๋ก ๋๋ค. ๊ทธ๋ฌ๋ ์ปค๋ฐํ๋ ค๋
๋ด์ฉ์ ๋์คํฌ์ ์ด์์๋ค.
๊ทธ๋ ๋ค๋ฉด ์จ์ ํ ๋ธํ๋ฅผ ๊ทธ ๋ด์ฉ์ ์ ์ฉํ๋ฉด ์ด์ ๋ฒ์ ์ด ๋์จ๋ค. ์ค์ ๋ก ํด๋ดค๋ค.
1.1 block (248B) parses: ver=1.1 is_delta=True has_text=True
recover 1.1 from working file + delta : True
recover 1.0 by chaining further back : True
์์ ํ ๋ณต๊ตฌ๋๋ค. ๊ทธ๋ฐ๋ฐ SimpleRCS๋ ๊ทธ ๋ณต๊ตฌ๋ฅผ ํ์ง ์๊ณ checkout()์ด
์กฐ์ฉํ ๋น ๋ฌธ์์ด์ ๋ฐํํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ๋ฉ์ฉกํ ์๋๋ฐ ๋ชป ๊บผ๋ด๋
์ํฉ์ด๋ค.
๋ธํ๋ฅผ ์ฐ๋ค๊ฐ ๋๊ธด ๊ฒฝ์ฐ๋ ๋ค๋ฅด๋ค. ์ HEAD์ full text๊ฐ ๋ฐ์ฏค ์ง์์ก๊ณ ๊ทธ๊ฒ์ ๋์ด๋ฆด ์ฌ๋ฃ๊ฐ ์๋ค. ์ด๊ฑด ์ง์ง ์์ค์ด๋ค.
์์ค๋ฅผ ์ง์ ์ฝ๊ณ ํ์ธํ ๊ฒ๋ง ์ ๋๋ค.
| ๋ผ์ด๋ธ ๋ฐ์ดํฐ ๋ณํ | ์์ ์ฅ์น | fsync | |
|---|---|---|---|
| RCS |
,v ์ ์ฒด๋ฅผ temp์ ๋ค์ ์ |
temp + rename(), rename ๊ตฌ๊ฐ ์๊ทธ๋ ์ฐจ๋จ, lock ํ์ผ. ์คํจํ๋ฉด temp ์์น๋ฅผ ์๋ ค์ค |
์์ |
| CVS | RCS ,v๋ฅผ ๊ทธ๋๋ก ์ |
RCS ๊ฒ์ ์์ | ์์ |
| git | ์์ โ object/pack ๋ถ๋ณ | lockfile(O_CREAT|O_EXCL) + rename + atexitยท์๊ทธ๋ ์ ๋ฆฌ |
์ค์ ๊ฐ๋ฅ, ๊ธฐ๋ณธ๊ฐ์ด loose object๋ฅผ ์ ์ธ |
| hg | ์์ โ revlog append-only | ํธ๋์ญ์ ์ ๋์ append ์ง์ offset ๊ธฐ๋ก, ๋กค๋ฐฑ = truncate | ์์ |
| SimpleRCS | ์ ์๋ฆฌ tail-rewrite | ์์ | ์์ |
๋ท ์ค ์ ์ด fsync๋ฅผ ์ ํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํ๋ ๊ฒ ํน๋ณํ ๊ฒ ์๋๋ผ๋ ๋ป์ด๋ค. ํน๋ณํ ๊ฑด ๋ง์ง๋ง ์ค์ด๋ค.
transaction.py:438์ด ์ ๋์ ์ฐ๋ ๊ฑด ์ด๊ฒ ์ ๋ถ๋ค.
self._file.write(b"%s\0%d\n" % (file, offset))ํ์ผ ์ด๋ฆ๊ณผ append ์ง์ ์ ๊ธธ์ด. ๋กค๋ฐฑ์ ๊ทธ ์คํ์ ์ผ๋ก truncateํ๋ฉด ๋์ด๊ณ ๋ฐ์ดํฐ ๋ณต์ฌ๊ฐ 0์ด๋ค. revlog๊ฐ append-only๋ผ์ ๊ฐ๋ฅํ ์ผ์ด๋ค. ๋ชจ๋ docstring์ด ์ค๊ณ ์๋๋ฅผ ๊ทธ๋๋ก ๋งํ๋ค.
As the whole repository is effectively log-structured, this should amount to simply truncating anything that isn't referenced in the changelog.
content-addressed๋ผ ์ฐข์ด์ง ์ค๋ธ์ ํธ๋ ์๊ธฐ ํด์ ๊ฒ์ฆ์ ์คํจํด์ ์ค์ค๋ก ๋๋ฌ๋๋ค. ๊ทธ๋ฅ ๋ฒ๋ฆฌ๋ฉด ๋๋ fsyncํ ์ด์ ๊ฐ ์๋ค. ๋ฐ๋ฉด refs์ index๋ fsyncํ๋ค โ ์์ผ๋ฉด ๋๋ฌ ๊ฐ๋ฅ์ฑ์ด ์ฌ๋ผ์ง๋ค.
์ฐ๋ฆฌ์๊ฒ๋ ํด์ ์ฒด์ธ์ด ์์ด์ ํ์ง๋ ๋๋ค. ์๋ ๊ฑด ๋ณต๊ตฌ์ด๊ณ , git๊ณผ ๊ฒฐ์ ์ ์ผ๋ก ๋ค๋ฅธ ์ ์ ์ฐ๋ฆฌ๋ ์ฐข์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆด ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๊ฒ ์ด์ ๋ฒ์ ์ ์ ์ผํ ์ฌ๋ณธ์ด์์ผ๋๊น.
ํํ ์คํด๊ฐ "RCS = reverse delta"์ธ๋ฐ, ์ค์ ๋ก๋ ๋ ๋ค ์ด๋ค. ๋ธ๋์น๋ฅผ ๋ง๋
,v๋ฅผ ์ง์ ์ด์ด๋ดค๋ค.
1.2 (trunk HEAD) text @AAA / BBB-v2 / CCC@ <- full text
1.1 (trunk) text @d2 1 / a2 1 / BBB@ <- reverse delta (1.2โ1.1)
1.1.1.1 (branch) text @d2 1 / a2 1 / BBB-branch
a3 1 / DDD@ <- forward delta (1.1โ1.1.1.1)
trunk๋ reverse, ๋ธ๋์น๋ forward๋ค. ์ด์ ๊ฐ ์๋ค. trunk HEAD๋ ๋ ๋จ๊ฑฐ์ด ์ฝ๊ธฐ ๋์์ด๋ผ reverse๋ก ๋๋ฉด ๊ณต์ง๋ก O(1)์ด ๋๊ณ , ๋ธ๋์น๋ ๋ ์ฝํ๋ forward๋ก ๋ฌ๋ ๋๋ค. ๋์ RCS์ ๊ธด ๋ธ๋์น๋ ์ค์ ๋ก ๋๋ ค์ง๋ค โ forward ์ฒด์ธ์ธ๋ฐ ์ค๊ฐ ์ค๋ ์ท ์ฅ์น๊ฐ ์์ด์๋ค.
revlog.py:517์ deltaparent()๋ ํญ์ ์์ชฝ ๋ฆฌ๋น์ ์ ๊ฐ๋ฆฌํจ๋ค. ์
๋ฆฌ๋น์ ์ ๋ค์ ๋ถ๊ธฐ๋ง ํ๊ณ ๊ธฐ์กด ๋ฐ์ดํฐ๋ ์๋์ง ์๋๋ค. ๋๊ฐ๋ ์ฒด์ธ ๊ธธ์ด์ธ๋ฐ,
์ด๊ฑธ ์ค๊ฐ ์ค๋
์ท๊ณผ format.maxchainlen์ผ๋ก ๋ง๋ ๊ตฌ์กฐ๋ค.
์ด๋ก ์ ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก ์ฌ๋ณด๋ ํฅ๋ฏธ๋ก์ ๋ค. 300์ค ํ์ผ์ 401๋ฒ ์ปค๋ฐํ revlog:
revisions : 401
snapshot : 1 (0.25%) <- lvl-0 ํ๋๋ฟ
deltas : 400 (99.75%)
revision size : 20806 <- 401๊ฐ ๋ฒ์ ์ ์ฒด๊ฐ 20KB
tip chainlen : 401
sparserevlog๊ฐ ์ผ์ง ์ ์ฅ์์ธ๋ฐ๋ ์ค๊ฐ ์ค๋
์ท์ด ํ๋๋ ์ ์๊ฒผ๋ค. ์์ฐจ
ํธ์ง๋ง ํ ์ ํ ํ์คํ ๋ฆฌ๋ผ ๋ธํ๊ฐ ์์์ ํฌ๊ธฐ ํด๋ฆฌ์คํฑ์ด "ํ์ ์๋ค"๊ณ ํ๋จํ
๊ฒฐ๊ณผ๋ค. ์ฆ tip์ ์ฝ์ผ๋ ค๋ฉด ๋ธํ 401๊ฐ๋ฅผ ์ ์ฉํด์ผ ํ๋ค.
RCS : O(ํ์ผ) ์ฌ์์ฑ + ์์์ฑ HEAD O(1)
hg : append-only + ์ค๋
์ท HEAD ์ฒด์ธ walk (์ค์ธก 401)
SimpleRCS : O(tail) ์ฌ์์ฑ + ์์ ์ฅ์น ์์ HEAD O(1)
RCS์ ์ ์ฒด ์ฌ์์ฑ์ ๋ญ๋น๊ฐ ์๋๋ผ ์์์ฑ์ ๋๊ฐ๋ค. ์ด์ฐจํผ ์ HEAD๋ฅผ ๋ธํ๋ก ๊ฐ๋ฑํด์ผ ํ๋ค๋ฉด โ ํ์ผ ์ค๊ฐ์ ๊ฑด๋๋ฆฌ๋ ์ผ์ด๋ค โ ํต์งธ๋ก ์๋ก ์ฐ๊ณ renameํ๋ ๊ฒ ๊ฐ์ฅ ๋จ์ํ๊ณ , ํฌ๋์ ์์ ์ฑ์ด ๋ฐ๋ผ์จ๋ค.
SimpleRCS๋ ๊ทธ O(ํ์ผ)์ O(tail)๋ก ์ค์ธ ์ต์ ํ์ธ๋ฐ, ์ค์ด๋ฉด์ ์์ ์ฑ๋ ๊ฐ์ด ๋ฒ๋ ธ๋ค. ์๋ ์ด๋์ ์ง์ง์ง๋ง ๊ณต์ง๊ฐ ์๋์๋ค.
์ง๊ธ๊น์ง๋ ํฌ๋์ ์์ ์ฑ ์ถ์ด์๋ค. ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ์ถ์์๋ ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
RCS์ donerewrite()๋ ์ปค๋ฐ๋ง๋ค ์ด๊ฑธ ํ๋ค.
fro_spew (from, frew); /* ์ ,v ์ ์ฒด๋ฅผ ์ ํ์ผ๋ก ๋ณต์ฌ */
...
chnamemod (...); /* rename */fro_spew_partial์ mmap/๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๋ก์์ ์ ์ฒด๋ฅผ ํต๊ณผ์ํจ๋ค. ๊ทธ๋ฌ๋:
- ์ปค๋ฐ ํ ๋ฒ์ ์ ์ฒด ์ด๋ ฅ์ด RAM์ ํต๊ณผํ๋ค
- ๋นํธ ํ๋๊ฐ ๋ค์งํ๋ค
- ์์๋ ๋ด์ฉ์ด temp์ ์ฐ์ธ๋ค
-
rename()์ด ์์์ ์ผ๋ก ์ค์นํ๋ฉฐ ๋ฉ์ฉกํ๋ ์๋ณธ์ ์ง์ด๋ค - RCS์๋ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ๊ฐ ์์ผ๋ ์๋ฌด๋ ๋ชจ๋ฅธ๋ค
integrity ํ๋๊ฐ ๊ตฌ์กฐ์ฒด์ ์๊ธด ํ๋ฐ(base.h:587) ํ์ฑํด์ ๊ทธ๋๋ก ๋ค์ ์ธ
๋ฟ ๊ฒ์ฆํ๋ ์ฝ๋๊ฐ ์๋ค.
์ฌ๊ธฐ์ ์์์ฑ์ด ๋ ์ผ๋ก ์์ฉํ๋ค. ์ค๊ฐ ์ํ๊ฐ ์์ผ๋ "๋ญ๊ฐ ์ด์ํ๋ค"๋ ์ ํธ๊ฐ ์๊ณ , ์ด์ ํ์ผ์ ์ด๋ฏธ ์ฌ๋ผ์ก๋ค. ๊ฒ๋ค๊ฐ 10๋ ์ ๋ฆฌ๋น์ ๋ ์ปค๋ฐํ ๋๋ง๋ค RAM์ ๋ค์ ํต๊ณผํ๋ฏ๋ก ๋ ธ์ถ์ด ์ปค๋ฐ ์์ ๋น๋กํด ๋์ ๋๋ค. ๋ถ์์ ํ ๋จธ์ ์์ RCS ํ์ผ์ด ๋ฌด๋๊ธฐ๋ก ๊นจ์ง๋ ๊ฒ ์ ํํ ์ด ๋ชจ์์ด๋ค.
| ์ปค๋ฐ๋น RAM ํต๊ณผ ๋ฒ์ | ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ | ์์ ์ | |
|---|---|---|---|
| RCS | ์ด๋ ฅ ์ ์ฒด | ์์ | ์กฐ์ฉํ ์๊ตฌ ์์, ์๋ณธ ์์ค |
| SimpleRCS | tail๋ง | ํด์ ์ฒด์ธ | ๋๋จธ์ง ๋ธ๋ก ๋ฌด์ฌ, verify()๊ฐ ํ์ง |
| hg | ์ ๋ธํ๋ง | revlog ๋ ธ๋ ํด์ | ํ์ง ๊ฐ๋ฅ |
| git | ์ ์ค๋ธ์ ํธ๋ง | ์ ๋ฉด content-addressed |
git fsck, ์์๋ถ๋ง ํ๊ธฐ |
์ฐ๋ฆฌ tail-rewrite๋ ํฌ๋์์ ์ฝํ์ง๋ง ๋นํธ ํ๋ฆฝ ๋ ธ์ถ ๋ฉด์ ์ RCS์ 1/N์ด๋ค. ์ค๋๋ ๋ธ๋ก์ ์ปค๋ฐํ ๋ ์ฝ์ง๋ ์ฐ์ง๋ ์๋๋ค.
์ ๋ฆฌํ๋ฉด ๋ณด์ฅ์ ์ข ๋ฅ๋ฅผ ๋๋ ๋ด์ผ ํ๋ค.
- ํ์ง๋ ํด์๊ฐ ์์ผ๋ฉด ๊ฐ๋ฅํ๋ค. ์ด๊ฑด ์ด๋ฏธ ๊ฐ๊ณ ์๋ค.
- ๋ณต๊ตฌ๋ ์ค๋ณต ์์ด๋ ๋ถ๊ฐ๋ฅํ๋ค. ํด์๋ "๊นจ์ก๋ค"๊น์ง๋ง ๋งํ๋ค.
- ๋ ธ์ถ ๋ฉด์ ์ถ์๋ ์ค๊ณ๋ก ๊ฐ๋ฅํ๋ค. ์๋์ง ์๋ ๋ฐ์ดํฐ๋ ๊นจ์ง์ง ์๋๋ค.
ํ๊ดด์ ์ฐ๊ธฐ ์ ์ .srcs.journal์ [head_start][์ HEAD ๋ธ๋ก ์๋ณธ ๋ฐ์ดํธ]๋ฅผ
์ฐ๊ณ flush, ์ฑ๊ณตํ๋ฉด unlink. ์ด ๋ ์ ๋์ด ์์ผ๋ฉด ๋ณต์ํ๋ค.
hg๋ append-only๋ผ undo๊ฐ ์ ์ ํ๋๋ก ๋๋์ง๋ง ์ฐ๋ฆฌ๋ ๋ฎ์ด์ฐ๋ฏ๋ก ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค. ๋น์ฉ์ ์ปค๋ฐ๋น ์ด์ full text ํฌ๊ธฐ์ ์ถ๊ฐ ์ฐ๊ธฐ ํ ๋ฒ์ด๊ณ , tail-rewrite ์ค๊ณ๋ ๊ทธ๋๋ก ์ ์ง๋๋ค.
์ฃผ์: ์ ๋์ ์ฐ๊ธฐ ์์ ๋๋ฆฌ๋ฏ๋ก ยง6์ ๋นํธ ํ๋ฆฝ ๋ ธ์ถ๋ ํจ๊ป ๋๋ฆฐ๋ค. RCS์ ์ ์ฒด ์ฌ์์ฑ๋ณด๋ค๋ ์ฌ์ ํ ํจ์ฌ ์์ง๋ง ๊ณต์ง๋ ์๋๋ค. ์ ๋ ์์ฒด์ ํด์๋ฅผ ๋ถ์ด๋ฉด "์ ๋์ด ๊นจ์ก๋์ง"๋ฅผ ํ๋ณํ ์ ์์ด์, ์์๋ ์ ๋๋ก ๋ฉ์ฉกํ ํ์ผ์ ๋ฎ์ด์ฐ๋ ์ต์ ์ ๋ง์ ์ ์๋ค.
๊ฐ์ฅ ํ์คํ๊ณ ๊ตฌํ๋ ๋จ์ํ๋ค. ๋์ ์ปค๋ฐ๋ง๋ค O(ํ์ผ ํฌ๊ธฐ) I/O์ ์ผ์์ ์ผ๋ก 2๋ฐฐ ๊ณต๊ฐ์ด ํ์ํ๋ค. tail-rewrite๊ฐ ์กด์ฌํ๋ ์ด์ ๋ฅผ ์ ๋ฉด์ผ๋ก ๋ถ์ ํ๊ณ , ๋ฌด์๋ณด๋ค ๋์คํฌ๊ฐ ๊ฝ ์ฐฌ ์ํฉ์์ ์ ์ผ ๋จผ์ ์คํจํ๋ค โ ์ด ๋ ผ์์ ์ถ๋ฐ์ ์ด ๋ฐ๋ก ๊ทธ ์ํฉ์ด์๋ค. ยง6๊น์ง ๊ฐ์ํ๋ฉด ๋นํธ ํ๋ฆฝ ๋ ธ์ถ๋ ์ต์ ์ด๋ค.
๋ธํ ๋ฐฉํฅ์ forward๋ก ๋ค์ง์ผ๋ฉด ๊ตฌ์กฐ์ ์ผ๋ก ์์ ํด์ง๊ณ ๋ณต๊ตฌ๊ฐ truncate๋ก ๋๋๋ค. ๋์ HEAD ์ฝ๊ธฐ O(1)์ ์๋๋ค. hg ์ค์ธก์ด ๋ณด์ฌ์ฃผ๋ฏ tip์ ์ฝ๋ ๋ฐ ์ฒด์ธ ์ ์ฒด๋ฅผ ๊ฑธ์ด์ผ ํ ์ ์๋ค.
hg๊ฐ ์ด ์ ํ์ ํ ๊ฑด ๋ถ์ฐ VCS๋ผ ์์ ๋ฆฌ๋น์ ์ ๊ทผ๊ณผ push/pull ๋ณํฉ์ ๊ฐ๋นํด์ผ ํ๊ธฐ ๋๋ฌธ์ด์ง, ์์ ์ฑ๋ง ๋ณด๊ณ ๊ณ ๋ฅธ ๊ฒ ์๋๋ค. ์ํค์ฒ๋ผ HEAD๋ฅผ ์๋์ ์ผ๋ก ์์ฃผ ์ฝ๋ ์ํฌ๋ก๋์์๋ ์ํด๋ค.
commit(snapshot=True)๊ฐ ์ด๋ฏธ ์ HEAD๋ฅผ full text๋ก ๋จ๊ธฐ๋ ๊ฒฝ๋ก๋ผ ์ฌ๋ฃ๊ฐ
์์ ์์ง๋ ์๋ค. ๋ค๋ง ๊ทธ๊ฒ์ ์จ๋ ์ HEAD ๋ธ๋ก์ ์ ์๋ฆฌ์์ ๋ค์ ์ฐ๋ ๊ฑด
๋ง์ฐฌ๊ฐ์ง๋ผ append-only๊ฐ ๋์ง๋ ์๋๋ค.
-
posix_fallocate์ฌ์ ์์ฝ.statvfs๋ก ์ฌ์ ๋ฅผ ์ฌ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ๊ฒฝํฉ์ด ์๊ณ , ENOSPC๋ฅผ ํ์ผ์ ๊ฑด๋๋ฆฌ๊ธฐ ์ ์ ์ก๋๋ค. ๊ฐ์ธ๊ณ A์ ์ ๋ง๋๋ค โ ํํ ์คํจ(๋์คํฌ ๋ถ์กฑ)๋ ์์์กฐ์ฐจ ์ ํ๊ณ , ๋๋ฌธ ์คํจ(์ ์ยทSIGKILL)๋ ์ ๋๋ก ๋ณต๊ตฌ. -
ํ๊ดด์ ์ฐ๊ธฐ ๊ตฌ๊ฐ ์๊ทธ๋ ์ฐจ๋จ. RCS๊ฐ rename ์ฃผ๋ณ์์ ํ๋
IGNOREINTS/RESTOREINTS์ ๊ฐ์ ๊ฒ์ด๋ค.signal.pthread_sigmask๋ช ์ค๋ก Ctrl-C์ ๋ฐ์ฏค ์ฐ์ธ ํ์ผ์ด ๋์ค๋ ๊ฑธ ๋ง์ ์ ์๋ค. - ์์ ํ์ผ ๊ธฐ๋ฐ ๋ณต๊ตฌ ๊ฒฝ๋ก. ยง3์์ ๋ณด๋ฏ ๋ธํ๊ฐ ์จ์ ํ๋ฉด ์์ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ง๊ธ์ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์๋๋ฐ๋ ์ ์ฐ๊ณ ์๋ค.
์ด ์ ์ ๋ค์งํ๋ค. ์ค์ ๋ก ๊ตฌํ๋ ๊ฒ์ B(temp + rename)์ด๊ณ , A(์ ๋)์ ์๊ทธ๋ ์ฐจ๋จ์ ํ๊ธฐ๋๋ค. ๊ฒฐ์ ์ ๊ทผ๊ฑฐ๋ ยง5์ ํ์ ๋น ์ ธ ์๋ ์ฌ์ค ํ๋๋ค โ RCS๊ฐ ์ ์ฒด๋ฅผ ์ฌ์์ฑํ๋ ๊ฒ์ HEAD๋ฅผ ํ์ผ ์์ ๋๊ธฐ ๋๋ฌธ์ด๊ณ , HEAD๊ฐ ๋ค์ธ ์ฐ๋ฆฌ๋ ๋ฐ๋์ง ์๋ ๋ถ๋ถ์ด prefix๋ก ๋จ์ ์์ ๋ฐ์ดํธ ๋ณต์ฌ๋ก ๋๋๋ค. ๊ทธ๋ฌ๋ฉด B์ ๋น์ฉ ๋ ผ๊ฑฐ๊ฐ ๋ฌด๋์ง๊ณ (์ธก์ : ์ํค ๊ท๋ชจ์์ fsync๊ฐ ๋น์ฉ์ ์ง๋ฐฐ), ยง6์ ๋นํธ ํ๋ฆฝ ๋ ผ๊ฑฐ๋ ํจ๊ป ๋ฌด๋์ง๋ค(์ฌ์ง๋ ฌํ๊ฐ ์์ผ๋ฏ๋ก). ์ ์ฒด ๋ ผ์์ ๊ตฌํ ๊ฒฐ๊ณผ๋ Plan-Atomic-Commit์ ์๋ค.
์๋๋ ๊ทธ ๊ด์ฐฐ์ ํ๊ธฐ ์ ์ ํ๋จ์ด๋ฉฐ, ๊ธฐ๋ก์ผ๋ก ๋จ๊ธด๋ค.
A + fallocate + ์๊ทธ๋ ์ฐจ๋จ.
์ฐ๋ฆฌ ์ํฌ๋ก๋๋ HEAD๋ฅผ ์๋์ ์ผ๋ก ์์ฃผ ์ฝ๋ ์ํค ํ์ด์ง๋ค. reverse delta์ HEAD O(1)์ ๊ทธ ์ํฌ๋ก๋์ ๋ง๋ ์ ํ์ด๋ฏ๋ก ์ ์งํ๋ค. ๋์ RCS๊ฐ rename์ผ๋ก ๊ณต์ง๋ก ์ป๋ ์์์ฑ์, ์ฐ๋ฆฌ๋ ์ค์ฌ๋์ ์ฐ๊ธฐ ๊ตฌ๊ฐ์ ์ ๋๋ก ๋๋๋ ค์ค๋ค.
C๋ ์ฌ์ค์ ๋ค๋ฅธ ์ ์ฅ ์์ง์ด๋ผ ๋ณ๋ ๋ ผ์๊ฐ ํ์ํ๊ณ , B๋ ์ด ๋ ผ์์ ์ถ๋ฐ์ ์ด๋ ์ํฉ์์ ๊ฐ์ฅ ๋จผ์ ์คํจํ๋ค.
- ๋๊น ์ง์ ์ค์ธก:
RLIMIT_FSIZE๋ฅผbase + N์ผ๋ก ๊ฑธ๊ณ ์ปค๋ฐํ ๋ค ํ์ผ ์ํ๋ฅผ ํ์ธ.SIGXFSZ๋ฅผ ๋ฌด์ํด์ผ ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ง ์๊ณOSError๋ฅผ ๋ฐ๋๋ค. - RCS ๋ธํ ๋ฐฉํฅ:
ci/co๋ก ๋ธ๋์น๋ฅผ ๋ง๋ ๋ค,v๋ฅผ ์ง์ ์ด์ด๋ณธ๋ค. - hg revlog: ์์ค ํธ๋ฆฌ์์
PYTHONPATH=<hg์์ค> python3 <hg์์ค>/hg๋ก ๋ฐ๋ก ์คํํ ์ ์๋ค.hg debugrevlog/hg debugdeltachain์ด ์ค๋ ์ท ์์ ์ฒด์ธ ๊ธธ์ด๋ฅผ ๋ณด์ฌ์ค๋ค.
- Storage Format โ ๋ธ๋ก ๋ ์ด์์๊ณผ ์ญ๋ธํ ๊ตฌ์กฐ
- Wiki Backend Design โ ์ ์ฅ ๋ฐฑ์๋ ์ ํ๊ณผ ๋ฒค์น๋งํฌ
-
PR #17 โ
verify()๊ฐ ์๋ฆฐ ๋ธ๋ก์ ์ฃฝ๋ ๋ฌธ์