diff options
| author | Krutika Dhananjay <kdhananj@redhat.com> | 2015-01-16 14:26:45 +0530 | 
|---|---|---|
| committer | Niels de Vos <ndevos@redhat.com> | 2015-02-05 07:04:47 -0800 | 
| commit | 4b3981d2c9b4cafa24398765b3d0c8a4d45d43b1 (patch) | |
| tree | cd00721b993e5689f7e68315c9d5a478be6ac668 | |
| parent | bb2df4e63fa8a5d65f18b4a5efc757e8d475fbff (diff) | |
cluster/dht: Fix incorrect updates to parent times
        Backport of: http://review.gluster.org/9457
In directory write FOPs, as far as updates to timestamps associated
with parent by DHT is concerned, there are three possibilities:
a) time (in sec) gotten from child of DHT < time (in sec) in inode ctx
b) time (in sec) gotten from child of DHT = time (in sec) in inode ctx
c) time (in sec) gotten from child of DHT > time (in sec) in inode ctx
In case (c), for time in nsecs, it is the value returned by DHT's child
that must be selected. But what DHT_UPDATE_TIME ends up doing is to choose
the maximum of (time in nsec gotten from DHT's child, time in nsec in inode ctx).
Change-Id: I1388e374c8a2029f3b8919380e68620e7591bde6
BUG: 1186121
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/9496
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 11 | 
1 files changed, 5 insertions, 6 deletions
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index b9a696bb628..d421f29314d 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -417,15 +417,14 @@ typedef enum {          } while (0)  #define DHT_UPDATE_TIME(ctx_sec, ctx_nsec, new_sec, new_nsec, inode, post) do {\ -                int32_t sec = 0;                                        \ -                sec = new_sec;                                          \                  LOCK (&inode->lock);                                    \                  {                                                       \ -                        new_sec = max(new_sec, ctx_sec);                \ -                        if (sec < new_sec)                              \ -                                new_nsec = ctx_nsec;                    \ -                        if (sec == new_sec)                             \ +                        if (ctx_sec == new_sec)                         \                                  new_nsec = max (new_nsec, ctx_nsec);    \ +                        else if (ctx_sec > new_sec) {                   \ +                                new_sec = ctx_sec;                      \ +                                new_nsec = ctx_nsec;                    \ +                        }                                               \                          if (post) {                                     \                                  ctx_sec = new_sec;                      \                                  ctx_nsec = new_nsec;                    \  | 
