[Gluster-devel] lookup caching

Olivier Le Cam Olivier.LeCam at crdp.ac-versailles.fr
Mon Apr 12 09:26:01 UTC 2010

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,

More information about the Gluster-devel mailing list