Hello there,
Raghavendra G wrote:
I can see three protocol calls:
- client_open() (to both servers)
- client_stat() (to one server only: load balancing?)
- client_flush() (to both servers)
io-cache indeed sends open and flush to server. This is needed for
correct working of io-cache. As you've told below, since you are
overriding lookup call, stat is sent to server (stat and lookup are two
different calls).
OK. So no easy workaround can get rid of that. Right?
since lookup is being unwound if the stat is cached for an inode, you've
to also implement calls like unlink, rmdir (which deletes
files/directories) and flush the cache corresponding to the inode.
Otherwise lookup will be succeeding even for unlinked files, but the
actual operations (like open/chmod/chown etc) will fail.
I have added this yesterday afternoon, as well as some LOCK/UNLOCK in
order to prevent concurrency problems. :)
You should also handle calls which can change the stat of a file or
directory (like write/chmod/chown). As a simple implementation you can
just flush the cache.
I did override setattr and fsetattr (for flushing the cache). Is it
wrong? Do I have to override write/chmod/chown either?
if (cache->next) {
do {
cache = cache->next;
if (cache->ino == ino) {
instead of just returning, you can choose to update the cached stat with
the one passed as argument to this procedure.
return 0; /* already in */
}
} while(cache->next);
}
Thanks for suggestion.
Best regards,
--
Olivier