ergaenzend zum post von @Dunuin (das zu 99% stimmt):
der client fragt nicht beim server nach, ob ein chunk schon existiert (das waere sonst ein ziemliches einfallstor fuer information leaks ). stattdessen passiert folgendes:
1. client startet backup session
2. server legt neuen snapshot an
3. server locked vorherigen snapshot in der gruppe (falls vorhanden)
4. client holt sich manifest und indizes des vorherigen snapshots (falls vorhanden)
5. client kann nun selbst feststellen, ob ein chunk vom vorherigen snapshot referenziert wird - falls ja, muss nur die info in welchem index and welcher stelle der chunk benoetigt wird geschickt werden, falls nein, der chunk + die info
6. server macht dann den gegencheck, falls der chunk nicht mitgeschickt worden ist, um sicherzustellen das nicht durch einen bug ein chunk eingetragen wird der nicht (mehr?) existiert
7. server spart sich den write, falls ein hochgeladener chunk schon existiert und passt
punkt 3 stellt sicher, dass die infos welche chunks schon existieren nicht waehrend des backups ungueltig werden kann (das lock verhindert ein loeschen des snapshots, und solange der snapshot existiert raeumt eine garbage collection die darin referenzierten chunks natuerlich nicht auf!)
die dirty bitmap bei VMs hilft bei punkt 5 - wenn die bitmap sagt das ein gewisser bereicht der VM disk nicht geaendert worden ist, muss der client nichtmal lesen und hashen um zu wissen, dass der chunk schon existiert, daher gehts dann noch flotter ("fast incremental mode").
der schritt 7 ist quasi noch ein server-seitiges deduplizieren und I/O optimierung, falls ein chunk in mehreren gruppen referenziert wird (z.b., wenn gaeste von ein und demselben template instanziert worden sind) oder im letzten snapshot nicht enthalten war, aber davor schon.
der client fragt nicht beim server nach, ob ein chunk schon existiert (das waere sonst ein ziemliches einfallstor fuer information leaks ). stattdessen passiert folgendes:
1. client startet backup session
2. server legt neuen snapshot an
3. server locked vorherigen snapshot in der gruppe (falls vorhanden)
4. client holt sich manifest und indizes des vorherigen snapshots (falls vorhanden)
5. client kann nun selbst feststellen, ob ein chunk vom vorherigen snapshot referenziert wird - falls ja, muss nur die info in welchem index and welcher stelle der chunk benoetigt wird geschickt werden, falls nein, der chunk + die info
6. server macht dann den gegencheck, falls der chunk nicht mitgeschickt worden ist, um sicherzustellen das nicht durch einen bug ein chunk eingetragen wird der nicht (mehr?) existiert
7. server spart sich den write, falls ein hochgeladener chunk schon existiert und passt
punkt 3 stellt sicher, dass die infos welche chunks schon existieren nicht waehrend des backups ungueltig werden kann (das lock verhindert ein loeschen des snapshots, und solange der snapshot existiert raeumt eine garbage collection die darin referenzierten chunks natuerlich nicht auf!)
die dirty bitmap bei VMs hilft bei punkt 5 - wenn die bitmap sagt das ein gewisser bereicht der VM disk nicht geaendert worden ist, muss der client nichtmal lesen und hashen um zu wissen, dass der chunk schon existiert, daher gehts dann noch flotter ("fast incremental mode").
der schritt 7 ist quasi noch ein server-seitiges deduplizieren und I/O optimierung, falls ein chunk in mehreren gruppen referenziert wird (z.b., wenn gaeste von ein und demselben template instanziert worden sind) oder im letzten snapshot nicht enthalten war, aber davor schon.