当前位置:   article > 正文

librbd_go语言librbd

go语言librbd
  1. librbd是ceph 对外提供的块存储接口,这个接口了c/c++ 两种接口,接口提供的头文件分别在ceph-master\ceph-master\src\include\rbd\librbd.hpp和source\ceph-master\ceph-master\src\include\rbd\librbd.h中
  2. 这里我们以提供的c++为例,
  3. namespace librbd {
  4. using librados::IoCtx;
  5. class CEPH_RBD_API RBD
  6. {
  7. #创建,删除,clone镜像等操作
  8. int create(IoCtx& io_ctx, const char *name, uint64_t size, int *order);
  9. int clone(IoCtx& p_ioctx, const char *p_name, const char *p_snapname,
  10. IoCtx& c_ioctx, const char *c_name, uint64_t features,
  11. int *c_order);
  12. // RBD pool mirroring support functions
  13. int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode);
  14. };
  15. class CEPH_RBD_API Image
  16. {
  17. #主要是镜像的读写操作
  18. int snap_list(std::vector<snap_info_t>& snaps);
  19. /* DEPRECATED; use snap_exists2 */
  20. bool snap_exists(const char *snapname) __attribute__ ((deprecated));
  21. int snap_exists2(const char *snapname, bool *exists);
  22. int snap_create(const char *snapname);
  23. int snap_remove(const char *snapname);
  24. int snap_remove2(const char *snapname, uint32_t flags, ProgressContext& pctx);
  25. }
  26. 从这里和容易看出librbd对外提供了一个namspace。这样我们使用using librbd就可以使用linrbd提供的函数
  27. 其次在这个namespace 中使用了librados中的ioctx,从这里可以看出librbd是在librados之上的
  28. 在libedb中只要提供了两个class,分别是rbd 和 image.
  29. 这两个类的实现都在ceph-master\ceph-master\src\librbd\librbd.cc 中
  30. 我们来看看rbd中的open函数
  31. int RBD::open(IoCtx& io_ctx, Image& image, const char *name,
  32. const char *snap_name)
  33. {
  34. #新建一个ImageCtx
  35. ImageCtx *ictx = new ImageCtx(name, "", snap_name, io_ctx, false);
  36. TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
  37. tracepoint(librbd, open_image_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only);
  38. #如果形参image.ctx不为null,说明上一次可能没有调用close函数,这里首先会调用close函数将其关闭
  39. if (image.ctx != NULL) {
  40. reinterpret_cast<ImageCtx*>(image.ctx)->state->close();
  41. image.ctx = NULL;
  42. }
  43. #走到这里的话image.ctx 已经为null了,这里通过新建的Imagectx来重新open
  44. int r = ictx->state->open(false);
  45. if (r < 0) {
  46. tracepoint(librbd, open_image_exit, r);
  47. return r;
  48. }
  49. #将新建且已经打开的ictx 赋值给image.ctx
  50. image.ctx = (image_ctx_t) ictx;
  51. tracepoint(librbd, open_image_exit, 0);
  52. return 0;
  53. }
  54. 从这里可以知道rbd class的open函数主要是给image类的ctx赋值,这个值是一个ImageCtx类型

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/592828
推荐阅读
相关标签
  

闽ICP备14008679号