-
Notifications
You must be signed in to change notification settings - Fork 3
System Overview
ํ์ผ ํ๋์ ๋ฒ์ ์ด๋ ฅ์ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ๋ฑ ๊ทธ๊ฑฐ ํ๋๋ง ํ๋ค.
Git์ฒ๋ผ ์ฌ๋ฌ ํ์ผ์ ํธ๋ํนํ๋ ์ ์ฅ์๋ ์๋๊ณ , ๋ธ๋์น๋ ์๊ณ , ์๋ฒ๋
์๋ค. SimpleRCS ํด๋์ค ํ๋๋ฅผ ํ์ผ ๊ฒฝ๋ก๋ BytesIO, ํน์ ํ์ผ๊ณผ ๋น์ทํ๊ฒ
๋์ํ๋ ์๋ฌด ๊ฐ์ฒด(BinaryIO)์ ๋ถ์ด๋ฉด, ๊ทธ ์คํธ๋ฆผ ์์ ์ปค๋ฐ ์ด๋ ฅ์
์ฐจ๊ณก์ฐจ๊ณก ์๋๋ค.
์ ์ด๋ฐ ๊ฒ ํ์ํ๋๋ฉด โ Git์ ์ฐ๊ธฐ์ ์ค๋ฒํค๋๊ฐ ํฐ ์ํฉ์ด ์๋ค. ์ํค
ํ์ด์ง ํ๋, ์ค์ ํ์ผ ํ๋, DB ์ปฌ๋ผ์ ๋ฐ์๋ฃ์ ๋ฌธ์ ํ๋์ ํ์คํ ๋ฆฌ๋ฅผ
๊ด๋ฆฌํ๊ณ ์ถ์ ๋, .git ๋๋ ํ ๋ฆฌ๋ฅผ ํต์งธ๋ก ๋ง๋ค๊ณ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ ์งํ๋
๊ฑด ๋ญ๋น๋ค. SimpleRCS๋ ๊ทธ ์๋ฆฌ์ ํ์ผ ํ๋(ํน์ DB์ BLOB ์ปฌ๋ผ ํ๋)๋ก
๋ค์ด๊ฐ๋ค.
์ ํต์ ์ธ RCS์ ๊ฐ์ ๋ฐ์์ด๋ค. HEAD(์ต์ ๋ฒ์ )๋ ํญ์ ์ ์ฒด ํ ์คํธ๋ก ์ ์ฅํ๊ณ , ๊ทธ๋ณด๋ค ์ค๋๋ ๋ฒ์ ๋ค์ "ํ ๋จ๊ณ ์ต์ ๋ฒ์ ์์ ์ด ๋ฒ์ ์ผ๋ก ๋๋๋ฆฌ๋ ๋ฐฉ๋ฒ"๋ง ๋ธํ๋ก ์ ์ฅํ๋ค.
[V1 ๋ธํ] [V2 ๋ธํ] ... [Vn-1 ๋ธํ] [Vn ์ ์ฒด ํ
์คํธ]
^^^^^^^^^^^^^^
HEAD
์ด๋ ๊ฒ ํ๋ฉด ๋ ๊ฐ์ง๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ผ์จ๋ค.
- ์ต์ ๋ฒ์ ์ฝ๊ธฐ๊ฐ ํญ์ ๋น ๋ฅด๋ค. ์ค๋ฌด์์ ์ ์ผ ์์ฃผ ์ฝ๋ ๊ฒ ์ต์ ๋ฒ์ ์ด๋๊น, ๊ฑฐ๊ธฐ์ ์ต์ ํํ๋ ๊ฒ ๋ง๋ค. O(1).
- ๊ณผ๊ฑฐ ๋ฒ์ ์ฝ๊ธฐ๋ ๊ฑฐ๋ฆฌ์ ๋น๋กํด์ ๋๋ ค์ง๋ค. HEAD์์ 5๋ฒ์ ์ ์ด๋ฉด ๋ธํ 5๊ฐ๋ฅผ ์์๋๋ก ์ ์ฉํด์ผ ํ๋ค. O(k), k = HEAD์์ ๊ฑฐ๋ฆฌ.
commit()์ ํธ์ถํ๋ฉด:
- ์ง๊ธ HEAD(์ ์ฒด ํ ์คํธ)๋ฅผ ์ฝ๋๋ค
- "์ ๋ด์ฉ โ ์ง๊ธ HEAD"๋ก ๋๋๋ฆฌ๋ ๋ธํ๋ฅผ ๊ณ์ฐํ๋ค
- ๊ธฐ์กด HEAD ๋ธ๋ก์ ๊ทธ ๋ธํ๋ก ๋ฐ๊พผ๋ค (์ ์ฒด ํ ์คํธ์๋ ๊ฒ ๋ธํ๋ก ๋ฐ๋)
- ์ ๋ด์ฉ์ ์ ์ฒด ํ ์คํธ๋ก ๊ทธ ๋ค์ ๋ถ์ธ๋ค
์ฆ ๋งค ์ปค๋ฐ๋ง๋ค ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ "๋ง์ง๋ง ๋ธ๋ก ํ๋ + ์ ๋ธ๋ก"๋ฟ์ด๋ค. ๊ทธ ์์ ๋ชจ๋ ์ด๋ ฅ์ ๋ฐ์ดํธ ๊ทธ๋๋ก๋ค. ํ์คํ ๋ฆฌ ์ ์ฒด๋ฅผ ๋ค์ ์ฐ๋ ์ผ์ ์๋ค.
ํ์ผ ๊ฒฝ๋ก๋ก ์ฐ ์ ์ฅ์์์๋ ์ด ๊ฒฐ๊ณผ๊ฐ ์์์ ์ผ๋ก ์ค์น๋๋ค โ ๋ฐ๋์ง ์๋
์๋ถ๋ถ์ ์์ ์์ ํ์ผ๋ก ๋ณต์ฌํ๊ณ , ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ถ์ด๊ณ , os.replace()๋ก
๊ฐ์๋ผ์ด๋ค. ์ด์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ฐ๋ ์ง์ ์ด ์์ผ๋ฏ๋ก ์ปค๋ฐ์ด ๋์ค์ ๋๊ฒจ๋
์๋ ๊ฒ์ ๊ทธ ์ปค๋ฐ์ด์ง ์ด๋ ฅ์ด ์๋๋ค. ์ญ๋ธํ์์๋ ์ด๊ฒ ์ค์ํ๋ฐ, ๊ณผ๊ฑฐ ๋ฒ์ ์ด
์ ๋ถ HEAD๋ฅผ ์ต์ปค๋ก ์ผ๊ธฐ ๋๋ฌธ์ HEAD ํ๋๊ฐ ๋ฐ์ฏค ๋ง๊ฐ์ง๋ฉด ๊ทธ ์์ด ๋์์
๋ณต์ ๋ถ๊ฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. BytesIO๋ ํธ์ถ์๊ฐ ๋๊ธด ์คํธ๋ฆผ์ ๊ฐ์๋ผ์ธ ๊ฒฝ๋ก๊ฐ
์์ด ์์ ์ฒ๋ผ ์ ์๋ฆฌ์์ ๋ค์ ์ด๋ค.
์์ธํ ์ฝ๋ ๋ ๋ฒจ ์ค๋ช ์ Storage Format, ์ค๊ณ ๊ทผ๊ฑฐ์ ์ค์ธก์ Plan Atomic Commit์ ์๋ค.
commit()์ str์ ๋๊ธฐ๋ฉด RCS ์คํ์ผ ๋ผ์ธ ๋ธํ(diff -n ๊ณ์ด)๋ก,
bytes๋ฅผ ๋๊ธฐ๋ฉด BSDIFF40 ํธํ ๋ฐ์ด๋๋ฆฌ ํจ์น๋ก ์ ์ฅํ๋ค. ํธ์ถํ๋
์ชฝ์์๋ ๊ทธ๋ฅ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฐ๋ฉด ๋๊ณ , ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๋ธํ ์๊ณ ๋ฆฌ์ฆ์
์ธ์ง๋ ํ์
๋ง ๋ณด๊ณ ๊ฒฐ์ ํ๋ค. ์ด๋ฏธ์ง, PDF, ์์ถ ํ์ผ ๊ฐ์ ๊ฒ๋ ๊ฐ์
.srcs ํฌ๋งท ์์ ํ์คํ ๋ฆฌ๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๋ป์ด๋ค.
v2 ํฌ๋งท๋ถํฐ๋ ๋ธ๋ก๋ง๋ค "์ด ๋ธ๋ก์ ๋
ผ๋ฆฌ์ ๋ด์ฉ ํด์ + ์ด์ ๋ธ๋ก ํด์"๋ฅผ
๊ฐ์ด ์ ์ฅํ๋ค. Git์ ์ปค๋ฐ ์ฒด์ธ์ด๋ ๋น์ทํ ์๊ฐ์ด๋ค โ ๊ณผ๊ฑฐ ์ด๋ ์์ ์
๋ด์ฉ์ ์กฐ์ํ๋ฉด ๊ทธ ๋ค๋ก ์ด์ด์ง๋ ํด์๊ฐ ์ ๋ถ ์ ๋ง๊ฒ ๋์ด verify()๋ก
์ก์๋ผ ์ ์๋ค. ์ฌ๊ธฐ์ ๋ํด GPG ๊ธฐ๋ฐ ๋ค์ค ์๋ช
์ ์๋ช
/๊ฒ์ฆ๋ ๋ถ์ผ ์
์๋ค(simple_rcs_gpg ๋ชจ๋).
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์๋ diff ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฌ ๊ฐ ์๋ค โ ๊ทธ๋ฆฌ๋ ํด์ ๋งค์นญ
(StreamSequenceMatcher), ์์ ํ์ด์ฌ Myers ๊ตฌํ, Cython์ผ๋ก ์ปดํ์ผํ
Myers SES/DMP๊น์ง. ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก commit()/checkout() ๊ฒฝ๋ก๊ฐ ์ฐ๋
๊ฑด StreamSequenceMatcher ํ๋๋ฟ์ด๋ค โ ์ต๋จ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์ฅํ์ง
์์ง๋ง ๋น ๋ฅด๋ค. ๋๋จธ์ง๋ ๋ฒค์น๋งํฌยท๋น๊ต์ฉ์ผ๋ก ๋จ์์๋ค. ์ ์ด๋ ๊ฒ
๋๋์ง, ๋ญ๊ฐ ๋ ๋์ ์ ํ์ธ์ง๋ Diff Engines์์ ๋ค๋ฃฌ๋ค.
| ํญ๋ชฉ | SimpleRCS | ์ ํต RCS | Git | ๋จ์ DB ์ค๋ ์ท |
|---|---|---|---|---|
| ์ ์ฅ ๋จ์ | ์คํธ๋ฆผ(ํ์ผ) ํ๋ | ํ์ผ(*,v) ํ๋ |
๊ฐ์ฒด DB + ์์ ํธ๋ฆฌ | DB ํ |
| ๋ธํ ๋ฐฉํฅ | ์ญ๋ฐฉํฅ (HEAD=์ ์ฒด) | ์ญ๋ฐฉํฅ (HEAD=์ ์ฒด) | ์ค๋ ์ท (ํจํน ์ ๋ธํ) | ๋ธํ ์์ |
| ์ฝํ ์ธ | ํ ์คํธ + ๋ฐ์ด๋๋ฆฌ ๋์ผ ํฌ๋งท | ํ ์คํธ ์ ์ฉ | ๋ญ๋ (blob) | ๋ญ๋ |
| ๋ฌด๊ฒฐ์ฑ | v2 ํด์์ฒด์ธ + GPG | ์์ | ์ฝํ ์ธ ์ฃผ์ ๊ธฐ๋ฐ | DB ๋๋ฆ |
| ๊ฐฑ์ ์์์ฑ | temp + rename (O(ฮด)) |
temp + rename (O(ํ์ผ)) |
๋ถ๋ณ ๊ฐ์ฒด + rename | ํธ๋์ญ์ |
| HEAD ์กฐํ | O(1) | O(1) | O(1) | O(1) |
| ๊ณผ๊ฑฐ ์กฐํ | O(k) ๋ฐฑ์๋ ์ค์บ | O(N) ์๋ฐฉํฅ | O(log N) | O(1) |
๋ ์์ธํ ๋น๊ต๋ ์ ์ฅ์ ๋ฃจํธ์ README.md์ ์๋ค.
- ์ฌ๋ฌ ํ์ผ์ ๊ด๋ฆฌํ๋ ์ ์ฅ์๊ฐ ์๋๋ค (ํ์ผ ํ๋๋น ์ธ์คํด์ค ํ๋)
- ๋ธ๋์น/๋จธ์ง ๊ฐ๋ ์ด ์๋ค โ ํญ์ ์ ํ ํ์คํ ๋ฆฌ
- ๋์ํธ์ง ์ถฉ๋ ๊ฐ์ง๋ ํ์ผ ์ ๊ธ์ด ๋ด์ฅ๋ผ ์์ง ์๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋ถ๋ ์์คํ (์: ์ํค) ์์ ์น์ผ๋ ค๋ฉด ์ด ๋ถ๋ถ์ ์ง์ ๊ตฌํํด์ผ ํ๋ค โ ์์ธํ ๋ด์ฉ์ Wiki Backend Design ์ฐธ๊ณ .