X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fobjclass%2Fobjclass.h;fp=src%2Fceph%2Fsrc%2Fobjclass%2Fobjclass.h;h=cd41153dafcf5447d9e93700196be57a2cd5f877;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/objclass/objclass.h b/src/ceph/src/objclass/objclass.h new file mode 100644 index 0000000..cd41153 --- /dev/null +++ b/src/ceph/src/objclass/objclass.h @@ -0,0 +1,178 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_OBJCLASS_H +#define CEPH_OBJCLASS_H + +#ifdef __cplusplus + +#include "../include/types.h" +#include "msg/msg_types.h" +#include "common/hobject.h" +#include "common/ceph_time.h" +#include "include/rados/objclass.h" + +struct obj_list_watch_response_t; + +#if __GNUC__ >= 4 + #define CEPH_CLS_API __attribute__ ((visibility ("default"))) +#else + #define CEPH_CLS_API +#endif + +extern "C" { +#endif + +#define CLS_METHOD_PUBLIC 0x4 /// unused + +typedef void *cls_filter_handle_t; +typedef int (*cls_method_call_t)(cls_method_context_t ctx, + char *indata, int datalen, + char **outdata, int *outdatalen); +typedef struct { + const char *name; + const char *ver; +} cls_deps_t; + +/* class utils */ +extern void *cls_alloc(size_t size); +extern void cls_free(void *p); + +extern int cls_read(cls_method_context_t hctx, int ofs, int len, + char **outdata, int *outdatalen); +extern int cls_call(cls_method_context_t hctx, const char *cls, const char *method, + char *indata, int datalen, + char **outdata, int *outdatalen); +extern int cls_getxattr(cls_method_context_t hctx, const char *name, + char **outdata, int *outdatalen); +extern int cls_setxattr(cls_method_context_t hctx, const char *name, + const char *value, int val_len); +/** This will fill in the passed origin pointer with the origin of the + * request which activated your class call. */ +extern int cls_get_request_origin(cls_method_context_t hctx, + entity_inst_t *origin); + +/* class registration api */ +extern int cls_unregister(cls_handle_t); + +extern int cls_register_method(cls_handle_t hclass, const char *method, int flags, + cls_method_call_t class_call, cls_method_handle_t *handle); +extern int cls_unregister_method(cls_method_handle_t handle); +extern void cls_unregister_filter(cls_filter_handle_t handle); + + + +/* triggers */ +#define OBJ_READ 0x1 +#define OBJ_WRITE 0x2 + +typedef int cls_trigger_t; + +extern int cls_link(cls_method_handle_t handle, int priority, cls_trigger_t trigger); +extern int cls_unlink(cls_method_handle_t handle); + + +/* should be defined by the class implementation + defined here inorder to get it compiled without C++ mangling */ +extern void class_init(void); +extern void class_fini(void); + +#ifdef __cplusplus +} + +class PGLSFilter { + CephContext* cct; +protected: + string xattr; +public: + PGLSFilter(); + virtual ~PGLSFilter(); + virtual bool filter(const hobject_t &obj, bufferlist& xattr_data, + bufferlist& outdata) = 0; + + /** + * Arguments passed from the RADOS client. Implementations must + * handle any encoding errors, and return an appropriate error code, + * or 0 on valid input. + */ + virtual int init(bufferlist::iterator ¶ms) = 0; + + /** + * xattr key, or empty string. If non-empty, this xattr will be fetched + * and the value passed into ::filter + */ + virtual string& get_xattr() { return xattr; } + + /** + * If true, objects without the named xattr (if xattr name is not empty) + * will be rejected without calling ::filter + */ + virtual bool reject_empty_xattr() { return true; } +}; + +// Classes expose a filter constructor that returns a subclass of PGLSFilter +typedef PGLSFilter* (*cls_cxx_filter_factory_t)(); + + +extern int cls_register_cxx_filter(cls_handle_t hclass, + const std::string &filter_name, + cls_cxx_filter_factory_t fn, + cls_filter_handle_t *handle=NULL); + +extern int cls_cxx_stat2(cls_method_context_t hctx, uint64_t *size, ceph::real_time *mtime); +extern int cls_cxx_read2(cls_method_context_t hctx, int ofs, int len, + bufferlist *bl, uint32_t op_flags); +extern int cls_cxx_write2(cls_method_context_t hctx, int ofs, int len, + bufferlist *bl, uint32_t op_flags); +extern int cls_cxx_write_full(cls_method_context_t hctx, bufferlist *bl); +extern int cls_cxx_getxattrs(cls_method_context_t hctx, map *attrset); +extern int cls_cxx_replace(cls_method_context_t hctx, int ofs, int len, bufferlist *bl); +extern int cls_cxx_snap_revert(cls_method_context_t hctx, snapid_t snapid); +extern int cls_cxx_map_clear(cls_method_context_t hctx); +extern int cls_cxx_map_get_all_vals(cls_method_context_t hctx, + std::map *vals, + bool *more); +extern int cls_cxx_map_get_keys(cls_method_context_t hctx, + const string &start_after, + uint64_t max_to_get, + std::set *keys, + bool *more); +extern int cls_cxx_map_get_vals(cls_method_context_t hctx, + const string &start_after, + const string &filter_prefix, + uint64_t max_to_get, + std::map *vals, + bool *more); +extern int cls_cxx_map_read_header(cls_method_context_t hctx, bufferlist *outbl); +extern int cls_cxx_map_set_vals(cls_method_context_t hctx, + const std::map *map); +extern int cls_cxx_map_write_header(cls_method_context_t hctx, bufferlist *inbl); +extern int cls_cxx_map_remove_key(cls_method_context_t hctx, const string &key); +extern int cls_cxx_map_update(cls_method_context_t hctx, bufferlist *inbl); + +extern int cls_cxx_list_watchers(cls_method_context_t hctx, + obj_list_watch_response_t *watchers); + +/* utility functions */ +extern int cls_gen_random_bytes(char *buf, int size); +extern int cls_gen_rand_base64(char *dest, int size); /* size should be the required string size + 1 */ + +/* environment */ +extern uint64_t cls_current_version(cls_method_context_t hctx); +extern int cls_current_subop_num(cls_method_context_t hctx); +extern uint64_t cls_get_features(cls_method_context_t hctx); +extern uint64_t cls_get_client_features(cls_method_context_t hctx); + +/* helpers */ +extern void cls_cxx_subop_version(cls_method_context_t hctx, string *s); + +/* These are also defined in rados.h and librados.h. Keep them in sync! */ +#define CEPH_OSD_TMAP_HDR 'h' +#define CEPH_OSD_TMAP_SET 's' +#define CEPH_OSD_TMAP_CREATE 'c' +#define CEPH_OSD_TMAP_RM 'r' + + +#endif + +#endif