Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / tools / RadosDump.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4  * Ceph - scalable distributed file system
5  *
6  * Copyright (C) 2015 Red Hat
7  *
8  * This is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License version 2.1, as published by the Free Software
11  * Foundation.  See file COPYING.
12  *
13  */
14
15 #include "RadosDump.h"
16
17 int RadosDump::read_super()
18 {
19   bufferlist ebl;
20   bufferlist::iterator ebliter = ebl.begin();
21   ssize_t bytes;
22
23   bytes = ebl.read_fd(file_fd, super_header::FIXED_LENGTH);
24   if ((size_t)bytes != super_header::FIXED_LENGTH) {
25     cerr << "Unexpected EOF" << std::endl;
26     return -EFAULT;
27   }
28
29   sh.decode(ebliter);
30
31   return 0;
32 }
33
34
35 int RadosDump::get_header(header *h)
36 {
37   assert (h != NULL);
38
39   bufferlist ebl;
40   bufferlist::iterator ebliter = ebl.begin();
41   ssize_t bytes;
42
43   bytes = ebl.read_fd(file_fd, sh.header_size);
44   if ((size_t)bytes != sh.header_size) {
45     cerr << "Unexpected EOF" << std::endl;
46     return -EFAULT;
47   }
48
49   h->decode(ebliter);
50
51   return 0;
52 }
53
54 int RadosDump::get_footer(footer *f)
55 {
56   assert(f != NULL);
57
58   bufferlist ebl;
59   bufferlist::iterator ebliter = ebl.begin();
60   ssize_t bytes;
61
62   bytes = ebl.read_fd(file_fd, sh.footer_size);
63   if ((size_t)bytes != sh.footer_size) {
64     cerr << "Unexpected EOF" << std::endl;
65     return -EFAULT;
66   }
67
68   f->decode(ebliter);
69
70   if (f->magic != endmagic) {
71     cerr << "Bad footer magic" << std::endl;
72     return -EFAULT;
73   }
74
75   return 0;
76 }
77
78 int RadosDump::read_section(sectiontype_t *type, bufferlist *bl)
79 {
80   header hdr;
81   ssize_t bytes;
82
83   int ret = get_header(&hdr);
84   if (ret)
85     return ret;
86
87   *type = hdr.type;
88
89   bl->clear();
90   bytes = bl->read_fd(file_fd, hdr.size);
91   if (bytes != hdr.size) {
92     cerr << "Unexpected EOF" << std::endl;
93     return -EFAULT;
94   }
95
96   if (hdr.size > 0) {
97     footer ft;
98     ret = get_footer(&ft);
99     if (ret)
100       return ret;
101   }
102
103   return 0;
104 }
105
106
107 int RadosDump::skip_object(bufferlist &bl)
108 {
109   bufferlist::iterator ebliter = bl.begin();
110   bufferlist ebl;
111   bool done = false;
112   while(!done) {
113     sectiontype_t type;
114     int ret = read_section(&type, &ebl);
115     if (ret)
116       return ret;
117
118     ebliter = ebl.begin();
119     if (type >= END_OF_TYPES) {
120       cout << "Skipping unknown object section type" << std::endl;
121       continue;
122     }
123     switch(type) {
124     case TYPE_DATA:
125     case TYPE_ATTRS:
126     case TYPE_OMAP_HDR:
127     case TYPE_OMAP:
128 #ifdef DIAGNOSTIC
129       cerr << "Skip type " << (int)type << std::endl;
130 #endif
131       break;
132     case TYPE_OBJECT_END:
133       done = true;
134       break;
135     default:
136       cerr << "Can't skip unknown type: " << type << std::endl;
137       return -EFAULT;
138     }
139   }
140   return 0;
141 }
142
143 //Write super_header with its fixed 16 byte length
144 void RadosDump::write_super()
145 {
146   if (dry_run) {
147     return;
148   }
149
150   bufferlist superbl;
151   super_header sh;
152   footer ft;
153
154   header hdr(TYPE_NONE, 0);
155   hdr.encode(superbl);
156
157   sh.magic = super_header::super_magic;
158   sh.version = super_header::super_ver;
159   sh.header_size = superbl.length();
160   superbl.clear();
161   ft.encode(superbl);
162   sh.footer_size = superbl.length();
163   superbl.clear();
164
165   sh.encode(superbl);
166   assert(super_header::FIXED_LENGTH == superbl.length());
167   superbl.write_fd(file_fd);
168 }