|
| 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