summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
authorPoornima G <pgurusid@redhat.com>2017-11-18 15:19:13 +0530
committerAmar Tumballi <amarts@redhat.com>2017-12-05 14:21:01 +0000
commitdc1258bfe46d30059119a3294285a114ec2bcd36 (patch)
tree4ff3cb254b5246e27b1eda32312e4ddeec897900 /libglusterfs
parent8a0b115b20cfa2dd3c5a9e22a8244c9c2f03e17b (diff)
libglusterfs: Add put fop
Problem: It had been a longtime request to implement put fop in gluster. put fop in gluster may not have the exact sementics of HTTP PUT, but can be easily extended to do so. The subsequent patches, will contain more semantics on the put fop and its guarentees. Why compound fop framework is not used for put? Compound fop framework currently doesn't allow compounding of entry fop and inode fops, i.e. fops on multiple inodes cannot be combined in compound fop. Updates #353 Change-Id: Idb7891b3e056d46d570bb7e31bad1b6a28656ada Signed-off-by: Poornima G <pgurusid@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/call-stub.c57
-rw-r--r--libglusterfs/src/call-stub.h15
-rw-r--r--libglusterfs/src/cluster-syncop.c26
-rw-r--r--libglusterfs/src/cluster-syncop.h8
-rw-r--r--libglusterfs/src/default-args.c40
-rw-r--r--libglusterfs/src/default-args.h9
-rw-r--r--libglusterfs/src/defaults-tmpl.c1
-rw-r--r--libglusterfs/src/defaults.h25
-rwxr-xr-xlibglusterfs/src/generator.py18
-rw-r--r--libglusterfs/src/globals.c2
-rw-r--r--libglusterfs/src/syncop.c49
-rw-r--r--libglusterfs/src/syncop.h6
-rw-r--r--libglusterfs/src/xlator.c1
-rw-r--r--libglusterfs/src/xlator.h14
14 files changed, 271 insertions, 0 deletions
diff --git a/libglusterfs/src/call-stub.c b/libglusterfs/src/call-stub.c
index 9aa67aab6c2..74a64294528 100644
--- a/libglusterfs/src/call-stub.c
+++ b/libglusterfs/src/call-stub.c
@@ -1968,6 +1968,47 @@ out:
}
+call_stub_t *
+fop_put_stub (call_frame_t *frame, fop_put_t fn,
+ loc_t *loc, mode_t mode, mode_t umask, uint32_t flags,
+ struct iovec *vector, int32_t count, off_t offset,
+ struct iobref *iobref, dict_t *xattr, dict_t *xdata)
+{
+ call_stub_t *stub = NULL;
+
+ GF_VALIDATE_OR_GOTO ("call-stub", frame, out);
+ GF_VALIDATE_OR_GOTO ("call-stub", vector, out);
+
+ stub = stub_new (frame, 1, GF_FOP_PUT);
+ GF_VALIDATE_OR_GOTO ("call-stub", stub, out);
+
+ stub->fn.put = fn;
+ args_put_store (&stub->args, loc, mode, umask, flags, vector,
+ count, offset, iobref, xattr, xdata);
+out:
+ return stub;
+}
+
+call_stub_t *
+fop_put_cbk_stub (call_frame_t *frame, fop_put_cbk_t fn,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata)
+{
+ call_stub_t *stub = NULL;
+
+ GF_VALIDATE_OR_GOTO ("call-stub", frame, out);
+
+ stub = stub_new (frame, 0, GF_FOP_PUT);
+ GF_VALIDATE_OR_GOTO ("call-stub", stub, out);
+
+ stub->fn_cbk.put = fn;
+ args_put_cbk_store (&stub->args_cbk, op_ret, op_errno, inode,
+ buf, preparent, postparent, xdata);
+out:
+ return stub;
+}
+
void
call_resume_wind (call_stub_t *stub)
{
@@ -2226,6 +2267,14 @@ call_resume_wind (call_stub_t *stub)
stub->args.xdata);
break;
+ case GF_FOP_PUT:
+ stub->fn.put (stub->frame, stub->frame->this,
+ &stub->args.loc, stub->args.mode, stub->args.umask,
+ stub->args.flags, stub->args.vector,
+ stub->args.count, stub->args.offset,
+ stub->args.iobref, stub->args.xattr,
+ stub->args.xdata);
+
default:
gf_msg_callingfn ("call-stub", GF_LOG_ERROR, EINVAL,
LG_MSG_INVALID_ENTRY, "Invalid value of FOP"
@@ -2453,6 +2502,14 @@ call_resume_unwind (call_stub_t *stub)
STUB_UNWIND (stub, setactivelk, stub->args_cbk.xdata);
break;
+ case GF_FOP_PUT:
+ STUB_UNWIND (stub, put, stub->args_cbk.inode,
+ &stub->args_cbk.stat,
+ &stub->args_cbk.preparent,
+ &stub->args_cbk.postparent,
+ stub->args_cbk.xdata);
+ break;
+
default:
gf_msg_callingfn ("call-stub", GF_LOG_ERROR, EINVAL,
LG_MSG_INVALID_ENTRY, "Invalid value of FOP"
diff --git a/libglusterfs/src/call-stub.h b/libglusterfs/src/call-stub.h
index 59868d414e3..4d86a517537 100644
--- a/libglusterfs/src/call-stub.h
+++ b/libglusterfs/src/call-stub.h
@@ -14,6 +14,7 @@
#include "xlator.h"
#include "defaults.h"
#include "default-args.h"
+#include "stack.h"
#include "list.h"
typedef struct _call_stub {
@@ -76,6 +77,7 @@ typedef struct _call_stub {
fop_lease_t lease;
fop_getactivelk_t getactivelk;
fop_setactivelk_t setactivelk;
+ fop_put_t put;
} fn;
union {
@@ -128,6 +130,7 @@ typedef struct _call_stub {
fop_lease_cbk_t lease;
fop_getactivelk_cbk_t getactivelk;
fop_setactivelk_cbk_t setactivelk;
+ fop_put_cbk_t put;
} fn_cbk;
default_args_t args;
@@ -761,6 +764,18 @@ call_stub_t *
fop_setactivelk_cbk_stub (call_frame_t *frame, fop_setactivelk_cbk_t fn,
int32_t op_ret, int32_t op_errno, dict_t *xdata);
+call_stub_t *
+fop_put_stub (call_frame_t *frame, fop_put_t fn, loc_t *loc,
+ mode_t mode, mode_t umask, uint32_t flags,
+ struct iovec *vector, int32_t count, off_t offset,
+ struct iobref *iobref, dict_t *xattr, dict_t *xdata);
+
+call_stub_t *
+fop_put_cbk_stub (call_frame_t *frame, fop_put_cbk_t fn, int32_t op_ret,
+ int32_t op_errno, inode_t *inode, struct iatt *buf,
+ struct iatt *preparent, struct iatt *postparent,
+ dict_t *xdata);
+
void call_resume (call_stub_t *stub);
void call_resume_keep_stub (call_stub_t *stub);
void call_stub_destroy (call_stub_t *stub);
diff --git a/libglusterfs/src/cluster-syncop.c b/libglusterfs/src/cluster-syncop.c
index 50542eb7c16..aa9cea75ba3 100644
--- a/libglusterfs/src/cluster-syncop.c
+++ b/libglusterfs/src/cluster-syncop.c
@@ -304,6 +304,18 @@ cluster_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t
+cluster_put_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata)
+{
+ FOP_CBK (put, frame, cookie, op_ret, op_errno, inode, buf, preparent,
+ postparent, xdata);
+ return 0;
+}
+
+
+int32_t
cluster_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
dict_t *xdata)
@@ -686,6 +698,20 @@ cluster_writev (xlator_t **subvols, unsigned char *on, int numsubvols,
}
int32_t
+cluster_put (xlator_t **subvols, unsigned char *on, int numsubvols,
+ default_args_cbk_t *replies, unsigned char *output,
+ call_frame_t *frame, xlator_t *this, loc_t *loc,
+ mode_t mode, mode_t umask, uint32_t flags, struct iovec *vector,
+ int32_t count, off_t offset, struct iobref *iobref, dict_t *xattr,
+ dict_t *xdata)
+{
+ FOP_ONLIST (subvols, on, numsubvols, replies, output, frame, put, loc,
+ mode, umask, flags, vector, count, offset, iobref, xattr,
+ xdata);
+ return cluster_fop_success_fill (replies, numsubvols, output);
+}
+
+int32_t
cluster_readv (xlator_t **subvols, unsigned char *on, int numsubvols,
default_args_cbk_t *replies, unsigned char *output,
call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
diff --git a/libglusterfs/src/cluster-syncop.h b/libglusterfs/src/cluster-syncop.h
index b91a09ea681..9127dde6dfb 100644
--- a/libglusterfs/src/cluster-syncop.h
+++ b/libglusterfs/src/cluster-syncop.h
@@ -198,6 +198,14 @@ cluster_fsetattr (xlator_t **subvols, unsigned char *on, int numsubvols,
call_frame_t *frame, xlator_t *this, fd_t *fd,
struct iatt *stbuf, int32_t valid, dict_t *xdata);
+int32_t
+cluster_put (xlator_t **subvols, unsigned char *on, int numsubvols,
+ default_args_cbk_t *replies, unsigned char *output,
+ call_frame_t *frame, xlator_t *this, loc_t *loc,
+ mode_t mode, mode_t umask, uint32_t flags, struct iovec *vector,
+ int32_t count, off_t offset, struct iobref *iobref, dict_t *xattr,
+ dict_t *xdata);
+
void
cluster_replies_wipe (default_args_cbk_t *replies, int num_subvols);
diff --git a/libglusterfs/src/default-args.c b/libglusterfs/src/default-args.c
index f40de2dae68..9ac0f400493 100644
--- a/libglusterfs/src/default-args.c
+++ b/libglusterfs/src/default-args.c
@@ -594,6 +594,46 @@ args_writev_cbk_store (default_args_cbk_t *args,
}
int
+args_put_store (default_args_t *args, loc_t *loc, mode_t mode, mode_t umask,
+ uint32_t flags, struct iovec *vector, int32_t count, off_t off,
+ struct iobref *iobref, dict_t *xattr, dict_t *xdata)
+{
+ loc_copy (&args->loc, loc);
+ args->mode = mode;
+ args->umask = umask;
+ args->flags = flags;
+ args->vector = iov_dup (vector, count);
+ args->count = count;
+ args->offset = off;
+ args->iobref = iobref_ref (iobref);
+ if (xattr)
+ args->xattr = dict_ref (xattr);
+ if (xdata)
+ args->xdata = dict_ref (xdata);
+ return 0;
+}
+
+int
+args_put_cbk_store (default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,
+ inode_t *inode, struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata)
+{
+ args->op_ret = op_ret;
+ args->op_errno = op_errno;
+ if (op_ret >= 0)
+ args->stat = *buf;
+ if (inode)
+ args->inode = inode_ref (inode);
+ if (preparent)
+ args->preparent = *preparent;
+ if (postparent)
+ args->postparent = *postparent;
+ if (xdata)
+ args->xdata = dict_ref (xdata);
+
+ return 0;
+}
+int
args_flush_store (default_args_t *args, fd_t *fd, dict_t *xdata)
{
if (fd)
diff --git a/libglusterfs/src/default-args.h b/libglusterfs/src/default-args.h
index a2201dd4703..f97d8830de9 100644
--- a/libglusterfs/src/default-args.h
+++ b/libglusterfs/src/default-args.h
@@ -125,6 +125,10 @@ args_writev_cbk_store (default_args_cbk_t *args,
int32_t op_ret, int32_t op_errno,
struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata);
+int
+args_put_cbk_store (default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,
+ inode_t *inode, struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata);
int
args_flush_cbk_store (default_args_cbk_t *args,
@@ -349,6 +353,11 @@ args_writev_store (default_args_t *args, fd_t *fd, struct iovec *vector,
struct iobref *iobref, dict_t *xdata);
int
+args_put_store (default_args_t *args, loc_t *loc, mode_t mode, mode_t umask,
+ uint32_t flags, struct iovec *vector, int32_t count, off_t off,
+ struct iobref *iobref, dict_t *xattr, dict_t *xdata);
+
+int
args_flush_store (default_args_t *args, fd_t *fd, dict_t *xdata);
int
diff --git a/libglusterfs/src/defaults-tmpl.c b/libglusterfs/src/defaults-tmpl.c
index d311972f0c0..21b99d9566c 100644
--- a/libglusterfs/src/defaults-tmpl.c
+++ b/libglusterfs/src/defaults-tmpl.c
@@ -81,6 +81,7 @@ struct xlator_fops _default_fops = {
.getspec = default_getspec,
.getactivelk = default_getactivelk,
.setactivelk = default_setactivelk,
+ .put = default_put,
};
struct xlator_fops *default_fops = &_default_fops;
diff --git a/libglusterfs/src/defaults.h b/libglusterfs/src/defaults.h
index 9b4f4828e91..c202dbe4941 100644
--- a/libglusterfs/src/defaults.h
+++ b/libglusterfs/src/defaults.h
@@ -354,6 +354,11 @@ int32_t
default_setactivelk (call_frame_t *frame, xlator_t *this, loc_t *loc,
lock_migration_info_t *locklist, dict_t *xdata);
+int32_t
+default_put (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,
+ mode_t umask, uint32_t flags, struct iovec *vector, int32_t count,
+ off_t off, struct iobref *iobref, dict_t *xattr, dict_t *xdata);
+
/* Resume */
int32_t default_getspec_resume (call_frame_t *frame,
xlator_t *this,
@@ -599,6 +604,12 @@ int32_t
default_setactivelk_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,
lock_migration_info_t *locklist, dict_t *xdata);
+int32_t
+default_put_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ mode_t mode, mode_t umask, uint32_t flags,
+ struct iovec *vector, int32_t count, off_t off,
+ struct iobref *iobref, dict_t *xattr, dict_t *xdata);
+
/* _cbk_resume */
int32_t
@@ -895,6 +906,12 @@ default_setactivelk_cbk_resume (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret,
int32_t op_errno, dict_t *xdata);
+int32_t
+default_put_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata);
+
/* _CBK */
int32_t
default_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
@@ -1142,6 +1159,11 @@ int32_t
default_setactivelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, dict_t *xdata);
+int32_t
+default_put_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata);
int32_t
default_lookup_failure_cbk (call_frame_t *frame, int32_t op_errno);
@@ -1296,6 +1318,9 @@ int32_t
default_setactivelk_failure_cbk (call_frame_t *frame, int32_t op_errno);
int32_t
+default_put_failure_cbk (call_frame_t *frame, int32_t op_errno);
+
+int32_t
default_mem_acct_init (xlator_t *this);
void
diff --git a/libglusterfs/src/generator.py b/libglusterfs/src/generator.py
index 7bd4c21cb3a..d9262e473b7 100755
--- a/libglusterfs/src/generator.py
+++ b/libglusterfs/src/generator.py
@@ -557,6 +557,24 @@ ops['setactivelk'] = (
('cbk-arg', 'xdata', 'dict_t *'),
)
+ops['put'] = (
+ ('fop-arg', 'loc', 'loc_t *', 'loc'),
+ ('fop-arg', 'mode', 'mode_t', 'mode'),
+ ('fop-arg', 'umask', 'mode_t', 'umask'),
+ ('fop-arg', 'flags', 'uint32_t', 'flags'),
+ ('fop-arg', 'vector', 'struct iovec *', 'vector'),
+ ('fop-arg', 'count', 'int32_t'),
+ ('fop-arg', 'off', 'off_t', 'offset'),
+ ('fop-arg', 'iobref', 'struct iobref *'),
+ ('fop-arg', 'dict', 'dict_t *', 'xattr'),
+ ('fop-arg', 'xdata', 'dict_t *', 'xdata'),
+ ('cbk-arg', 'inode', 'inode_t *'),
+ ('cbk-arg', 'buf', 'struct iatt *'),
+ ('cbk-arg', 'preparent', 'struct iatt *'),
+ ('cbk-arg', 'postparent', 'struct iatt *'),
+ ('cbk-arg', 'xdata', 'dict_t *'),
+)
+
#####################################################################
xlator_cbks['forget'] = (
('fn-arg', 'this', 'xlator_t *'),
diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c
index 1c733840f46..1c574463123 100644
--- a/libglusterfs/src/globals.c
+++ b/libglusterfs/src/globals.c
@@ -11,6 +11,7 @@
#include <pthread.h>
#include "glusterfs.h"
+#include "globals.h"
#include "xlator.h"
#include "mem-pool.h"
#include "syncop.h"
@@ -73,6 +74,7 @@ const char *gf_fop_list[GF_FOP_MAXVALUE] = {
[GF_FOP_COMPOUND] = "COMPOUND",
[GF_FOP_GETACTIVELK] = "GETACTIVELK",
[GF_FOP_SETACTIVELK] = "SETACTIVELK",
+ [GF_FOP_PUT] = "PUT",
};
const char *gf_upcall_list[GF_UPCALL_FLAGS_MAXVALUE] = {
diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c
index b36c88dc829..a4882f5eef2 100644
--- a/libglusterfs/src/syncop.c
+++ b/libglusterfs/src/syncop.c
@@ -2080,6 +2080,55 @@ syncop_create (xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode,
}
+int32_t
+syncop_put_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata)
+{
+ struct syncargs *args = NULL;
+
+ args = cookie;
+
+ args->op_ret = op_ret;
+ args->op_errno = op_errno;
+ if (xdata)
+ args->xdata = dict_ref (xdata);
+
+ if (buf)
+ args->iatt1 = *buf;
+
+ __wake (args);
+
+ return 0;
+}
+
+int
+syncop_put (xlator_t *subvol, loc_t *loc, mode_t mode, mode_t umask,
+ uint32_t flags, struct iovec *vector, int32_t count,
+ off_t offset, struct iobref *iobref, dict_t *xattr,
+ struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out)
+{
+ struct syncargs args = {0, };
+
+ SYNCOP (subvol, (&args), syncop_put_cbk, subvol->fops->put,
+ loc, mode, umask, flags, (struct iovec *) vector, count,
+ offset, iobref, xattr, xdata_in);
+
+ if (iatt)
+ *iatt = args.iatt1;
+
+ if (xdata_out)
+ *xdata_out = args.xdata;
+ else if (args.xdata)
+ dict_unref (args.xdata);
+
+ if (args.op_ret < 0)
+ return -args.op_errno;
+ return args.op_ret;
+
+}
+
int
syncop_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno, struct iatt *preparent,
diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h
index c64b483e85c..8f84cb7c4a4 100644
--- a/libglusterfs/src/syncop.h
+++ b/libglusterfs/src/syncop.h
@@ -563,4 +563,10 @@ syncop_setactivelk (xlator_t *subvol, loc_t *loc,
lock_migration_info_t *locklist, dict_t *xdata_in,
dict_t **xdata_out);
+int
+syncop_put (xlator_t *subvol, loc_t *loc, mode_t mode, mode_t umask,
+ uint32_t flags, struct iovec *vector, int32_t count,
+ off_t offset, struct iobref *iobref, dict_t *xattr,
+ struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out);
+
#endif /* _SYNCOP_H */
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index ed1d95d01e1..677dd6ce80f 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -103,6 +103,7 @@ fill_defaults (xlator_t *xl)
SET_DEFAULT_FOP (lease);
SET_DEFAULT_FOP (getactivelk);
SET_DEFAULT_FOP (setactivelk);
+ SET_DEFAULT_FOP (put);
SET_DEFAULT_FOP (getspec);
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index de353fe702d..a3115f09c52 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -465,6 +465,12 @@ typedef int32_t (*fop_setactivelk_cbk_t) (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret,
int32_t op_errno, dict_t *xdata);
+typedef int32_t (*fop_put_cbk_t) (call_frame_t *frame, void *cookie,
+ xlator_t *this, int32_t op_ret,
+ int32_t op_errno, inode_t *inode,
+ struct iatt *buf, struct iatt *preparent,
+ struct iatt *postparent, dict_t *xdata);
+
typedef int32_t (*fop_lookup_t) (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
@@ -725,6 +731,12 @@ typedef int32_t (*fop_setactivelk_t) (call_frame_t *frame, xlator_t *this,
lock_migration_info_t *locklist,
dict_t *xdata);
+typedef int32_t (*fop_put_t) (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ mode_t mode, mode_t umask, uint32_t flags,
+ struct iovec *vector, int32_t count, off_t offset,
+ struct iobref *iobref, dict_t *xattr,
+ dict_t *xdata);
+
/* WARNING: make sure the list is in order with FOP definition in
`rpc/xdr/src/glusterfs-fops.x`.
If it is not in order, mainly the metrics related feature would be broken */
@@ -786,6 +798,7 @@ struct xlator_fops {
fop_compound_t compound;
fop_getactivelk_t getactivelk;
fop_setactivelk_t setactivelk;
+ fop_put_t put;
/* these entries are used for a typechecking hack in STACK_WIND _only_ */
/* make sure to add _cbk variables only after defining regular fops as
@@ -847,6 +860,7 @@ struct xlator_fops {
fop_compound_cbk_t compound_cbk;
fop_getactivelk_cbk_t getactivelk_cbk;
fop_setactivelk_cbk_t setactivelk_cbk;
+ fop_put_cbk_t put_cbk;
};
typedef int32_t (*cbk_forget_t) (xlator_t *this,