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 }