Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jan 1997 14:37:13 +1100 (EDT)
From:      Darren Reed <avalon@coombs.anu.edu.au>
To:        terry@lambert.org (Terry Lambert)
Cc:        stesin@gu.net, karpen@ocean.campus.luth.se, hackers@FreeBSD.org
Subject:   Re: truss, trace ??
Message-ID:  <199701140339.TAA00166@freefall.freebsd.org>
In-Reply-To: <199701132110.OAA28246@phaeton.artisoft.com> from "Terry Lambert" at Jan 13, 97 02:10:39 pm

next in thread | previous in thread | raw e-mail | index | archive | help
In some mail from Terry Lambert, sie said:
> 
> Cyclic file types imply record orientation.
> 
> They do this because you want to remove an atomic record each time
> from the front of the file in order to add your record to the end
> of the file.
> 
> For wtmp style logs, the records are not variable length, so you
> are pretty much OK.
> 
> For console logs and message logs, however, you are pretty much
> screwed.
> 
> One problem is that the underlying storage is block instead of record
> oriented anyway.  On a VMS system, you'd write a new record and
> modify an index; on a UNIX system, you would need to be able to
> instert blocks at the end of the block list (which you can do) and
> to collapse the block list up (which you can't do, currently).
> 
> In addition, you would need to be able to have the first block
> of the file be a right-associative (fill-to-end) instead of a
> standard left associative (fill-from-start-to-n-bytes) frag.  The
> associativity is important to save copies, and since the truncate
> from front for the cyclic behavior would result in frags which
> shrink over time instead of frags which grow over time.
> 
> All of this is possible, it's just not very pretty, and it doesn't
> fit in very well with the allocation of indirect blocks... you would
> need to (effectively) push all pointers up through the small number
> of direct blocks at the front of the file, as you cycled data through.

Forgive me for being simple, but why do you need to do that at all ?

The way I see it, there some things to consider which you may (or may
not) want to `work' with cyclic files:

* offset - when you pass byte n of an n byte cylic file, should lseek tell
           you that you're at byte n+1 or 0 ?

           Does it make sense to return n+1 if it can't lseek to that
           absolute position ?  Would lseek() be hacked to goto position
           x as x % n ?


* blocks - why do you need to shuffle blocks around ?  Why not just just
           the offset pointer once you get to the end ?  (In effect, the
           write is done in 2 parts: first to the end of the file, the
           second from the start).

* readers - if a reader is open and at position y and the next write will
           go from x to x+n whre x+n > y does the writer block ? (Consider
           that all data from y around to x is valid).

I guess you're thinking of what happens when you keep appending to a file
...(open - write - close.  I donm't  see that non-block sized record
files can exist as cyclic files properly under Unix, eg:

I have a 30,000 byte cyclic file.  I write 1 byte to it, making 30,001.
This isn't enough to delete the first block, but you must append it.
(hmmm, would this mean the first block would be a fragment - would it even
work ?)

Anyone for O_CYCLIC ?

Darren



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199701140339.TAA00166>