On Fri, May 30, 2008 at 03:23:31AM +0400, Alexey Tourbin wrote: > On Fri, May 30, 2008 at 01:56:10AM +0400, Dmitry V. Levin wrote: > > On Fri, May 30, 2008 at 01:31:14AM +0400, Alexey Tourbin wrote: > > [...] > > > У меня есть идея. Для выбора точек синхронизации (gzflush) можно > > > использовать не только "слепой" rsync hint, но и cpio hint -- как > > > только мы видим cpio magic "070707", мы знаем, что через несколько > > > байтов будет mtime и потом пойдёт имя и содержимое файла. То есть > > > sync можно делать в месте окончания очередного cpio header. > > > > Это заметно снизит степень сжатия, когда в архиве много маленьких файлов? > > Этим можно управлять, чтобы сознательно пропускать только "совсем > маленькие" файлы. > > > > Правда, я не знаю, даст это что-нибудь в случае с маленькими файлами > > > или нет. Это может ничего не дать из-за того, что первые совпавшие > > > блоки в сжатом виде всё равно могут отличаться (из-за backreferences > > > в предыдущий блок). > > > > Могут или будут? > > Если сделать как показано ниже, то для пакета man-pages (после повторной > пересборки) 'speedup 1.09' возрастает до 'speedup 1.19'. То есть эффект > от синхронизации сразу после cpio хедера есть, он заметный, но не > настолько большой, чтобы всё искупать. Я реализовал более аккуратный cpio хинтинг для rsyncable_gzwrite(). Также появились первые результаты rsyncability тестирования. А именно, мы тестируем rsyncability двух rpm пакетов, как если бы они были собраны уже с помощью rsyncable_gzwrite(). test-rsynability glibc-core-2.5.1-alt4.x86_64.rpm glibc-core-2.5.1-alt5.x86_64.rpm => "speedup is 15.99" test-rsynability glibc-core-2.3.5-alt7.x86_64.rpm glibc-core-2.5.1-alt5.x86_64.rpm => "speedup is 1.00" test-rsynability glibc-2.3.5-alt7.x86_64.rpm glibc-2.5.1-alt5.x86_64.rpm => "speedup is 1.28" test-rsynability firefox-2.0.0.13-alt1.x86_64.rpm firefox-2.0.0.14-alt1.x86_64.rpm => "speedup is 1.97" test-rsynability xorg-x11-server-1.4.0.90-alt17.x86_64.rpm xorg-x11-server-1.4.0.90-alt19.x86_64.rpm => "speedup is 1.48" Например, "speedup is 1.97" для пакета firefox означает, что примерно половина кусков между этими двумя пакетами совпадают (если бы эти пакеты были собраны с rsyncable_gzwrite), а другая половина кусков не совпадает; так что по размеру придётся скачивать примерно половину фаерфокса. Вот код для тестирования. gzdio.c: #include #include #include int main() { FD_t Fd = Fdopen(fdDup(fileno(stdout)), "w9.gzdio"); assert(Fd); char buf[BUFSIZ]; size_t n, m; while ((n = fread(buf, 1, sizeof(buf), stdin))) { m = Fwrite(buf, 1, n, Fd); assert(m == n); } Fclose(Fd); return 0; } (gzdio.c надо линковать с новым librpmio, в котором сидит rsyncable_gzwrite). test-rsynability: #!/bin/sh -efu f1="$1" f2="$2" shift 2 rpm2cpio "$f1" |./gzdio >cpio1.gz rpm2cpio "$f2" |./gzdio >cpio2.gz rsync -v -e ./rsync-shell foo:cpio1.gz cpio2.gz rsync-shell: shift && exec "$@"