glibc i zwisy poldka

Jakub Bogusz qboosh w pld-linux.org
Pon, 11 Kwi 2005, 23:11:05 CEST


On Mon, Apr 11, 2005 at 10:19:59PM +0200, Jakub Bogusz wrote:
> On Mon, Apr 11, 2005 at 09:54:40PM +0200, Arkadiusz Miskiewicz wrote:
> > Co w takim razie jeszcze z patchem poldek-cookie.patch jest złego?
> 
> Tego jeszcze nie wiem, ale jak na razie dalej wygląda na dziwne
> zachowanie glibc, tylko w innym miejscu...

> (gdb) f 6
> #6  0x0805651c in pkgfl_restore_f (stream=0x80c1ad8, dirs=0x0, include=0) at pkgfl.c:551
> 551         fseek(stream, 1, SEEK_CUR); /* skip final '\n' */
> (gdb) f 0
> #0  gzfseek (stream=0x80bfce0, offset=0xbfffee80, whence=1) at vfile.c:130
> 130         z_off_t rc, off = *offset;
> (gdb) n
> 132         rc = gzseek(stream, off, whence);
> 1: *offset = -4149
> (gdb) p off
> $6 = -4149
> 
> Jak z 1 zrobiło się -4149?

Też poprawne. Strumienie są buforowane, fseek przestawia początek
bufora na nowy offset.
-4149 to 1+aktualna_pozycja_w_buforze-początek_bufora.

I ten poldek (z łatą!) chyyyyyyybaaaaaaaaa dziiiiaaaaaaałaaaaaa, ale
woooolnooooooo (indeks 55 pakietów czyta w ~3s, 270 pakietów
w kilkadziesiąt s, więcej w czasach ->+inf).
Problem jest taki, że seek do tyłu w zlibie działa bardzo wolno
(=przewinięcie do początku i odczyt danych aż do żądanego offsetu).
Przedtem (w 2.3.4) nie każdy seek na strumieniu z fopencookie()
powodował wywołanie seek cookie - teraz każdy.
I przewijanie do przodu o długość < rozmiar bufora jest wysoce
nieopłacalne (powoduje czytanie pliku od początku).
Wyłączenie buforowania (setvbuf(vf->vf_stream, NULL, _IONBF, 0))
powoduje wczytywanie indeksów w skończonym czasie, ale czas
"Weryfikacji" wzrasta do nieakceptowalnego.
Można pokombinować ze zmniejszeniem rozmiaru bufora i wyeliminowaniem
nieopłacalnych, krótkich fseeków (w szczególności tego o 1 bajt).


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/




Więcej informacji o liście dyskusyjnej pld-devel-pl