diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2015-01-16 14:26:45 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2015-01-19 03:12:27 -0800 |
commit | b45f623a7a8e14ca09a10c6a04c4c5f81e3a62e2 (patch) | |
tree | 76407df4f1de33c0304dde8e83faa547d2150e13 | |
parent | 8d73f6288249757662cf36e746835e3ecd84add1 (diff) |
cluster/dht: Fix incorrect updates to parent times
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: I535a600b9f89b8d9b6714a73476e63ce60e169a8
BUG: 1179169
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/9457
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Tested-by: Raghavendra G <rgowdapp@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 d1671dcd879..0a0ce52f3da 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -435,15 +435,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; \ |