创建image时服务端产生的对象
来源:互联网 发布:java中调用void方法 编辑:程序博客网 时间:2024/06/06 18:24
创建一个volume:
如何命名服务端的volume的名字(以format==2为例):
rbd.cc
模块 主要函数 主要数据结构
RBD do_create(librbd::RBD &rbd, librados::IoCtx& io_ctx, imgname (char *) 由用户指定 const char *imgname, uint64_t size, int *order, int format, uint64_t features, uint64_t stripe_unit, uint64_t stripe_count) { 。。。 }librbd/internal.h create(IoCtx& io_ctx, const char *imgname, uint64_t size, bool old_format, uint64_t features, int *order, uint64_t stripe_unit, uint64_t stripe_count) { ... Rados rados(io_ctx); uint64_t bid = rados.get_instance_id(); ... return create_v2(io_ctx, imgname, bid, size, *order, features, stripe_unit, stripe_count); ... } create_v2(IoCtx& io_ctx, const char *imgname, uint64_t bid, uint64_t size, bid (uint64_t) int order, uint64_t features, uint64_t stripe_unit, imgname(char *) uint64_t stripe_count) { ... id_obj = id_obj_name(imgname) //RBD_ID_PREFIX + name #define RBD_ID_PREFIX "rbd_id." r = io_ctx.create(id_obj, true); // 创建objetct name实例 ... extra = rand() % 0xFFFFFFFF; //生产一个随机数 bid_ss << std::hex << bid << std::hex << extra; //将bid和产生的随机数转换成16进制并拼接 id = bid_ss.str(); //转换成字符串 r = cls_client::set_id(&io_ctx, id_obj, id); //为之前创建的object name对象设置id。 ... cls_client::dir_add_image(&io_ctx, RBD_DIRECTORY, imgname, id);//将该image的name和id注册到RBD_DIRECTORY对象中 //#define RBD_DIRECTORY "rbd_directory" ... oss << RBD_DATA_PREFIX << id; //#define RBD_DATA_PREFIX "rbd_data." header_oid = header_name(id); //RBD_HEADER_PREFIX + id #define RBD_HEADER_PREFIX "rbd_header." cls_client::create_image(&io_ctx, header_oid, size, order,features, oss.str()) //创建object header对象 ... }cls/rbd/cls_rbd_client.cc create_image(librados::IoCtx *ioctx, const std::string &oid, object_prefix(string) //RBD_DATA_PREFIX + image_id uint64_t size, uint8_t order, uint64_t features, oid(string) //object header const std::string &object_prefix) { bufferlist bl, bl2; ::encode(size, bl); ::encode(order, bl); ::encode(features, bl); ::encode(object_prefix, (bl)); //image 的prefix为 RBD_DATA_PREFIX + image_id return ioctx->exec(oid, "rbd", "create", bl, bl2); }librados/librados.cc librados::IoCtx::exec(const std::string& oid, const char *cls, const char *method, oid(string) //object header bufferlist& inbl, bufferlist& outbl) { object_t obj(oid); return io_ctx_impl->exec(obj, cls, method, inbl, outbl); }
//bid是怎么来的,
uint64_t librados::Rados::get_instance_id(){ return client->get_instance_id();}uint64_t librados::RadosClient::get_instance_id() { return instance_id;}int librados::RadosClient::connect(){ ... instance_id = monclient.get_global_id(); ...} uint64_t get_global_id() const { ¦ return global_id;}uint64_t AuthMonitor::assign_global_id(MAuth *m, bool should_increase_max) { int total_mon = mon->monmap->size(); dout(10) << "AuthMonitor::assign_global_id m=" << *m << " mon=" << mon->rank << "/" << total_mon ¦ ¦<< " last_allocated=" << last_allocated_id << " max_global_id=" << max_global_id << dendl; uint64_t next_global_id = last_allocated_id + 1; int remainder = next_global_id % total_mon; if (remainder) ¦ remainder = total_mon - remainder; next_global_id += remainder + mon->rank; dout(10) << "next_global_id should be " << next_global_id << dendl; // if we can't bump the max, bail out now on an out-of-bounds gid if (next_global_id > max_global_id && ¦ ¦ (!mon->is_leader() || !should_increase_max)) { ¦ return 0; } // can we return a gid? bool return_next = (next_global_id <= max_global_id); // bump the max? while (mon->is_leader() && ¦(max_global_id < g_conf->mon_globalid_prealloc || ¦ next_global_id >= max_global_id - g_conf->mon_globalid_prealloc / 2)) { ¦ increase_max_global_id(); } if (return_next) { ¦ last_allocated_id = next_global_id; ¦ return next_global_id; } else { ¦ return 0; } }
bid来源于monclient,monclient是从monitor服务中申请的ID。
总结:在创建image的时候会在服务端创建两个对象:1.object name对象(rbd_id.{image_name})2.object header对象(rbd_header.{image_id});
image_id是由一个随机数和bid转换成16进制之后拼接生成的。 bid是由MonClient从monitor服务中申请而来的(标识一个MonClient)。
0 0
- 创建image时服务端产生的对象
- java 中String的创建产生的对象
- libgdx的Image对象
- 使用点阵图形上下文创建Image对象
- docker创建自己的image
- Halcon:Image acquisition device cannot be initialized 应用GigE时产生的问题
- 如何创建一个只能在堆上产生对象的类
- 编译器产生的临时对象
- 控制对象产生的数目
- 指针对象的产生方式
- String产生对象的看法
- 03JVM-对象的产生
- 服务端与客户端交互中产生的问题
- 创建docker image时可能会用到的.dockerignore
- 用 PHP 产生 QR Code 的 image 图档
- caffe训练中create image数据产生的bug
- 优化Image设置Tiled类型产生过多的三角形顶点
- webservice的服务端和客户端的创建
- 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】
- AST
- gcc4.4.7升级到gcc4.8.0
- keepalived persistence_timeout参数意义 LVS Persistence 参数的作用
- Ubuntu 16.04 安装
- 创建image时服务端产生的对象
- Android JCVideoPlayer视频播放器使用相关(新版JCVideo已经添加相关功能)
- SVN搭建教程网址
- unity常见的解析数据方式XML,JSON,ProtocolBuf篇(二)XML
- 分布式文件系统 - FastDFS 安装部署
- 20. Spring Boot Servlet【从零开始学Spring Boot】
- Laravel 5.3 不同用户表登录认证
- SQL Server 存储(3/8):理解GAM和SGAM页
- java算法篇---银行家算法