]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/librados_test_stub/TestMemCluster.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "test/librados_test_stub/TestMemCluster.h"
5 #include "test/librados_test_stub/TestMemRadosClient.h"
9 TestMemCluster::File::File()
10 : snap_id(), exists(true), lock("TestMemCluster::File::lock") {
13 TestMemCluster::File::File(const File
&rhs
)
18 lock("TestMemCluster::File::lock") {
21 TestMemCluster::Pool::Pool()
22 : file_lock("TestMemCluster::Pool::file_lock") {
25 TestMemCluster::TestMemCluster()
26 : m_lock("TestMemCluster::m_lock"),
27 m_next_nonce(static_cast<uint32_t>(reinterpret_cast<uint64_t>(this))) {
30 TestMemCluster::~TestMemCluster() {
31 for (auto pool_pair
: m_pools
) {
32 pool_pair
.second
->put();
36 TestRadosClient
*TestMemCluster::create_rados_client(CephContext
*cct
) {
37 return new TestMemRadosClient(cct
, this);
40 int TestMemCluster::register_object_handler(int64_t pool_id
,
41 const ObjectLocator
& locator
,
42 ObjectHandler
* object_handler
) {
43 Mutex::Locker
locker(m_lock
);
44 auto pool
= get_pool(m_lock
, pool_id
);
45 if (pool
== nullptr) {
49 RWLock::WLocker
pool_locker(pool
->file_lock
);
50 auto file_it
= pool
->files
.find(locator
);
51 if (file_it
== pool
->files
.end()) {
55 auto& object_handlers
= pool
->file_handlers
[locator
];
56 auto it
= object_handlers
.find(object_handler
);
57 ceph_assert(it
== object_handlers
.end());
59 object_handlers
.insert(object_handler
);
63 void TestMemCluster::unregister_object_handler(int64_t pool_id
,
64 const ObjectLocator
& locator
,
65 ObjectHandler
* object_handler
) {
66 Mutex::Locker
locker(m_lock
);
67 auto pool
= get_pool(m_lock
, pool_id
);
68 if (pool
== nullptr) {
72 RWLock::WLocker
pool_locker(pool
->file_lock
);
73 auto handlers_it
= pool
->file_handlers
.find(locator
);
74 if (handlers_it
== pool
->file_handlers
.end()) {
78 auto& object_handlers
= handlers_it
->second
;
79 object_handlers
.erase(object_handler
);
82 int TestMemCluster::pool_create(const std::string
&pool_name
) {
83 Mutex::Locker
locker(m_lock
);
84 if (m_pools
.find(pool_name
) != m_pools
.end()) {
87 Pool
*pool
= new Pool();
88 pool
->pool_id
= ++m_pool_id
;
89 m_pools
[pool_name
] = pool
;
93 int TestMemCluster::pool_delete(const std::string
&pool_name
) {
94 Mutex::Locker
locker(m_lock
);
95 Pools::iterator iter
= m_pools
.find(pool_name
);
96 if (iter
== m_pools
.end()) {
104 int TestMemCluster::pool_get_base_tier(int64_t pool_id
, int64_t* base_tier
) {
106 *base_tier
= pool_id
;
110 int TestMemCluster::pool_list(std::list
<std::pair
<int64_t, std::string
> >& v
) {
111 Mutex::Locker
locker(m_lock
);
113 for (Pools::iterator iter
= m_pools
.begin(); iter
!= m_pools
.end(); ++iter
) {
114 v
.push_back(std::make_pair(iter
->second
->pool_id
, iter
->first
));
119 int64_t TestMemCluster::pool_lookup(const std::string
&pool_name
) {
120 Mutex::Locker
locker(m_lock
);
121 Pools::iterator iter
= m_pools
.find(pool_name
);
122 if (iter
== m_pools
.end()) {
125 return iter
->second
->pool_id
;
128 int TestMemCluster::pool_reverse_lookup(int64_t id
, std::string
*name
) {
129 Mutex::Locker
locker(m_lock
);
130 for (Pools::iterator iter
= m_pools
.begin(); iter
!= m_pools
.end(); ++iter
) {
131 if (iter
->second
->pool_id
== id
) {
139 TestMemCluster::Pool
*TestMemCluster::get_pool(int64_t pool_id
) {
140 Mutex::Locker
locker(m_lock
);
141 return get_pool(m_lock
, pool_id
);
144 TestMemCluster::Pool
*TestMemCluster::get_pool(const Mutex
& lock
,
146 for (auto &pool_pair
: m_pools
) {
147 if (pool_pair
.second
->pool_id
== pool_id
) {
148 return pool_pair
.second
;
154 TestMemCluster::Pool
*TestMemCluster::get_pool(const std::string
&pool_name
) {
155 Mutex::Locker
locker(m_lock
);
156 Pools::iterator iter
= m_pools
.find(pool_name
);
157 if (iter
!= m_pools
.end()) {
163 void TestMemCluster::allocate_client(uint32_t *nonce
, uint64_t *global_id
) {
164 Mutex::Locker
locker(m_lock
);
165 *nonce
= m_next_nonce
++;
166 *global_id
= m_next_global_id
++;
169 void TestMemCluster::deallocate_client(uint32_t nonce
) {
170 Mutex::Locker
locker(m_lock
);
171 m_blacklist
.erase(nonce
);
174 bool TestMemCluster::is_blacklisted(uint32_t nonce
) const {
175 Mutex::Locker
locker(m_lock
);
176 return (m_blacklist
.find(nonce
) != m_blacklist
.end());
179 void TestMemCluster::blacklist(uint32_t nonce
) {
180 m_watch_notify
.blacklist(nonce
);
182 Mutex::Locker
locker(m_lock
);
183 m_blacklist
.insert(nonce
);
186 void TestMemCluster::transaction_start(const ObjectLocator
& locator
) {
187 Mutex::Locker
locker(m_lock
);
188 while (m_transactions
.count(locator
)) {
189 m_transaction_cond
.Wait(m_lock
);
191 auto result
= m_transactions
.insert(locator
);
192 ceph_assert(result
.second
);
195 void TestMemCluster::transaction_finish(const ObjectLocator
& locator
) {
196 Mutex::Locker
locker(m_lock
);
197 size_t count
= m_transactions
.erase(locator
);
198 ceph_assert(count
== 1);
199 m_transaction_cond
.Signal();
202 } // namespace librados