#include <fstream>
#include <iostream>
#include <string>
+#include <algorithm>
#define dout_subsys ceph_subsys_rgw_dedup
std::ifstream f(path);
if (!f.is_open()) {
ldpp_dout(dpp, 1) << __func__ << ":: failed to open filter file: " << path << dendl;
- return ENOENT;
+ return -ENOENT;
}
std::string line;
else {
ldpp_dout(dpp, 1) << __func__ << "::" << path << "::" << line_num
<< "::invalid name '" << name << "'" << dendl;
- return EINVAL;
+ return -EINVAL;
}
}
}
ldpp_dout(dpp, 1) << __func__
<< ":: --allow-bucket-list and --deny-bucket-list are mutually exclusive"
<< dendl;
- d_errcode = EINVAL;
+ d_errcode = -EINVAL;
return;
}
if (!allow_sc_file.empty() && !deny_sc_file.empty()) {
ldpp_dout(dpp, 1) << __func__
<< ":: --allow-storage-class-list and --deny-storage-class-list are mutually exclusive"
<< dendl;
- d_errcode = EINVAL;
+ d_errcode = -EINVAL;
return;
}
#include "include/encoding.h"
#include <string>
#include <unordered_set>
+#include <vector>
namespace rgw::dedup {
const std::string& deny_sc_file,
const DoutPrefixProvider* dpp);
- // Returns 0 on success, errno if construction failed.
+ // Returns 0 on success, negative errno if construction failed.
int errcode() const { return d_errcode; }
// Returns true if any filter dimension is active.
private:
// Read filter file: one name per line, '#' starts a comment, whitespace trimmed
- // On success returns 0 and populates name_set; on error returns errno code.
+ // On success returns 0 and populates name_set; on error returns negative errno.
static int read_filter_file(const std::string& path,
std::unordered_set<std::string>& name_set,
int (*validator)(const std::string&),
else {
cerr << "ERROR: Failed reading stat counters" << std::endl;
}
- return ret;
+ return -ret;
}
if (opt_cmd == OPT::DEDUP_THROTTLE) {
if (throttle_stat) {
encode(throttle_msg, urgent_msg_bl);
- return cluster::dedup_control_bl(store, dpp(), urgent_msg, urgent_msg_bl);
+ return -cluster::dedup_control_bl(store, dpp(), urgent_msg, urgent_msg_bl);
}
if (unlikely(!have_max_bucket_index_ops && !have_max_metadata_ops)) {
}
encode(throttle_msg, urgent_msg_bl);
- return cluster::dedup_control_bl(store, dpp(), urgent_msg, urgent_msg_bl);
+ return -cluster::dedup_control_bl(store, dpp(), urgent_msg, urgent_msg_bl);
}
if (opt_cmd == OPT::DEDUP_ABORT ||
else {
urgent_msg = URGENT_MSG_RESUME;
}
- return cluster::dedup_control(store, dpp(), urgent_msg);
+ return -cluster::dedup_control(store, dpp(), urgent_msg);
}
if (opt_cmd == OPT::DEDUP_EXEC || opt_cmd == OPT::DEDUP_ESTIMATE) {
int filter_err = dedup_filter.errcode();
if (filter_err != 0) {
cerr << "ERROR: failed to build dedup filter: "
- << cpp_strerror(filter_err) << std::endl;
- return filter_err;
+ << cpp_strerror(-filter_err) << std::endl;
+ return -filter_err;
}
int ret = cluster::dedup_restart_scan(store, dedup_type, dpp(),
dedup_filter.is_active() ? &dedup_filter : nullptr);
+ // reverse negative errno codes
+ ret = -ret;
if (ret == 0) {
std::cout << "Dedup was restarted successfully" << std::endl;
}
# create files in range [8MB, 32MB] aligned on RADOS_OBJ_SIZE
gen_files_in_range(files, num_files, 8*MB, 32*MB)
- bucket_cp= gen_bucket_name()
+ bucket_cp=gen_bucket_name()
bucket_names=[]
conns=[]
+ conn=None
try:
conn = get_single_connection()
conn.create_bucket(Bucket=bucket_cp)
finally:
# cleanup must be executed even after a failure
- delete_bucket_with_all_objects(bucket_cp, conn)
- if len(bucket_names) > 0:
- cleanup_all_buckets(bucket_names, conns)
+ if conn:
+ delete_bucket_with_all_objects(bucket_cp, conn)
+ if len(bucket_names) > 0:
+ cleanup_all_buckets(bucket_names, conns)
+
+ result = admin(['gc', 'process', '--include-all'])
+ assert result[1] == 0
+ else:
+ cleanup_local()
#-------------------------------------------------------------------------------
@pytest.mark.basic_test