diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 148 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 50 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 85 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-layout.c | 19 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-mem-types.h | 2 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht.c | 10 | 
6 files changed, 264 insertions, 50 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 24f28c1fe27..366982e31e2 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -125,7 +125,10 @@ dht_lookup_selfheal_cbk (call_frame_t *frame, void *cookie,                  ret = dht_layout_set (this, local->inode, layout);          } -        WIPE (&local->postparent); +        if (local->loc.parent) { +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           &local->postparent, 1); +        }          DHT_STRIP_PHASE1_FLAGS (&local->stbuf); @@ -486,6 +489,11 @@ unlock:                          dht_layout_set (this, local->inode, layout);                  } +                if (local->loc.parent) { +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->postparent, 1); +                } +                  DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,                                    local->inode, &local->stbuf, local->xattr, @@ -651,7 +659,10 @@ out:                          local->op_errno = ESTALE;                  } -                WIPE (&local->postparent); +                if (local->loc.parent) { +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   postparent, 1); +                }                  DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno, @@ -704,7 +715,10 @@ dht_lookup_linkfile_create_cbk (call_frame_t *frame, void *cookie,          }  unwind: -        WIPE (&local->postparent); +        if (local->loc.parent) { +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           postparent, 1); +        }          DHT_STRIP_PHASE1_FLAGS (&local->stbuf);          DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno, @@ -777,7 +791,10 @@ dht_lookup_everywhere_done (call_frame_t *frame, xlator_t *this)                                                    "<nil>"));                  } -                WIPE (&local->postparent); +                if (local->loc.parent) { +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->postparent, 1); +                }                  DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret, @@ -807,7 +824,10 @@ dht_lookup_everywhere_done (call_frame_t *frame, xlator_t *this)                          local->op_errno = EINVAL;                  } -                WIPE (&local->postparent); +                if (local->loc.parent) { +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->postparent, 1); +                }                  DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret, @@ -1074,7 +1094,10 @@ dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie,          }  unwind: -        WIPE (postparent); +        if (local->loc.parent) { +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           postparent, 1); +        }          DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr, @@ -1157,7 +1180,6 @@ dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          loc_t        *loc           = NULL;          call_frame_t *prev          = NULL;          int           ret           = 0; -        uint64_t      tmp_layout    = 0;          dht_layout_t *parent_layout = NULL;          GF_VALIDATE_OR_GOTO ("dht", frame, err); @@ -1188,8 +1210,10 @@ dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  }                  if ((conf->search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO) &&                      (loc->parent)) { -                        ret = inode_ctx_get (loc->parent, this, &tmp_layout); -                        parent_layout = (dht_layout_t *)(long)tmp_layout; +                        ret = dht_inode_ctx_layout_get (loc->parent, this, +                                                        &parent_layout); +                        if (ret || !parent_layout) +                                goto out;                          if (parent_layout->search_unhashed) {                                  local->op_errno = ENOENT;                                  dht_lookup_everywhere (frame, this, loc); @@ -1258,7 +1282,10 @@ out:           * from each of the subvolume. See dht_iatt_merge for reference.           */ -        WIPE (postparent); +        if (local->loc.parent) { +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           postparent, 1); +        }          DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr, @@ -1517,8 +1544,12 @@ dht_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  local->postparent = *postparent;                  local->preparent = *preparent; -                WIPE (&local->postparent); -                WIPE (&local->preparent); +                if (local->loc.parent) { +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->preparent, 0); +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->postparent, 1); +                }          }  unlock:          UNLOCK (&frame->lock); @@ -2825,6 +2856,9 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,                                  gf_log (this->name, GF_LOG_WARNING,                                          "failed to link the layout in inode");                          entry->inode = inode_ref (orig_entry->inode); +                } else if (orig_entry->inode) { +                        dht_inode_ctx_time_update (orig_entry->inode, this, +                                                   &entry->d_stat, 1);                  }                  list_add_tail (&entry->list, &entries.list); @@ -3187,8 +3221,11 @@ dht_newfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          prev = cookie;          if (local->loc.parent) { -                WIPE (preparent); -                WIPE (postparent); + +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           preparent, 0); +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           postparent, 1);          }          ret = dht_layout_preset (this, prev->this, inode); @@ -3437,9 +3474,12 @@ dht_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  {          call_frame_t *prev = NULL;          dht_layout_t *layout = NULL; +        dht_local_t  *local = NULL;          prev = cookie; +        local = frame->local; +          if (op_ret == -1)                  goto out; @@ -3453,8 +3493,12 @@ dht_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        WIPE (preparent); -        WIPE (postparent); +        if (local->loc.parent) { +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           preparent, 0); +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           postparent, 1); +        }  out:          DHT_STRIP_PHASE1_FLAGS (stbuf); @@ -3583,8 +3627,11 @@ dht_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          prev = cookie;          if (local->loc.parent) { -                WIPE (preparent); -                WIPE (postparent); +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           preparent, 0); + +                dht_inode_ctx_time_update (local->loc.parent, this, +                                           postparent, 1);          }          ret = dht_layout_preset (this, prev->this, inode); @@ -3733,8 +3780,11 @@ dht_mkdir_selfheal_cbk (call_frame_t *frame, void *cookie,          if (op_ret == 0) {                  dht_layout_set (this, local->inode, layout);                  if (local->loc.parent) { -                        WIPE (&local->preparent); -                        WIPE (&local->postparent); +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->preparent, 0); + +                        dht_inode_ctx_time_update (local->loc.parent, this, +                                                   &local->postparent, 1);                  }          } @@ -4001,8 +4051,15 @@ unlock:                 } else {                          if (local->loc.parent) { -                                WIPE (&local->preparent); -                                WIPE (&local->postparent); +                                dht_inode_ctx_time_update (local->loc.parent, +                                                           this, +                                                           &local->preparent, +                                                           0); + +                                dht_inode_ctx_time_update (local->loc.parent, +                                                           this, +                                                           &local->postparent, +                                                           1);                          }                          DHT_STACK_UNWIND (rmdir, frame, local->op_ret, @@ -4088,8 +4145,17 @@ unlock:                          /* All subvol's have responded, proceed */                          if (local->loc.parent) { -                                WIPE (&local->preparent); -                                WIPE (&local->postparent); + +                                dht_inode_ctx_time_update (local->loc.parent, +                                                           this, +                                                           &local->preparent, +                                                           0); + +                                dht_inode_ctx_time_update (local->loc.parent, +                                                           this, +                                                           &local->postparent, +                                                           1); +                          }                          DHT_STACK_UNWIND (rmdir, frame, local->op_ret, @@ -4611,16 +4677,21 @@ err:  int  dht_forget (xlator_t *this, inode_t *inode)  { -        uint64_t      tmp_layout = 0; +        uint64_t        ctx_int = 0; +        dht_inode_ctx_t *ctx    = NULL;          dht_layout_t *layout = NULL; -        inode_ctx_del (inode, this, &tmp_layout); +        inode_ctx_del (inode, this, &ctx_int); -        if (!tmp_layout) +        if (!ctx_int)                  return 0; -        layout = (dht_layout_t *)(long)tmp_layout; +        ctx = (dht_inode_ctx_t *) (long) ctx_int; + +        layout = ctx->layout; +        ctx->layout = NULL;          dht_layout_unref (this, layout); +        GF_FREE (ctx);          return 0;  } @@ -4846,3 +4917,24 @@ unlock:          return ret;  } + +int +dht_inode_ctx_layout_get (inode_t *inode, xlator_t *this, dht_layout_t **layout) +{ +        dht_inode_ctx_t         *ctx            = NULL; +        int                      ret            = -1; + +        ret = dht_inode_ctx_get (inode, this, &ctx); + +        if (!ret && ctx) { +                if (ctx->layout) { +                        if (layout) +                                *layout = ctx->layout; +                        ret = 0; +                } else { +                        ret = -1; +                } +        } + +        return ret; +} diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index c02c0b83d21..be4dea90cc1 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -57,6 +57,24 @@ struct dht_layout {  };  typedef struct dht_layout  dht_layout_t; +struct dht_stat_time { +        uint32_t        atime; +        uint32_t        atime_nsec; +        uint32_t        ctime; +        uint32_t        ctime_nsec; +        uint32_t        mtime; +        uint32_t        mtime_nsec; +}; + +typedef struct dht_stat_time dht_stat_time_t; + +struct dht_inode_ctx { +        dht_layout_t    *layout; +        dht_stat_time_t  time; +}; + +typedef struct dht_inode_ctx dht_inode_ctx_t; +  typedef enum {          DHT_HASH_TYPE_DM, @@ -276,7 +294,7 @@ typedef enum {  #define ENTRY_MISSING(op_ret, op_errno) (op_ret == -1 && op_errno == ENOENT) -#define is_revalidate(loc) (inode_ctx_get (loc->inode, this, NULL) == 0) +#define is_revalidate(loc) (dht_inode_ctx_layout_get (loc->inode, this, NULL) == 0)  #define is_last_call(cnt) (cnt == 0) @@ -334,6 +352,24 @@ typedef enum {                  dht_local_wipe (__xl, __local);         \          } 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)                             \ +                                new_nsec = max (new_nsec, ctx_nsec);    \ +                        if (post) {                                     \ +                                ctx_sec = new_sec;                      \ +                                ctx_nsec = new_nsec;                    \ +                        }                                               \ +                }                                                       \ +                UNLOCK (&inode->lock);                                  \ +        } while (0) +  dht_layout_t                            *dht_layout_new (xlator_t *this, int cnt);  dht_layout_t                            *dht_layout_get (xlator_t *this, inode_t *inode);  dht_layout_t                            *dht_layout_for_subvol (xlator_t *this, xlator_t *subvol); @@ -667,4 +703,16 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t  *xattrs,  int  dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,                   int flag); +int +dht_inode_ctx_layout_get (inode_t *inode, xlator_t *this, +                          dht_layout_t **layout_int); +int +dht_inode_ctx_layout_set (inode_t *inode, xlator_t *this, +                          dht_layout_t* layout_int); +int +dht_inode_ctx_time_update (inode_t *inode, xlator_t *this, struct iatt *stat, +                           int32_t update_ctx); + +int dht_inode_ctx_get (inode_t *inode, xlator_t *this, dht_inode_ctx_t **ctx); +int dht_inode_ctx_set (inode_t *inode, xlator_t *this, dht_inode_ctx_t *ctx);  #endif/* _DHT_H */ diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index f0e74a15423..055ea7cb0b7 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -900,3 +900,88 @@ dht_rebalance_in_progress_check (xlator_t *this, call_frame_t *frame)                              frame, frame);          return ret;  } + +int +dht_inode_ctx_layout_set (inode_t *inode, xlator_t *this, +                          dht_layout_t *layout_int) +{ +        dht_inode_ctx_t         *ctx            = NULL; +        int                      ret            = -1; + +        ret = dht_inode_ctx_get (inode, this, &ctx); +        if (!ret && ctx) { +                ctx->layout = layout_int; +        } else { +                ctx = GF_CALLOC (1, sizeof (*ctx), gf_dht_mt_inode_ctx_t); +                if (!ctx) +                        return ret; +                ctx->layout = layout_int; +        } + +        ret = dht_inode_ctx_set (inode, this, ctx); + +        return ret; +} + +int +dht_inode_ctx_time_update (inode_t *inode, xlator_t *this, struct iatt *stat, +                           int32_t post) +{ +        dht_inode_ctx_t         *ctx            = NULL; +        dht_stat_time_t         *time           = 0; +        int                      ret            = -1; + +        ret = dht_inode_ctx_get (inode, this, &ctx); + +        if (ret) { +                ctx = GF_CALLOC (1, sizeof (*ctx), gf_dht_mt_inode_ctx_t); +                if (!ctx) +                        return -1; +        } + +        time = &ctx->time; + +        DHT_UPDATE_TIME(time->mtime, time->mtime_nsec, +                        stat->ia_mtime, stat->ia_mtime_nsec, inode, post); +        DHT_UPDATE_TIME(time->ctime, time->ctime_nsec, +                        stat->ia_ctime, stat->ia_ctime_nsec, inode, post); +        DHT_UPDATE_TIME(time->atime, time->atime_nsec, +                        stat->ia_atime, stat->ia_atime_nsec, inode, post); + +        return 0; +} + +int +dht_inode_ctx_get (inode_t *inode, xlator_t *this, dht_inode_ctx_t **ctx) +{ +        int             ret     = -1; +        uint64_t        ctx_int = 0; + +        GF_VALIDATE_OR_GOTO ("dht", this, out); +        GF_VALIDATE_OR_GOTO (this->name, inode, out); + +        ret = inode_ctx_get (inode, this, &ctx_int); + +        if (ret) +                return ret; + +        if (ctx) +                *ctx = (dht_inode_ctx_t *) ctx_int; +out: +        return ret; +} + +int dht_inode_ctx_set (inode_t *inode, xlator_t *this, dht_inode_ctx_t *ctx) +{ +        int             ret = -1; +        uint64_t        ctx_int = 0; + +        GF_VALIDATE_OR_GOTO ("dht", this, out); +        GF_VALIDATE_OR_GOTO (this->name, inode, out); +        GF_VALIDATE_OR_GOTO (this->name, ctx, out); + +        ctx_int = (long)ctx; +        ret = inode_ctx_set (inode, this, &ctx_int); +out: +        return ret; +} diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c index 97bbe987fdc..19807607758 100644 --- a/xlators/cluster/dht/src/dht-layout.c +++ b/xlators/cluster/dht/src/dht-layout.c @@ -59,9 +59,7 @@ dht_layout_t *  dht_layout_get (xlator_t *this, inode_t *inode)  {          dht_conf_t   *conf = NULL; -        uint64_t      layout_int = 0;          dht_layout_t *layout = NULL; -        int           ret    = -1;          conf = this->private;          if (!conf) @@ -69,9 +67,8 @@ dht_layout_get (xlator_t *this, inode_t *inode)          LOCK (&conf->layout_lock);          { -                ret = inode_ctx_get (inode, this, &layout_int); -                if (ret == 0) { -                        layout = (dht_layout_t *) (unsigned long) layout_int; +                dht_inode_ctx_layout_get (inode, this, &layout); +                if (layout) {                          layout->ref++;                  }          } @@ -89,7 +86,6 @@ dht_layout_set (xlator_t *this, inode_t *inode, dht_layout_t *layout)          int           oldret = -1;          int           ret = 0;          dht_layout_t *old_layout; -        uint64_t      old_layout_int;          conf = this->private;          if (!conf) @@ -97,16 +93,13 @@ dht_layout_set (xlator_t *this, inode_t *inode, dht_layout_t *layout)          LOCK (&conf->layout_lock);          { -                oldret = inode_ctx_get (inode, this, &old_layout_int); - +                oldret = dht_inode_ctx_layout_get (inode, this, &old_layout);                  layout->ref++; -                ret = inode_ctx_put (inode, this, (uint64_t) (unsigned long) -                                     layout); +                dht_inode_ctx_layout_set (inode, this, layout);          }          UNLOCK (&conf->layout_lock); -        if (oldret == 0) { -                old_layout = (dht_layout_t *) (unsigned long) old_layout_int; +        if (!oldret) {                  dht_layout_unref (this, old_layout);          } @@ -731,7 +724,7 @@ dht_layout_preset (xlator_t *this, xlator_t *subvol, inode_t *inode)          LOCK (&conf->layout_lock);          { -                inode_ctx_put (inode, this, (uint64_t)(long)layout); +                dht_inode_ctx_layout_set (inode, this, layout);          }          UNLOCK (&conf->layout_lock); diff --git a/xlators/cluster/dht/src/dht-mem-types.h b/xlators/cluster/dht/src/dht-mem-types.h index 4f3a90e914a..e893eb48fd8 100644 --- a/xlators/cluster/dht/src/dht-mem-types.h +++ b/xlators/cluster/dht/src/dht-mem-types.h @@ -28,6 +28,8 @@ enum gf_dht_mem_types_ {          gf_dht_mt_subvol_time,          gf_dht_mt_loc_t,          gf_defrag_info_mt, +        gf_dht_mt_inode_ctx_t, +        gf_dht_mt_ctx_stat_time_t,          gf_dht_mt_end  };  #endif diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c index 6029490c466..6f16c6fcc18 100644 --- a/xlators/cluster/dht/src/dht.c +++ b/xlators/cluster/dht/src/dht.c @@ -148,21 +148,15 @@ dht_inodectx_dump (xlator_t *this, inode_t *inode)  {          int             ret = -1;          dht_layout_t    *layout = NULL; -        uint64_t        tmp_layout = 0;          GF_VALIDATE_OR_GOTO ("dht", this, out);          GF_VALIDATE_OR_GOTO ("dht", inode, out); -        ret = inode_ctx_get (inode, this, &tmp_layout); +        ret = dht_inode_ctx_layout_get (inode, this, &layout); -        if (ret != 0) +        if ((ret != 0) || !layout)                  return ret; -        layout = (dht_layout_t *)(long)tmp_layout; - -        if (!layout) -                return -1; -          gf_proc_dump_add_section("xlator.cluster.dht.%s.inode", this->name);          dht_layout_dump(layout, "layout");  | 
