78
RadosClient() : messenger(NULL), lock("radosclient") {
79
RadosClient() : messenger(NULL), lock("radosclient"), timer(lock) {
79
80
messenger = new SimpleMessenger();
134
135
int write(PoolCtx& pool, const object_t& oid, off_t off, bufferlist& bl, size_t len);
135
136
int write_full(PoolCtx& pool, const object_t& oid, bufferlist& bl);
136
137
int read(PoolCtx& pool, const object_t& oid, off_t off, bufferlist& bl, size_t len);
138
int mapext(PoolCtx& pool, const object_t& oid, off_t off, size_t len, std::map<off_t,size_t>& m);
139
int sparse_read(PoolCtx& pool, const object_t& oid, off_t off, size_t len, std::map<off_t,size_t>& m, bufferlist& bl);
137
140
int remove(PoolCtx& pool, const object_t& oid);
138
141
int stat(PoolCtx& pool, const object_t& oid, uint64_t *psize, time_t *pmtime);
139
142
int trunc(PoolCtx& pool, const object_t& oid, size_t size);
144
147
int getxattr(PoolCtx& pool, const object_t& oid, const char *name, bufferlist& bl);
145
148
int setxattr(PoolCtx& pool, const object_t& oid, const char *name, bufferlist& bl);
146
149
int getxattrs(PoolCtx& pool, const object_t& oid, map<string, bufferlist>& attrset);
150
int rmxattr(PoolCtx& pool, const object_t& oid, const char *name);
148
152
int list_pools(std::list<string>& ls);
149
153
int get_pool_stats(std::list<string>& ls, map<string,pool_stat_t>& result);
333
bool RadosClient::init()
337
int RadosClient::init()
336
if (monclient.build_initial_monmap() < 0)
340
int ret = monclient.build_initial_monmap();
344
assert_warn(messenger);
339
348
dout(1) << "starting msgr at " << messenger->get_ms_addr() << dendl;
341
350
messenger->register_entity(entity_name_t::CLIENT(-1));
342
assert_warn(messenger);
345
351
dout(1) << "starting objecter" << dendl;
347
objecter = new Objecter(messenger, &monclient, &osdmap, lock);
353
objecter = new Objecter(messenger, &monclient, &osdmap, lock, timer);
356
objecter->set_balanced_budget();
351
358
monclient.set_messenger(messenger);
358
365
dout(1) << "setting wanted keys" << dendl;
359
366
monclient.set_want_keys(CEPH_ENTITY_TYPE_MON | CEPH_ENTITY_TYPE_OSD);
360
dout(1) << "iit" << dendl;
367
dout(1) << "calling monclient init" << dendl;
361
368
monclient.init();
363
370
int err = monclient.authenticate(g_conf.client_mount_timeout);
365
372
dout(0) << *g_conf.entity_name << " authentication error " << strerror(-err) << dendl;
368
375
messenger->set_myname(entity_name_t::CLIENT(monclient.get_global_id()));
372
381
objecter->set_client_incarnation(0);
373
382
objecter->init();
374
383
monclient.renew_subs();
580
591
PoolCtx* ctx = (PoolCtx *) pool;
581
ceph_object_layout layout = objecter->osdmap
582
->make_object_layout(oid, ctx->poolid);
593
object_locator_t oloc(ctx->poolid);
584
595
Mutex mylock("RadosClient::snap_rollback::mylock");
587
598
Context *onack = new C_SafeCond(&mylock, &cond, &done, &reply);
590
objecter->rollback_object(oid, layout, snapc, snapid,
601
objecter->rollback_object(oid, oloc, snapc, snapid,
591
602
g_clock.now(), onack, NULL);
799
810
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
802
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
803
objecter->create(oid, layout,
813
object_locator_t oloc(pool.poolid);
814
objecter->create(oid, oloc,
804
815
pool.snapc, ut, 0, (exclusive ? CEPH_OSD_OP_FLAG_EXCL : 0),
852
863
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
855
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
856
objecter->write(oid, layout,
866
object_locator_t oloc(pool.poolid);
867
objecter->write(oid, oloc,
857
868
off, len, pool.snapc, bl, ut, 0,
885
896
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
888
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
889
objecter->write_full(oid, layout,
899
object_locator_t oloc(pool.poolid);
900
objecter->write_full(oid, oloc,
890
901
pool.snapc, bl, ut, 0,
910
921
Mutex::Locker l(lock);
911
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
912
objecter->read(oid, layout,
922
object_locator_t oloc(pool.poolid);
923
objecter->read(oid, oloc,
913
924
off, len, pool.snap_seq, &c->bl, 0,
926
937
Mutex::Locker l(lock);
927
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
928
objecter->read(oid, layout,
938
object_locator_t oloc(pool.poolid);
939
objecter->read(oid, oloc,
929
940
off, len, pool.snap_seq, &c->bl, 0,
942
953
Context *onsafe = new C_aio_Safe(c);
944
955
Mutex::Locker l(lock);
945
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
946
objecter->write(oid, layout,
956
object_locator_t oloc(pool.poolid);
957
objecter->write(oid, oloc,
947
958
off, len, pool.snapc, bl, ut, 0,
960
971
Context *onsafe = new C_aio_Safe(c);
962
973
Mutex::Locker l(lock);
963
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
964
objecter->write_full(oid, layout,
974
object_locator_t oloc(pool.poolid);
975
objecter->write_full(oid, oloc,
965
976
pool.snapc, bl, ut, 0,
980
991
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
983
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
984
objecter->remove(oid, layout,
994
object_locator_t oloc(pool.poolid);
995
objecter->remove(oid, oloc,
1010
1021
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1013
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1014
objecter->trunc(oid, layout,
1024
object_locator_t oloc(pool.poolid);
1025
objecter->trunc(oid, oloc,
1015
1026
pool.snapc, ut, 0,
1041
1052
SnapContext snapc;
1042
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1053
object_locator_t oloc(pool.poolid);
1043
1054
ObjectOperation wr;
1044
1055
wr.tmap_update(cmdbl);
1045
objecter->mutate(oid, layout, wr, snapc, ut, 0, onack, NULL);
1056
objecter->mutate(oid, oloc, wr, snapc, ut, 0, onack, NULL);
1070
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1081
object_locator_t oloc(pool.poolid);
1071
1082
ObjectOperation rd;
1072
1083
rd.call(cls, method, inbl);
1073
objecter->read(oid, layout, rd, pool.snap_seq, &outbl, 0, onack);
1084
objecter->read(oid, oloc, rd, pool.snap_seq, &outbl, 0, onack);
1092
1103
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1095
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1096
objecter->read(oid, layout,
1106
object_locator_t oloc(pool.poolid);
1107
objecter->read(oid, oloc,
1097
1108
off, len, pool.snap_seq, &bl, 0,
1115
1126
return bl.length();
1129
int RadosClient::mapext(PoolCtx& pool, const object_t& oid, off_t off, size_t len, std::map<off_t,size_t>& m)
1134
Mutex mylock("RadosClient::read::mylock");
1138
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1141
object_locator_t oloc(pool.poolid);
1142
objecter->mapext(oid, oloc,
1143
off, len, pool.snap_seq, &bl, 0,
1151
dout(10) << "Objecter returned from read r=" << r << dendl;
1156
bufferlist::iterator iter = bl.begin();
1162
int RadosClient::sparse_read(PoolCtx& pool, const object_t& oid, off_t off, size_t len,
1163
std::map<off_t,size_t>& m, bufferlist& data_bl)
1168
Mutex mylock("RadosClient::read::mylock");
1172
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1175
object_locator_t oloc(pool.poolid);
1176
objecter->sparse_read(oid, oloc,
1177
off, len, pool.snap_seq, &bl, 0,
1185
dout(10) << "Objecter returned from read r=" << r << dendl;
1190
bufferlist::iterator iter = bl.begin();
1192
::decode(data_bl, iter);
1118
1197
int RadosClient::stat(PoolCtx& pool, const object_t& oid, uint64_t *psize, time_t *pmtime)
1120
1199
SnapContext snapc;
1134
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1135
objecter->stat(oid, layout,
1213
object_locator_t oloc(pool.poolid);
1214
objecter->stat(oid, oloc,
1136
1215
pool.snap_seq, psize, &mtime, 0,
1161
1240
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1164
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1165
objecter->getxattr(oid, layout,
1243
object_locator_t oloc(pool.poolid);
1244
objecter->getxattr(oid, oloc,
1166
1245
name, pool.snap_seq, &bl, 0,
1179
1258
return bl.length();
1261
int RadosClient::rmxattr(PoolCtx& pool, const object_t& oid, const char *name)
1263
utime_t ut = g_clock.now();
1265
/* can't write to a snapshot */
1266
if (pool.snap_seq != CEPH_NOSNAP)
1269
Mutex mylock("RadosClient::rmxattr::mylock");
1274
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1276
object_locator_t oloc(pool.poolid);
1279
objecter->removexattr(oid, oloc, name,
1182
1295
int RadosClient::setxattr(PoolCtx& pool, const object_t& oid, const char *name, bufferlist& bl)
1184
1297
utime_t ut = g_clock.now();
1195
1308
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1198
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1199
objecter->setxattr(oid, layout, name,
1311
object_locator_t oloc(pool.poolid);
1312
objecter->setxattr(oid, oloc, name,
1200
1313
pool.snapc, bl, ut, 0,
1228
1341
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
1231
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool.poolid);
1344
object_locator_t oloc(pool.poolid);
1232
1345
map<string, bufferlist> aset;
1233
objecter->getxattrs(oid, layout, pool.snap_seq,
1346
objecter->getxattrs(oid, oloc, pool.snap_seq,
1279
1392
if (g_conf.clock_tare) g_clock.tare();
1281
1394
client = new RadosClient();
1282
return ((RadosClient *)client)->init() ? 0 : -1;
1395
return client->init();
1285
1398
void Rados::shutdown()
1287
((RadosClient *)client)->shutdown();
1290
1403
int Rados::list_pools(std::list<string>& v)
1293
1406
return -EINVAL;
1294
return ((RadosClient *)client)->list_pools(v);
1407
return client->list_pools(v);
1297
1410
int Rados::get_pool_stats(std::list<string>& v, std::map<string,pool_stat_t>& result)
1300
1413
return -EINVAL;
1301
1414
map<string,::pool_stat_t> rawresult;
1302
int r = ((RadosClient *)client)->get_pool_stats(v, rawresult);
1415
int r = client->get_pool_stats(v, rawresult);
1303
1416
for (map<string,::pool_stat_t>::iterator p = rawresult.begin();
1304
1417
p != rawresult.end();
1310
1423
v.num_object_clones = p->second.num_object_clones;
1311
1424
v.num_object_copies = p->second.num_object_copies;
1312
1425
v.num_objects_missing_on_primary = p->second.num_objects_missing_on_primary;
1426
v.num_objects_unfound = p->second.num_objects_unfound;
1313
1427
v.num_objects_degraded = p->second.num_objects_degraded;
1314
1428
v.num_rd = p->second.num_rd;
1315
1429
v.num_rd_kb = p->second.num_rd_kb;
1324
1438
string str(name);
1326
1440
return -EINVAL;
1327
return ((RadosClient *)client)->create_pool(str, auid, crush_rule);
1441
return client->create_pool(str, auid, crush_rule);
1330
1444
int Rados::delete_pool(const rados_pool_t& pool)
1332
1446
if (!client) return -EINVAL;
1333
return ((RadosClient *)client)->delete_pool(pool);
1447
return client->delete_pool(pool);
1336
1450
int Rados::change_pool_auid(const rados_pool_t& pool, uint64_t auid)
1338
1452
if (!client) return -EINVAL;
1339
return ((RadosClient *)client)->change_pool_auid(pool, auid);
1453
return client->change_pool_auid(pool, auid);
1342
1456
int Rados::get_fs_stats(statfs_t& result)
1370
1484
Objecter::ListContext *h = (Objecter::ListContext *)ctx.ctx;
1371
1485
h->list.clear();
1372
int r = ((RadosClient *)client)->list(h, max);
1486
int r = client->list(h, max);
1373
1487
while (!h->list.empty()) {
1374
1488
entries.push_back(h->list.front().name.c_str());
1375
1489
h->list.pop_front();
1390
1504
return -EINVAL;
1391
1505
object_t oid(o);
1392
return ((RadosClient *)client)->create(*(RadosClient::PoolCtx *)pool, oid, exclusive);
1506
return client->create(*(RadosClient::PoolCtx *)pool, oid, exclusive);
1395
1509
int Rados::write(rados_pool_t pool, const string& o, off_t off, bufferlist& bl, size_t len)
1398
1512
return -EINVAL;
1399
1513
object_t oid(o);
1400
return ((RadosClient *)client)->write(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
1514
return client->write(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
1403
1517
int Rados::write_full(rados_pool_t pool, const string& o, bufferlist& bl)
1406
1520
return -EINVAL;
1407
1521
object_t oid(o);
1408
return ((RadosClient *)client)->write_full(*(RadosClient::PoolCtx *)pool, oid, bl);
1522
return client->write_full(*(RadosClient::PoolCtx *)pool, oid, bl);
1411
1525
int Rados::trunc(rados_pool_t pool, const string& o, size_t size)
1414
1528
return -EINVAL;
1415
1529
object_t oid(o);
1416
return ((RadosClient *)client)->trunc(*(RadosClient::PoolCtx *)pool, oid, size);
1530
return client->trunc(*(RadosClient::PoolCtx *)pool, oid, size);
1419
1533
int Rados::remove(rados_pool_t pool, const string& o)
1422
1536
return -EINVAL;
1423
1537
object_t oid(o);
1424
return ((RadosClient *)client)->remove(*(RadosClient::PoolCtx *)pool, oid);
1538
return client->remove(*(RadosClient::PoolCtx *)pool, oid);
1427
1541
int Rados::read(rados_pool_t pool, const string& o, off_t off, bufferlist& bl, size_t len)
1430
1544
return -EINVAL;
1431
1545
object_t oid(o);
1432
return ((RadosClient *)client)->read(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
1546
return client->read(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
1549
int Rados::mapext(rados_pool_t pool, const string& o, off_t off, size_t len, std::map<off_t, size_t>& m)
1554
return ((RadosClient *)client)->mapext(*(RadosClient::PoolCtx *)pool, oid, off, len, m);
1557
int Rados::sparse_read(rados_pool_t pool, const string& o, off_t off, size_t len, std::map<off_t, size_t>& m, bufferlist& bl)
1562
return ((RadosClient *)client)->sparse_read(*(RadosClient::PoolCtx *)pool, oid, off, len, m, bl);
1435
1565
int Rados::getxattr(rados_pool_t pool, const string& o, const char *name, bufferlist& bl)
1438
1568
return -EINVAL;
1439
1569
object_t oid(o);
1440
return ((RadosClient *)client)->getxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
1570
return client->getxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
1443
1573
int Rados::getxattrs(rados_pool_t pool, const string& o, map<std::string, bufferlist>& attrset)
1446
1576
return -EINVAL;
1447
1577
object_t oid(o);
1448
return ((RadosClient *)client)->getxattrs(*(RadosClient::PoolCtx *)pool, oid, attrset);
1578
return client->getxattrs(*(RadosClient::PoolCtx *)pool, oid, attrset);
1451
1581
int Rados::setxattr(rados_pool_t pool, const string& o, const char *name, bufferlist& bl)
1454
1584
return -EINVAL;
1455
1585
object_t oid(o);
1456
return ((RadosClient *)client)->setxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
1586
return client->setxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
1589
int Rados::rmxattr(rados_pool_t pool, const string& o, const char *name)
1594
return client->rmxattr(*(RadosClient::PoolCtx *)pool, oid, name);
1459
1597
int Rados::stat(rados_pool_t pool, const string& o, uint64_t *psize, time_t *pmtime)
1462
1600
return -EINVAL;
1463
1601
object_t oid(o);
1464
return ((RadosClient *)client)->stat(*(RadosClient::PoolCtx *)pool, oid, psize, pmtime);
1602
return client->stat(*(RadosClient::PoolCtx *)pool, oid, psize, pmtime);
1467
1605
int Rados::tmap_update(rados_pool_t pool, const string& o, bufferlist& cmdbl)
1470
1608
return -EINVAL;
1471
1609
object_t oid(o);
1472
return ((RadosClient *)client)->tmap_update(*(RadosClient::PoolCtx *)pool, oid, cmdbl);
1610
return client->tmap_update(*(RadosClient::PoolCtx *)pool, oid, cmdbl);
1474
1612
int Rados::exec(rados_pool_t pool, const string& o, const char *cls, const char *method,
1475
1613
bufferlist& inbl, bufferlist& outbl)
1478
1616
return -EINVAL;
1479
1617
object_t oid(o);
1480
return ((RadosClient *)client)->exec(*(RadosClient::PoolCtx *)pool, oid, cls, method, inbl, outbl);
1618
return client->exec(*(RadosClient::PoolCtx *)pool, oid, cls, method, inbl, outbl);
1483
1621
int Rados::lookup_pool(const char *name)
1485
return ((RadosClient *)client)->lookup_pool(name);
1623
return client->lookup_pool(name);
1488
1626
int Rados::open_pool(const char *name, rados_pool_t *pool)
1490
int poolid = ((RadosClient *)client)->lookup_pool(name);
1628
int poolid = client->lookup_pool(name);
1491
1629
if (poolid >= 0) {
1492
1630
RadosClient::PoolCtx *ctx = new RadosClient::PoolCtx(poolid, name, CEPH_NOSNAP);
1511
1649
int Rados::snap_create(const rados_pool_t pool, const char *snapname) {
1512
1650
if (!client) return -EINVAL;
1513
return ((RadosClient *)client)->snap_create(pool, snapname);
1651
return client->snap_create(pool, snapname);
1516
1654
int Rados::snap_remove(const rados_pool_t pool, const char *snapname) {
1517
1655
if (!client) return -EINVAL;
1518
return ((RadosClient *)client)->snap_remove(pool, snapname);
1656
return client->snap_remove(pool, snapname);
1521
1659
int Rados::snap_rollback_object(const rados_pool_t pool, const std::string& oid,
1522
1660
const char *snapname) {
1523
1661
if (!client) return -EINVAL;
1524
return ((RadosClient *)client)->snap_rollback_object(pool, oid, snapname);
1662
return client->snap_rollback_object(pool, oid, snapname);
1527
1665
int Rados::selfmanaged_snap_create(const rados_pool_t pool, uint64_t *snapid)
1529
1667
if (!client) return -EINVAL;
1530
return ((RadosClient *)client)->selfmanaged_snap_create(pool, snapid);
1668
return client->selfmanaged_snap_create(pool, snapid);
1533
1671
int Rados::selfmanaged_snap_remove(const rados_pool_t pool,
1534
1672
uint64_t snapid)
1536
1674
if (!client) return -EINVAL;
1537
return ((RadosClient *)client)->selfmanaged_snap_remove(pool, snapid);
1675
return client->selfmanaged_snap_remove(pool, snapid);
1540
1678
int Rados::selfmanaged_snap_rollback_object(const rados_pool_t pool,
1549
1687
for (; iter != snapc.snaps.end(); ++iter) {
1550
1688
sn.snaps.push_back(*iter);
1552
return ((RadosClient *)client)->selfmanaged_snap_rollback_object(pool, oid, sn, snapid);
1690
return client->selfmanaged_snap_rollback_object(pool, oid, sn, snapid);
1555
1693
void Rados::set_snap(rados_pool_t pool, snap_t seq)
1578
1716
return -EINVAL;
1579
1717
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1580
return ((RadosClient *)client)->snap_list(ctx, snaps);
1718
return client->snap_list(ctx, snaps);
1583
1721
int Rados::snap_lookup(rados_pool_t pool, const char *name, snap_t *snapid)
1586
1724
return -EINVAL;
1587
1725
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1588
return ((RadosClient *)client)->snap_lookup(ctx, name, snapid);
1726
return client->snap_lookup(ctx, name, snapid);
1591
1729
int Rados::snap_get_name(rados_pool_t pool, snap_t snapid, std::string *s)
1594
1732
return -EINVAL;
1595
1733
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1596
return ((RadosClient *)client)->snap_get_name(ctx, snapid, s);
1734
return client->snap_get_name(ctx, snapid, s);
1598
1736
int Rados::snap_get_stamp(rados_pool_t pool, snap_t snapid, time_t *t)
1601
1739
return -EINVAL;
1602
1740
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1603
return ((RadosClient *)client)->snap_get_stamp(ctx, snapid, t);
1741
return client->snap_get_stamp(ctx, snapid, t);
1610
1748
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1611
1749
RadosClient::AioCompletion *pc = (RadosClient::AioCompletion *)c->pc;
1612
int r = ((RadosClient *)client)->aio_read(*ctx, oid, off, pbl, len, pc);
1750
int r = client->aio_read(*ctx, oid, off, pbl, len, pc);
1619
1757
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1620
1758
RadosClient::AioCompletion *pc = (RadosClient::AioCompletion *)c->pc;
1621
int r = ((RadosClient *)client)->aio_write(*ctx, oid, off, bl, len, pc);
1759
int r = client->aio_write(*ctx, oid, off, bl, len, pc);
1625
1763
Rados::AioCompletion *Rados::aio_create_completion()
1627
RadosClient::AioCompletion *c = ((RadosClient *)client)->aio_create_completion();
1765
RadosClient::AioCompletion *c = client->aio_create_completion();
1628
1766
return new AioCompletion(c);
1631
1769
Rados::AioCompletion *Rados::aio_create_completion(void *cb_arg, callback_t cb_complete, callback_t cb_safe)
1633
RadosClient::AioCompletion *c = ((RadosClient *)client)->aio_create_completion(cb_arg, cb_complete, cb_safe);
1771
RadosClient::AioCompletion *c = client->aio_create_completion(cb_arg, cb_complete, cb_safe);
1634
1772
return new AioCompletion(c);
1706
1844
if (!rados_initialized) {
1707
1845
__rados_init(argc, argv);
1708
1846
radosp = new RadosClient;
1851
ret = radosp->init();
1711
1855
++rados_initialized;
1713
1857
rados_init_mutex.Unlock();
1774
1919
stats->num_object_clones = r.num_object_clones;
1775
1920
stats->num_object_copies = r.num_object_copies;
1776
1921
stats->num_objects_missing_on_primary = r.num_objects_missing_on_primary;
1922
stats->num_objects_unfound = r.num_objects_unfound;
1777
1923
stats->num_objects_degraded = r.num_objects_degraded;
1778
1924
stats->num_rd = r.num_rd;
1779
1925
stats->num_rd_kb = r.num_rd_kb;
1837
1983
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
1839
1985
object_t oid(o);
1988
bufferptr bp = buffer::create_static(len, buf);
1841
1991
ret = radosp->read(*ctx, oid, off, bl, len);
1842
1992
if (ret >= 0) {
1843
1993
if (bl.length() > len)
1844
1994
return -ERANGE;
1845
bl.copy(0, bl.length(), buf);
1995
if (bl.c_str() != buf)
1996
bl.copy(0, bl.length(), buf);
1846
1997
ret = bl.length(); // hrm :/
1982
2133
return radosp->setxattr(*ctx, oid, name, bl);
2136
extern "C" int rados_rmxattr(rados_pool_t pool, const char *o, const char *name)
2138
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
2140
return radosp->rmxattr(*ctx, oid, name);
1985
2143
extern "C" int rados_stat(rados_pool_t pool, const char *o, uint64_t *psize, time_t *pmtime)
1987
2145
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;