From: Robert R P. <rpi...@ya...> - 2009-03-25 16:21:23
|
Alright I think I know what's going on here. The separate file reads on the same file are so close together that the kernel has the file data in it's buffer still so FUSE never bothers to call my code as it already has the data. When it can't find it in the buffer it calls my code which may be at a further offset than what I last saw for the file handle. That's the assumption I am going to work under unless someone can correct me. > -----Original Message----- > From: Robert R Pittana > Sent: Tuesday, March 24, 2009 10:54 PM > To: 'fus...@li...' > Subject: Understanding read offset behavior? > > > While reading the same file from my FUSE file system from two separate > programs I see that while the read requests come in with distinct file > handles the offsets are consecutive. I thought offsets were supposed to > unique for each file handle at least in normal file IO land. Is this a > kernel file IO thing? Let me try to explain with some pseudo-code. > > FUSE calls open(const char* path, struct fuse_file_info *fi) > path = wibble > my code sets fi->fh = 1 > > FUSE calls open(const char* path, struct fuse_file_info *fi) > path = wibble > my code sets fi->fh = 2 > > FUSE calls read(const char* path, char* buf, size_t size, off_t offset, > struct fuse_file_info *fi) > path = wibble > fi->fh = 1 > offset = 0 > return 4096 bytes > > FUSE calls read(const char* path, char* buf, size_t size, off_t offset, > struct fuse_file_info *fi) > path = wibble > fi->fh = 1 > offset = 4096 > return 4096 bytes > > So far so good. > > FUSE calls read(const char* path, char* buf, size_t size, off_t offset, > struct fuse_file_info *fi) > path = wibble > fi->fh = 2 > offset = 8192 !!! > > This is not what I would have expected. Can some one help explain this > behavior and if there is a mount option or FUSE parameter in code I can > change it to make it do what I would expect? > > TIA > -Robert > > |
From: Miklos S. <mi...@sz...> - 2009-03-26 16:44:53
|
On Wed, 25 Mar 2009, Robert R Pittana wrote: > Alright I think I know what's going on here. > > The separate file reads on the same file are so close together that the > kernel has the file data in it's buffer still so FUSE never bothers to > call my code as it already has the data. When it can't find it in the > buffer it calls my code which may be at a further offset than what I > last saw for the file handle. That's the assumption I am going to work > under unless someone can correct me. Yes. By default open() will flush the cache, so if the file is only kept open for a short time (which is the normal behavior of programs) then this will only happen if the two accesses are close to each other. There are two options which affect this behavior: -o direct_io disable caching, all reads will be seen by the fuse fs -o kernel_cache disable flushing the cache on open, the behavior you observe will happen even when the reads are far apart Thanks, Miklos > > > > -----Original Message----- > > From: Robert R Pittana > > Sent: Tuesday, March 24, 2009 10:54 PM > > To: 'fus...@li...' > > Subject: Understanding read offset behavior? > > > > > > While reading the same file from my FUSE file system from two separate > > programs I see that while the read requests come in with distinct file > > handles the offsets are consecutive. I thought offsets were supposed > to > > unique for each file handle at least in normal file IO land. Is this a > > kernel file IO thing? Let me try to explain with some pseudo-code. > > > > FUSE calls open(const char* path, struct fuse_file_info *fi) > > path = wibble > > my code sets fi->fh = 1 > > > > FUSE calls open(const char* path, struct fuse_file_info *fi) > > path = wibble > > my code sets fi->fh = 2 > > > > FUSE calls read(const char* path, char* buf, size_t size, off_t > offset, > > struct fuse_file_info *fi) > > path = wibble > > fi->fh = 1 > > offset = 0 > > return 4096 bytes > > > > FUSE calls read(const char* path, char* buf, size_t size, off_t > offset, > > struct fuse_file_info *fi) > > path = wibble > > fi->fh = 1 > > offset = 4096 > > return 4096 bytes > > > > So far so good. > > > > FUSE calls read(const char* path, char* buf, size_t size, off_t > offset, > > struct fuse_file_info *fi) > > path = wibble > > fi->fh = 2 > > offset = 8192 !!! > > > > This is not what I would have expected. Can some one help explain this > > behavior and if there is a mount option or FUSE parameter in code I > can > > change it to make it do what I would expect? > > > > TIA > > -Robert > > > > > > > ------------------------------------------------------------------------------ > _______________________________________________ > fuse-devel mailing list > fus...@li... > https://lists.sourceforge.net/lists/listinfo/fuse-devel > |