ceph之rbd读写API 测试

rados、rbd读写API测试:

  1 //compile:
  2 //gcc ceph_test_v2.c  -lrbd -lrados  -g -Wall
  3
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <string.h>
  7 #include <rados/librados.h>
  8 #include <rbd/librbd.h>
  9
 10 static int print_progress_percent(uint64_t offset, uint64_t src_size,void *data)
 11 {
 12     float percent = ((float)offset*100)/src_size;
 13     printf("%3.2f%% done\n", percent);
 14     return 0;
 15 }
 16
 17 int main(int argc, char** argv)
 18 {
 19     rados_t cluster;
 20     char cluster_name[] = "ceph";
 21     char user_name[] = "client.admin";
 22     uint64_t flags = 0;
 23     int i=0;
 24
 25     rados_ioctx_t io;
 26     char *poolname = "kvm";
 27
 28     //Initialize the cluster handle with the "ceph" cluster name
 29     //and the "client.admin" user name
 30     int rt_num;
 31     rt_num = rados_create2(&cluster, cluster_name, user_name, flags);
 32     if(rt_num<0){
 33         printf("%s: Couldn‘t create the cluster handle! %s\n", argv[0], strerror(-rt_num));
 34         return -1;
 35     }else{
 36         printf("\nCreated a cluster handle success. \n");
 37     }
 38
 39     //Read a ceph configuration file to configure the cluster handle
 40     rt_num = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf");
 41     if(rt_num<0){
 42         printf("%s:can‘t read config file: %s\n", argv[0], strerror(-rt_num));
 43         return -1;
 44     }else{
 45         printf("\nRead the config file. \n");
 46     }
 47
 48     //Read command line arguments
 49     /*
 50     rt_num = rados_conf_parse_argv(cluster, argc, argv);
 51     if(rt_num<0){
 52         printf("%s:cannot parse command line arguments:%s\n", argv[0], strerror(-rt_num));
 53         return -1;
 54     }else{
 55         printf("\nRead the command line arguments.\n");
 56     }*/
 57
 58     //Connect to the cluster
 59     rt_num = rados_connect(cluster);
 60     if(rt_num<0){
 61         printf("%s:cannot connect to cluster:%s\n", argv[0], strerror(-rt_num));
 62         return -1;
 63     }else{
 64         printf("\nConnected to the cluster.\n");
 65     }
 66
 67     //create io handle
 68     rt_num = rados_ioctx_create(cluster, poolname, &io);
 69     if(rt_num<0){
 70         printf("%s:cannot open rados pool %s:%s", argv[0], poolname, strerror(-rt_num));
 71         rados_shutdown(cluster);
 72         return -1;
 73     }else{
 74         printf("\nCreated I/O context. \n");
 75     }
 76
 77     const char* name = "3400.img";
 78     const char* name_01 = "3000.img";
 79     /*const char* name_02 = "rbd_test_02.img";
 80     uint64_t size = 1073741824;
 81     uint64_t features = 1073741824;
 82     int order = 22;     //warning
 83     //int rbd_create2(rados_ioctx_t io, const char *name, uint64_t size, uint64_t features, int *order);
 84     rt_num = rbd_create( io, name, size, &order);
 85     if( rt_num ==0 ){
 86         printf("\nrbd_create success !!\n");
 87     }else{
 88         printf("\nrbd_create failed !!%s\n", strerror(-rt_num));
 89     }*/
 90
 91
 92     rbd_image_t image;
 93     //rbd_image_info_t info;
 94     //size_t  infosize;
 95
 96     //rt_num = rbd_stat(image, &info, sizeof(info));
 97     //if(rt_num < 0){
 98     //  printf("rbd_stat error !!\n");
 99     //}
100     //printf("rbd_stat rt_num:%d, size:%d", rt_num, (int)info.size);
101
102     //int rbd_remove_with_progress(rados_ioctx_t io, const char *name,librbd_progress_fn_t cb, void *cbdata);
103     //librbd_progress_fn_t cb;
104     //void* cbdata = NULL;
105     printf("\nremove img name:%s\n", name_01);
106     rt_num = rbd_remove_with_progress(io, name_01, print_progress_percent, NULL);
107     if(rt_num ==0){
108         printf("\nrbd_remove success !!\n");
109     }
110
111     //int rbd_open(rados_ioctx_t io, const char *name, rbd_image_t *image, const char *snap_name);
112     rt_num = rbd_open( io, name, &image, NULL);
113                                                      if( rt_num ==0 ){
114         printf("\nrbd_open success !!\n");
115     }else{
116         printf("\nrbd_open failed !!%s\n", strerror(-rt_num));
117     }
118
119     size_t num = 156384;
120     char* buf=(char*)malloc(num);
121     char buf1[30]="";
122     uint64_t ofs = 0;
123     ssize_t  ok_size = 0;
124     i = 10;
125     //ssize_t rbd_write(rbd_image_t image, uint64_t ofs, size_t len, const char *buf);
126     for(;i>0;i--){
127         ok_size = rbd_write(image, ofs, num , buf);
128         if(ok_size == num){
129             ofs = ok_size + ofs;
130             printf("rbd_write ok!! ofs: %lu\n", ofs);
131         }else{
132             printf("rbd_write fail!!\n");
133         }
134     }
135
136     rbd_image_info_t info_tmp;
137     rt_num = rbd_stat(image, &info_tmp, sizeof(info_tmp));
138     if(rt_num < 0){
139         printf("\nrbd_stat failed %s\n", name);
140     }else{
141         printf("\nrbd_stat size :%d\n", (int)info_tmp.size);
142     }
143
144
145     ofs = 0;
146     rt_num = rbd_get_size(image, &ofs);
147     if(rt_num >= 0){
148         printf("\nrbd_get_size %d\n", (int)ofs);
149     }
150     printf("\nrbd_get_size return_num: %d\n", rt_num);
151     ofs = 0;
152     //ssize_t rbd_read(rbd_image_t image, uint64_t ofs, size_t len, char *buf);
153     for(i=0;i<10;i++){
154         ok_size = rbd_read(image, ofs, 10, buf1);
155         if(ok_size >0){
156             ofs = 10+ofs;
157             printf("\nthe content is:%s", buf1);
158         }else{
159             printf("rbd_read fail!!\n");
160         }
161     }
162
163     //int rbd_aio_write(rbd_image_t image, uint64_t off, size_t len, const char *buf, rbd_completion_t c);
164     //int rbd_aio_read(rbd_image_t image, uint64_t off, size_t len, char *buf, rbd_completion_t c);
165
166     /*
167      rt_num = rbd_open_read_only( io, name_01, image, NULL);
168      if(rt_num == 0){
169         printf("\nrbd_open_read_only success !!\n");
170      }else{
171         printf("\nrbd_open_read_only fail !!\n");
172      }
173     */
174
175
176
177     rt_num = rbd_close(image);
178     if(rt_num == 0){
179         printf("\nrbd_close success !!\n");
180     }else{
181         printf("\nrbd_close failed !!%s\n", strerror(-rt_num));
182     }
183
184     printf("\nClosing the connection\n");
185     rados_ioctx_destroy(io);
186     printf("\nShut down the handle\n");
187     rados_shutdown(cluster);
188     return 0;
189 }
时间: 2025-01-01 12:19:49

ceph之rbd读写API 测试的相关文章

ubuntu12.04+kafka2.9.2+zookeeper3.4.5的分布式集群安装和demo(java api)测试

博文作者:迦壹 博客地址:http://idoall.org/home.php?mod=space&uid=1&do=blog&id=547 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! --------------------------------------- 目录: 一.什么是kafka? 二.kafka的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.FAQ 六.扩展阅读 一.什么是kafka? ka

kafka2.9.2的分布式集群安装和demo(java api)测试

目录: 一.什么是kafka? 二.kafka的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.FAQ 六.扩展阅读   一.什么是kafka? kafka是LinkedIn开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目.在它的主页描述kafka为一个高吞吐量的分布式(能将消息分散到不同的节点上)MQ.Kafka仅仅由7000行Scala编写,据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB). kafka目

006 管理Ceph的RBD块设备

一, Ceph RBD的特性 支持完整和增量的快照 自动精简配置 写时复制克隆 动态调整大小 二.RBD基本应用 2.1 创建RBD池 [root@ceph2 ceph]# ceph osd pool create rbd 64 pool 'rbd' created [root@ceph2 ceph]# ceph osd pool application enable rbd rbd enabled application 'rbd' on pool 'rbd' 2.2 客户端验证 [root@

微信公众号API测试——接口调用频率限制

接口频率限制[1] 公众号调用接口并不是无限制的.为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到如下错误返回码: {"errcode":45009,"errmsg":"api freq out of limit"} 各接口调用频率限制如下: 接口 每日限额 获取access_token 2000 自定义菜单创建 1000 自定义菜单查询 10000 自定义菜

API测试利器postMan 使用教程

自从开始做API开发之后,我就在寻找合适的API测试工具.一开始不是很想用Chrome扩展,用的 WizTools 的工具,后来试过一次 Postman 之后就停不下来了,还买了付费的Jetpacks.推出Team Sync Beta之后我又把这个工具推广给团队,作为API文档使用.看到中文网络上关于这个工具的文章并不多,于是决定写一篇小文介绍一下. 一.基本功能 Postman的功能在 文档 中有介绍.不过文档略啰嗦,这里简单介绍一下主界面,入门功能就都提到了. Collections:在Po

微信公众平台API测试——接收文本消息

一.简介 当普通微信用户向公众账号发消息时,微信服务器将用户发送的消息封装成XML数据包,通过POST消息发送到开发者的URL上.      微信服务器在五秒内收不到服务器的响应会断掉连接,并且重新发起请求,总共重试三次.关于重试的消息排重,推荐使用msgid排重.      假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试. 当前支持如下的普通消息: 1 文本消息 2 图片消息 3 语音消息 4 视频消息 5 地理位置消息 6 链接消息 二

微信公众平台API测试——接收链接消息

一.简介 当普通微信用户向公众账号发消息时,微信服务器将用户发送的消息封装成XML数据包,通过POST消息发送到开发者的URL上.      微信服务器在五秒内收不到服务器的响应会断掉连接,并且重新发起请求,总共重试三次.关于重试的消息排重,推荐使用msgid排重.      假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试. 当前支持如下的普通消息: 1 文本消息 2 图片消息 3 语音消息 4 视频消息 5 地理位置消息 6 链接消息 二

微信公众平台API测试——接收地理位置消息

一.简介 当普通微信用户向公众账号发消息时,微信服务器将用户发送的消息封装成XML数据包,通过POST消息发送到开发者的URL上.      微信服务器在五秒内收不到服务器的响应会断掉连接,并且重新发起请求,总共重试三次.关于重试的消息排重,推荐使用msgid排重.      假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试. 当前支持如下的普通消息: 1 文本消息 2 图片消息 3 语音消息 4 视频消息 5 地理位置消息 6 链接消息 二

微信公众平台API测试——接收视频消息

一.简介 当普通微信用户向公众账号发消息时,微信服务器将用户发送的消息封装成XML数据包,通过POST消息发送到开发者的URL上.      微信服务器在五秒内收不到服务器的响应会断掉连接,并且重新发起请求,总共重试三次.关于重试的消息排重,推荐使用msgid排重.      假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试. 当前支持如下的普通消息: 1 文本消息 2 图片消息 3 语音消息 4 视频消息 5 地理位置消息 6 链接消息 二