1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab ft=cpp
#include "rgw_sal_rados.h"
#include "include/types.h"
#include "rgw_user.h"
// until everything is moved from rgw_common
#include "rgw_common.h"
#define dout_subsys ceph_subsys_rgw
using namespace std;
int rgw_sync_all_stats(const DoutPrefixProvider *dpp,
optional_yield y, rgw::sal::Driver* driver,
const rgw_owner& owner, const std::string& tenant)
{
size_t max_entries = dpp->get_cct()->_conf->rgw_list_buckets_max_chunk;
rgw::sal::BucketList listing;
int ret = 0;
do {
ret = driver->list_buckets(dpp, owner, tenant, listing.next_marker,
string(), max_entries, false, listing, y);
if (ret < 0) {
ldpp_dout(dpp, 0) << "failed to list buckets: " << cpp_strerror(ret) << dendl;
return ret;
}
for (auto& ent : listing.buckets) {
std::unique_ptr<rgw::sal::Bucket> bucket;
ret = driver->load_bucket(dpp, ent.bucket, &bucket, y);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: could not read bucket info: bucket=" << bucket << " ret=" << ret << dendl;
continue;
}
ret = bucket->sync_owner_stats(dpp, y, &ent);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: could not sync bucket stats: ret=" << ret << dendl;
return ret;
}
ret = bucket->check_bucket_shards(dpp, ent.count, y);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR in check_bucket_shards: " << cpp_strerror(-ret)<< dendl;
}
}
} while (!listing.next_marker.empty());
ret = driver->complete_flush_stats(dpp, y, owner);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: failed to complete syncing owner stats: ret=" << ret << dendl;
return ret;
}
return 0;
}
int rgw_user_get_all_buckets_stats(const DoutPrefixProvider *dpp,
rgw::sal::Driver* driver,
rgw::sal::User* user,
map<string, bucket_meta_entry>& buckets_usage_map,
optional_yield y)
{
size_t max_entries = dpp->get_cct()->_conf->rgw_list_buckets_max_chunk;
rgw::sal::BucketList listing;
do {
int ret = driver->list_buckets(dpp, user->get_id(), user->get_tenant(),
listing.next_marker, string(),
max_entries, false, listing, y);
if (ret < 0) {
ldpp_dout(dpp, 0) << "failed to read user buckets: ret=" << ret << dendl;
return ret;
}
for (const auto& ent : listing.buckets) {
bucket_meta_entry entry;
entry.size = ent.size;
entry.size_rounded = ent.size_rounded;
entry.creation_time = ent.creation_time;
entry.count = ent.count;
buckets_usage_map.emplace(ent.bucket.name, entry);
}
} while (!listing.next_marker.empty());
return 0;
}
int rgw_validate_tenant_name(const string& t)
{
struct tench {
static bool is_good(char ch) {
return isalnum(ch) || ch == '_';
}
};
std::string::const_iterator it =
std::find_if_not(t.begin(), t.end(), tench::is_good);
return (it == t.end())? 0: -ERR_INVALID_TENANT_NAME;
}
/**
* Get the anonymous (ie, unauthenticated) user info.
*/
void rgw_get_anon_user(RGWUserInfo& info)
{
info.user_id = RGW_USER_ANON_ID;
info.display_name.clear();
info.access_keys.clear();
}
|