Rsync s --append-verify

Rsync s --append-verify
« kdy: 19. 01. 2018, 15:11:40 »
Zvykl jsem si u rsync v remote zálohovacích skriptech používat parametr --append-verify, jednak pro navázání po případnym přerušení spojení, ale taky aby v takových případech nezůstaly v destinaci ležet skryty nedokončeny fragmenty.

Jenže teď sem si všiml, že se v určité situaci nechová, jak bych čekal.
Pokud se nějaký soubor nepřenesl úplně, v pořádku, naváže se.
Pokud se nějaký soubor změnil a zvětšil se, celkem v pořádku, rsync provede kontrolu obsahu, všimně si změny a přenese ho znova (akorát při tom huláká varování, i když to měl čekat, když má zdroj novější timestamp).
ALE: Pokud se soubor změní, s tím že se jeho velikost nezmění nebo se zmenší, tak ho rsync nepřenese :o (přestože má novější timestamp)
Když odstraním parametr --append-verify, tak vše probíhá normálně a změna se nasynchronizuje.

Nejradši bych, aby rsync zároveň navazoval (s kontrolou dosavadního obsahu), ale taky zároveň nerezignoval na kontrolu timestampu, což teď zjevně dělá. Zatím asi jako workaround ho po dokončení s --append-verify zavolám znova bez něj...

Používám rsync 3.1.0

Vypadá to teda, že ten parametr se má používat jenom po přerušenym spojení, a ne běžně, protože pak ignoruje timestampy. Ale i tak je to problém, pokud při přerušenym přenosu nedošla řada na nějaky další soubory a cíl nebyl prázdnej, tak už je s tím appendem bude posuzovat jinak (IMO špatně).
Je to očekávané chování, nebo bug? (Kdyžtak nareportuju). Osobně bych předpokládal, že i s --append-verify, pokud si všimne že má zdroj novější timestamp, tak normálně změněný soubor přenese. Obyčejnej --append se chová podobně, akorát samozřejmě selže i v případě zvětšení - na novější timestamp na zdroji ale kašle úplně stejně.

Demonstrace:
Kód: [Vybrat]
Tom@HP-ProBook-TK~/temp/rsync_append> mkdir src && mkdir dest && echo aaa > src/a.txt
Tom@HP-ProBook-TK~/temp/rsync_append> rsync -a -v -h --append-verify src/ dest/
sending incremental file list
a.txt

sent 122 bytes  received 35 bytes  314.00 bytes/sec
total size is 4  speedup is 0.03
Tom@HP-ProBook-TK~/temp/rsync_append> cat src/a.txt dest/a.txt
aaa
aaa
Tom@HP-ProBook-TK~/temp/rsync_append> echo aba > src/a.txt
Tom@HP-ProBook-TK~/temp/rsync_append> rsync -a -v -h --append-verify src/ dest/
sending incremental file list

sent 74 bytes  received 12 bytes  172.00 bytes/sec
total size is 4  speedup is 0.05
Tom@HP-ProBook-TK~/temp/rsync_append> cat src/a.txt dest/a.txt
aba
aaa
Tom@HP-ProBook-TK~/temp/rsync_append> rsync -a -v -h src/ dest/
sending incremental file list
a.txt

sent 125 bytes  received 35 bytes  320.00 bytes/sec
total size is 4  speedup is 0.03
Tom@HP-ProBook-TK~/temp/rsync_append> cat src/a.txt dest/a.txt
aba
aba
Tom@HP-ProBook-TK~/temp/rsync_append> echo abaa > src/a.txt
Tom@HP-ProBook-TK~/temp/rsync_append> rsync -a -v -h --append-verify src/ dest/
sending incremental file list
a.txt
WARNING: a.txt failed verification -- update retained (will try again).
a.txt

sent 177 bytes  received 156 bytes  666.00 bytes/sec
total size is 5  speedup is 0.02
Tom@HP-ProBook-TK~/temp/rsync_append> cat src/a.txt dest/a.txt
abaa
abaa
« Poslední změna: 19. 01. 2018, 15:15:36 od Tomaskom »


Re:Rsync s --append-verify
« Odpověď #1 kdy: 19. 01. 2018, 15:28:01 »
Jinak samozřejmě v manpage je to chování s navazováním popsany, ale není tam zmínka o tom, že se začnou ignorovat novější timestampy na zdroji.

To chování bych chápal, pokud by timestamp byl na zdroji starší nebo stejný jako v cíli. Ale ne, pokud je novější...


Kód: [Vybrat]
       --append
              This  causes  rsync  to update a file by appending data onto the
              end of the file, which  presumes  that  the  data  that  already
              exists  on the receiving side is identical with the start of the
              file on the sending side.  If a file needs to be transferred and
              its  size on the receiver is the same or longer than the size on
              the sender, the file is skipped.  This does not  interfere  with
              the  updating  of  a file’s non-content attributes (e.g. permis-
              sions, ownership, etc.) when the file does not need to be trans-
              ferred,  nor  does  it  affect  the  updating of any non-regular
              files.  Implies --inplace, but does not conflict  with  --sparse
              (since it is always extending a file’s length).

       --append-verify
              This  works just like the --append option, but the existing data
              on the receiving side is included in the full-file checksum ver-
              ification  step,  which  will  cause  a file to be resent if the
              final verification step fails (rsync uses a normal,  non-append-
              ing --inplace transfer for the resend).

              Note:  prior  to  rsync  3.0.0,  the --append option worked like
              --append-verify, so if you are interacting with an  older  rsync
              (or  the  transfer  is using a protocol prior to 30), specifying
              either append option will initiate an --append-verify transfer.

Re:Rsync s --append-verify
« Odpověď #2 kdy: 19. 01. 2018, 15:34:01 »
Ten parametr nemá nic společného s navázáním po přerušení spojení a má dělat přesně to, co popisujete. K navazování přerušených spojení je možné použít --partial, který ponechá soubor na místě (nemaže jej), i když se spojení přeruší. Parametr --append slouží k tomu, když víte, že se soubor nikdy nemění, jenom se přidává na konec – takže tím rsyncu řeknete, ať se nestará o to, co už v souboru je, ale jenom přidá to, co přibylo na druhé straně. Dalo by se to použít třeba pro přenos logů.

Re:Rsync s --append-verify
« Odpověď #3 kdy: 19. 01. 2018, 16:33:13 »
Ten parametr nemá nic společného s navázáním po přerušení spojení a má dělat přesně to, co popisujete. K navazování přerušených spojení je možné použít --partial, který ponechá soubor na místě (nemaže jej), i když se spojení přeruší. Parametr --append slouží k tomu, když víte, že se soubor nikdy nemění, jenom se přidává na konec – takže tím rsyncu řeknete, ať se nestará o to, co už v souboru je, ale jenom přidá to, co přibylo na druhé straně. Dalo by se to použít třeba pro přenos logů.

Super, díky. Kdysi když sem četl man rsync a hledal navazování, narazil sem první na append a k partial se nedostal ;D

Re:Rsync s --append-verify
« Odpověď #4 kdy: 19. 01. 2018, 18:39:41 »
Jenom to pro jistotu upřesním, napsal jsem to poprvé omylem dvojznačně – --append má dělat přesně to, co popisujete, že dělá, ne to co jste si myslel, že dělat má. U těch souborů, které se zvětšily, vám to „fungovalo“ jenom díky tomu -verify – rsync za původní soubor doplnil zbytek z toho nového souboru (takže vám na cílovém serveru vznikl guláš – soubor, jehož první část byla stará a druhá část nová), pak spočítal kontrolní součet, zjistil, že nesedí, a začal soubor synchronizovat celý znova od začátku. Pro větší soubory vám to tedy fungovalo víceméně jen náhodou a bylo to neefektivní.


Re:Rsync s --append-verify
« Odpověď #5 kdy: 19. 01. 2018, 19:13:22 »
Jo, to jsem pochopil. Akorát sem používal variantu s verify, takže pokud se soubory jenom zvětšily nebo vznikly nové (což se dělo vlastně prakticky vždy), vše fungovalo jakoby správně, rsync akorát při kontrole existujících zvětšených křičel pokud se změnil obsah, a nahrál ho tam znovu (akorát proti tomu, co říkáte, to zjistil ještě než cokoli novyho uploadnul). Kdybych nepoužíval verify, tak si toho všimnu hned, protože by zálohy neprobíhaly korektně. To, že se zálohovalo korektně a seděly všechny kontrolní součty, byla vlastně náhoda způsobená specifikem těch dat, co se zálohovaly.

Až teď při experimentování jsem ale došel na skutečny chování, a že to nedělá to, co potřebuju (což přesně dělá --partial)

Každopádně ponaučení je, že i když si člověk při pár prvních iteracích ověří, že zálohování probíhá korektně, neznamená to, že všecko probíhá správně a do budoucna nebude problém.
Disclaimer: šlo o moje osobní zálohy, ne o nějakou produkční záležitost (nic takovyho ani pod palcem nemám).

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Rsync s --append-verify
« Odpověď #6 kdy: 19. 01. 2018, 20:44:34 »
Tedy jestli jste si timto zpusobem delal zalohy, tak me by naskakovaly pupinky z predstavy, v jakem asi budou stavu. Osobne bych na ne znovu pusiil rsync -c.

Re:Rsync s --append-verify
« Odpověď #7 kdy: 20. 01. 2018, 17:38:39 »
Vzhledem k tomu, jak se to chovalo s tím --append-verify, tak pro dosynchronizaci souborů, ktery se měnily ale nezvětšovaly, stačilo ten parametr zahodit. Každopádně přeběhnout to s -c je dobrej nápad, díky za něj, ale nic novyho to podle očekávání nenašlo.

Tímhle sem si dělal jenom nějaky konkrétní menší remote zálohy rozpracované práce (která se typicky zvětšovala, navíc to opravdu důležity mám v gitu), takže bych reálně (naštěstí) přišel max o výsledky a grafy, ktery si můžu znova vygenerovat, takže pár hodin chroupání dat a bylo by to.
Na zálohování na externí disk nebo NAS sem ten append ale nepoužíval, tam smysl nemá, takže kompletní (i když míň časty) zálohy sem měl.

Je ale pravda, že to bylo solidní rozčarování, jakou blbost sem delší dobu dělal.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Rsync s --append-verify
« Odpověď #8 kdy: 20. 01. 2018, 20:18:51 »
Vzhledem k tomu, jak se to chovalo s tím --append-verify, tak pro dosynchronizaci souborů, ktery se měnily ale nezvětšovaly, stačilo ten parametr zahodit.

Nejspis ano, ale prakticky by mohl vzniknout bordel, kdyby nejaka aplikace chytre neupdatovala modify time nebo z nejakeho obskurniho duvodu bylo datum zalohy novejsi, nez u originalu. A jak rikala ta jeptiska, sichr je sichr.