Re: stat() returns invalid file size when self healing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/12/2017 01:57 PM, Mateusz Slupny wrote:
Hi,

I'm observing strange behavior when accessing glusterfs 3.10.0 volume through FUSE mount: when self-healing, stat() on a file that I know has non-zero size and is being appended to results in stat() return code 0, and st_size being set to 0 as well.

Next week I'm planning to find a minimal reproducible example and file a bug report. I wasn't able to find any references to similar issues, but I wanted to make sure that it isn't an already known problem.

Some notes about my current setup:
- Multiple applications are writing to multiple FUSE mounts pointing to the same gluster volume. Only one of those applicatuibs is writing to a given file at a time. I am only appending to files, or to be specific calling pwrite() with offset set to file size obtained by stat(). (I'm not sure if using O_APPEND would change anything, but still it would be a workaround, so shouldn't matter.) - The issue happens even if no reads are performed on those files, e.g. load is no higher than usual. - Since I'm calling stat() only before writing, and only one node writes to a given file, it means that stat() returns invalid size even to clients that write to the file.

Steps to reproduce:
0. Have multiple processes constantly appending data to files.
1. Stop one replica.
2. Wait few minutes.
3. Start that replica again - shd starts self healing.
4. stat() on some of the files that are being healed returns st_size equal to 0.

Setup:
- glusterfs 3.10.0

- volume type: replicas with arbiters
Type: Distributed-Replicate
Number of Bricks: 12 x (2 + 1) = 36

- FUSE mount configuration:
-o direct-io-mode=on passed explicitly to mount

- volume configuration:
cluster.consistent-metadata: yes
cluster.eager-lock: on
cluster.readdir-optimize: on
cluster.self-heal-readdir-size: 64KB
cluster.self-heal-daemon: on
cluster.read-hash-mode: 2
cluster.use-compound-fops: on
cluster.ensure-durability: on
cluster.granular-entry-heal: enable
cluster.entry-self-heal: off
cluster.data-self-heal: off
cluster.metadata-self-heal: off
performance.quick-read: off
performance.md-cache-timeout: 600
performance.cache-invalidation: on
performance.stat-prefetch: on
features.cache-invalidation-timeout: 600
features.cache-invalidation: on
performance.flush-behind: off
performance.write-behind: off
performance.open-behind: off
cluster.background-self-heal-count: 1
network.inode-lru-limit: 1024
network.ping-timeout: 1
performance.io-cache: off
transport.address-family: inet
nfs.disable: on
cluster.locking-scheme: granular

I have already verified that following options do not influence this behavior:
- cluster.data-self-heal-algorithm (all possible values)
- cluster.eager-lock
- cluster.consistent-metadata
- performance.stat-prefetch

I would greatly appreciate any hints on what may be wrong with the current setup, or what to focus on (or not) in minimal reproducible example.


Would you be able to try and see if you can reproduce this in a replica-3 volume? Since you are observing it on arbiter config, the bug could be that the stat is being served from the arbiter brick but we had fixed (http://review.gluster.org/13609) in one of the 3.7 releases itself, so maybe this is a new bug. In any case please do raise the bug with the gluster logs attached.

Regards,
Ravi


thanks and best regards,
Matt
_______________________________________________
Gluster-devel mailing list
Gluster-devel@xxxxxxxxxxx
http://lists.gluster.org/mailman/listinfo/gluster-devel


_______________________________________________
Gluster-devel mailing list
Gluster-devel@xxxxxxxxxxx
http://lists.gluster.org/mailman/listinfo/gluster-devel



[Index of Archives]     [Gluster Users]     [Ceph Users]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux