Skip to content

Commit 2ade049

Browse files
committed
add review of recursive sync plan document
1 parent ff64165 commit 2ade049

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

dd_recursive_plan_v2.review_v1.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Review dokumentu add_recursive_plan_v2.md
2+
3+
## Celkové hodnocení
4+
5+
**Bude to fungovat?** Ano, po opravě kritických bodů níže.
6+
7+
**Je to správně navržené?** Ano, přístup je principiálně správný a podobný rsync. Pro uvedené use cases (VM images, databáze) je fixed-block hashing vhodný.
8+
9+
---
10+
11+
## Kritické problémy
12+
13+
### 1. Nekonzistence umístění `--delete`
14+
15+
Dokument si protiřečí:
16+
- **Řádek 301-303** ukazuje: `blockcopy save --recursive --delete /path/to/dest_dir`
17+
- **Řádek 773-779** argumentuje, že `--delete` patří na retrieve
18+
19+
Jedno z toho je špatně. Podle logiky v sekci "Designová rozhodnutí" by mělo být `--delete` na retrieve (protože retrieve generuje `remv` příkazy). CLI příklad na řádku 301-303 je tedy chybný.
20+
21+
### 2. Změna typu položky - chyba v algoritmu
22+
23+
Sekce "Změna typu položky" (řádky 344-349) popisuje co se má stát, ale algoritmus retrieve (řádky 242-259) to neimplementuje správně:
24+
25+
**Problém:** Pokud dest má soubor `foo` a source má adresář `foo`:
26+
1. Checksum pošle `file + "foo"`
27+
2. Retrieve přidá `"foo"` do `seen_paths`
28+
3. Retrieve zjistí, že `foo` na source není soubor → přidá do `to_delete`
29+
4. Retrieve projde source, najde adresář `foo`
30+
5. `"foo"` JE v `seen_paths` → nepošle se jako nový ✗
31+
32+
**Řešení:** Buď rozlišit `seen_files` a `seen_dirs`, nebo přidávat do `seen_paths` pouze pokud položka existuje na source se stejným typem.
33+
34+
---
35+
36+
## Střední problémy
37+
38+
### 3. Symlink cykly
39+
40+
Dokument zmiňuje `followlinks=True`, ale neřeší detekci cyklů. Symlink `/a/b/c → /a` způsobí nekonečnou smyčku. Python's `os.walk` s `followlinks=True` může zacyklit.
41+
42+
**Řešení:** Sledovat navštívené inodes (device, inode) a přeskočit již navštívené adresáře.
43+
44+
### 4. Metadata pro nezměněné soubory
45+
46+
Řádky 199-201 ukazují, že i pro nezměněný soubor se posílá `meta`:
47+
```
48+
file + "src/utils/helper.py"
49+
meta + <metadata>
50+
endf
51+
```
52+
53+
Je to záměr? Výhoda: umožňuje aktualizovat permissions/timestamps i bez změny obsahu. Nevýhoda: bandwidth overhead. Mělo by být explicitně zdokumentováno, proč se to dělá.
54+
55+
---
56+
57+
## Drobné poznámky
58+
59+
### 5. Pořadí není striktně abecední
60+
61+
Řádek 13 říká "položky se zpracovávají v abecedním pořadí", ale skutečné pořadí výstupu retrieve je:
62+
1. Odpovědi na položky z dest (abecedně mezi sebou)
63+
2. Nové položky ze source (abecedně mezi sebou)
64+
3. Příkazy `remv`
65+
66+
To není celkově abecední. Pro správné fungování to nevadí (rodiče stále předchází potomkům), ale dokumentace je zavádějící.
67+
68+
### 6. Chybí verzování protokolu
69+
70+
Dokument říká, že změny nejsou zpětně kompatibilní s 0.0.3, ale protokol nemá mechanismus pro vyjednání verze. Auto-detekce podle prvního příkazu (`dire` vs `Hash`) rozliší recursive/single-file, ale neřeší budoucí změny protokolu.
71+
72+
---
73+
74+
## Co opravit před implementací
75+
76+
1. Sjednotit `--delete` na retrieve (opravit CLI příklad)
77+
2. Opravit algoritmus pro změnu typu položky
78+
3. Přidat detekci symlink cyklů do `walk_directory()`

0 commit comments

Comments
 (0)