[OpenAFS] sqlite on AFS will not work, even with whole-file locking
Simon Wilkinson
sxw@inf.ed.ac.uk
Thu, 22 Apr 2010 11:19:57 +0100
On 22 Apr 2010, at 08:42, Hans-Werner Paulsen wrote:
> I do not know the exact semantics of the AFS filesystem, and
> therefore I
> do not know that it is a bug. Is it really a bug?
> Running the following program on machine A
>
> fd = open("xxx",O_RDONLY);
> while (1) {
> ret = fstat(fd,&buf);
> printf("size: %d mtime: %s",
> (int)buf.st_size,ctime(&(buf.st_mtime)));
> sleep(1);
> }
>
> and modifying "xxx" on machine B (e.g. echo "J" >>xxx) reports me the
> up-to-date information on machine A.
> But, when I open the file with
> fd = open("xxx",O_RDWR);
> the stat-information is never updated.
> This is on i386_linux26 with 1.4.12, but I have seen this behavior
> forever.
Okay, I understand now. And you're right, this is somewhat strange
behaviour, which has been there for years. And it won't help in the
cooperative locking case, sadly.
When a file is opened RW, and is marked as being dirty, the Unix cache
manager stores all of that files details locally - it won't update
stat information in response to callback breaks, nor will it flush
pages that are already in memory, or invalidate chunks on disk. It
does this in an attempt to prevent locally made changes from being
overwritten by those on the server (because AFS is write-on-close, and
our conflict resolution strategy is last-closer-wins).
The fact that just opening the file is sufficient to mark it as dirty
seems like a bug to me (it's not clear from a quick glance at the code
why this is happening, although I wonder if it's related to an attempt
to set the atime).
In theory this behaviour would be mitigated, for the cooperating
processes case at least, by flushing every time we unlock. I haven't
yet checked whether we do so, or whether simply doing so is enough to
clear the dirty flag, but it should be.
S.