barrier: Correct gfid in statedump of barriered fops

In brick statedump file the barriered fop's gfid was showing 0 when
statedump was taken. This is because of statedump code was not
referring to correct gfid.

With this change statedump code will use correct gfid and gfid will
not be 0 in statedump file when barrier is enable and user takes
statedump of volume.

Change-Id: Ia296cba7e132402df53c602daa160c1c2cd21245
BUG: 1099369
Reviewed-on: http://review.gluster.org/7893
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
This commit is contained in:
ggarg 2014-05-27 17:08:53 +05:30 committed by Kaushal M
parent 97ccd45fb6
commit 1fe785152c
2 changed files with 145 additions and 14 deletions

View File

@ -19,6 +19,134 @@
#include "statedump.h"
void
barrier_local_set_gfid (call_frame_t *frame, uuid_t gfid, xlator_t *this)
{
if (gfid) {
uuid_t *id = GF_MALLOC (sizeof (uuid_t), gf_common_mt_uuid_t);
if (!id) {
gf_log (this->name, GF_LOG_WARNING, "Could not set gfid"
". gfid will not be dumped in statedump file.");
return;
}
uuid_copy (*id, gfid);
frame->local = id;
}
}
void
barrier_local_free_gfid (call_frame_t *frame)
{
if (frame->local) {
GF_FREE (frame->local);
frame->local = NULL;
}
}
int32_t
barrier_truncate_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
struct iatt *prebuf, struct iatt *postbuf,
dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno, prebuf, postbuf,
xdata);
return 0;
}
int32_t
barrier_ftruncate_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
struct iatt *prebuf, struct iatt *postbuf,
dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno, prebuf,
postbuf, xdata);
return 0;
}
int32_t
barrier_unlink_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
struct iatt *preparent, struct iatt *postparent,
dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (unlink, frame, op_ret, op_errno, preparent,
postparent, xdata);
return 0;
}
int32_t
barrier_rmdir_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
struct iatt *preparent, struct iatt *postparent,
dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (rmdir, frame, op_ret, op_errno, preparent,
postparent, xdata);
return 0;
}
int32_t
barrier_rename_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *buf,
struct iatt *preoldparent, struct iatt *postoldparent,
struct iatt *prenewparent, struct iatt *postnewparent,
dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (rename, frame, op_ret, op_errno, buf, preoldparent,
postoldparent, prenewparent, postnewparent, xdata);
return 0;
}
int32_t
barrier_writev_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
struct iatt *prebuf, struct iatt *postbuf,
dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf,
xdata);
return 0;
}
int32_t
barrier_fsync_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
struct iatt *postbuf, dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, prebuf, postbuf,
xdata);
return 0;
}
int32_t
barrier_removexattr_cbk_resume (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret,
int32_t op_errno, dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (removexattr, frame, op_ret, op_errno, xdata);
return 0;
}
int32_t
barrier_fremovexattr_cbk_resume (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret,
int32_t op_errno, dict_t *xdata)
{
barrier_local_free_gfid (frame);
STACK_UNWIND_STRICT (fremovexattr, frame, op_ret, op_errno, xdata);
return 0;
}
int32_t
barrier_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
@ -133,6 +261,7 @@ barrier_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
return 0;
}
barrier_local_set_gfid (frame, fd->inode->gfid, this);
STACK_WIND (frame, barrier_writev_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->writev, fd, vector, count,
off, flags, iobref, xdata);
@ -143,6 +272,7 @@ int32_t
barrier_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
const char *name, dict_t *xdata)
{
barrier_local_set_gfid (frame, fd->inode->gfid, this);
STACK_WIND (frame, barrier_fremovexattr_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->fremovexattr,
fd, name, xdata);
@ -153,6 +283,7 @@ int32_t
barrier_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
const char *name, dict_t *xdata)
{
barrier_local_set_gfid (frame, loc->inode->gfid, this);
STACK_WIND (frame, barrier_removexattr_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->removexattr,
loc, name, xdata);
@ -163,16 +294,19 @@ int32_t
barrier_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,
off_t offset, dict_t *xdata)
{
barrier_local_set_gfid (frame, loc->inode->gfid, this);
STACK_WIND (frame, barrier_truncate_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->truncate,
loc, offset, xdata);
return 0;
}
int32_t
barrier_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc,
loc_t *newloc, dict_t *xdata)
{
barrier_local_set_gfid (frame, oldloc->inode->gfid, this);
STACK_WIND (frame, barrier_rename_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->rename,
oldloc, newloc, xdata);
@ -183,6 +317,7 @@ int
barrier_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,
dict_t *xdata)
{
barrier_local_set_gfid (frame, loc->inode->gfid, this);
STACK_WIND (frame, barrier_rmdir_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->rmdir,
loc, flags, xdata);
@ -193,6 +328,7 @@ int32_t
barrier_unlink (call_frame_t *frame, xlator_t *this,
loc_t *loc, int xflag, dict_t *xdata)
{
barrier_local_set_gfid (frame, loc->inode->gfid, this);
STACK_WIND (frame, barrier_unlink_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->unlink,
loc, xflag, xdata);
@ -203,6 +339,7 @@ int32_t
barrier_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd,
off_t offset, dict_t *xdata)
{
barrier_local_set_gfid (frame, fd->inode->gfid, this);
STACK_WIND (frame, barrier_ftruncate_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->ftruncate,
fd, offset, xdata);
@ -213,6 +350,7 @@ int32_t
barrier_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd,
int32_t flags, dict_t *xdata)
{
barrier_local_set_gfid (frame, fd->inode->gfid, this);
STACK_WIND (frame, barrier_fsync_cbk, FIRST_CHILD (this),
FIRST_CHILD (this)->fops->fsync,
fd, flags, xdata);
@ -552,9 +690,11 @@ barrier_dump_stub (call_stub_t *stub, char *prefix)
gf_proc_dump_build_key (key, prefix, "fop");
gf_proc_dump_write (key, "%s", gf_fop_list[stub->fop]);
gf_proc_dump_build_key (key, prefix, "gfid");
gf_proc_dump_write (key, "%s", uuid_utoa (stub->args.loc.gfid));
if (stub->frame->local) {
gf_proc_dump_build_key (key, prefix, "gfid");
gf_proc_dump_write (key, "%s",
uuid_utoa (*(uuid_t*)(stub->frame->local)));
}
if (stub->args.loc.path) {
gf_proc_dump_build_key (key, prefix, "path");
gf_proc_dump_write (key, "%s", stub->args.loc.path);

View File

@ -16,15 +16,6 @@
#include "timer.h"
#include "call-stub.h"
#define BARRIER_SAFE_ASSIGN(lock, to, value) \
do { \
LOCK (&(lock)); \
{ \
to = value; \
} \
UNLOCK (&(lock)); \
} while (0)
#define BARRIER_FOP_CBK(fop_name, label, frame, this, params ...) \
do { \
barrier_priv_t *_priv = NULL; \
@ -44,7 +35,7 @@
\
_stub = fop_##fop_name##_cbk_stub \
(frame, \
default_##fop_name##_cbk_resume,\
barrier_##fop_name##_cbk_resume,\
params); \
if (!_stub) { \
__barrier_disable (this, &queue);\
@ -67,7 +58,7 @@ unlock: \
#fop_name, strerror (ENOMEM)); \
barrier_dequeue_all (this, &queue); \
} \
\
barrier_local_free_gfid (frame); \
STACK_UNWIND_STRICT (fop_name, frame, params); \
goto label; \
} while (0)