large_data_handler: maybe_delete_large_data_entries: accept shared_sstable
Since the actual deletion if the large data entries is done in the background, and we don't captures the shared_sstable, we can safely pass it to maybe_delete_large_data_entries when deleting the sstable in sstable::unlink and it will be release as soon as maybe_delete_large_data_entries returns. Signed-off-by: Benny Halevy <bhalevy@scylladb.com>
This commit is contained in:
@@ -77,24 +77,28 @@ template <typename T> static std::string key_to_str(const T& key, const schema&
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
future<> large_data_handler::maybe_delete_large_data_entries(const schema& s, sstring filename, uint64_t data_size) {
|
||||
future<> large_data_handler::maybe_delete_large_data_entries(sstables::shared_sstable sst) {
|
||||
assert(running());
|
||||
auto schema = sst->get_schema();
|
||||
auto filename = sst->get_filename();
|
||||
auto data_size = sst->data_size();
|
||||
|
||||
future<> large_partitions = make_ready_future<>();
|
||||
if (__builtin_expect(data_size > _partition_threshold_bytes, false)) {
|
||||
large_partitions = with_sem([&s, filename, this] () mutable {
|
||||
return delete_large_data_entries(s, std::move(filename), db::system_keyspace::LARGE_PARTITIONS);
|
||||
large_partitions = with_sem([schema, filename, this] () mutable {
|
||||
return delete_large_data_entries(*schema, std::move(filename), db::system_keyspace::LARGE_PARTITIONS);
|
||||
});
|
||||
}
|
||||
future<> large_rows = make_ready_future<>();
|
||||
if (__builtin_expect(data_size > _row_threshold_bytes, false)) {
|
||||
large_rows = with_sem([&s, filename, this] () mutable {
|
||||
return delete_large_data_entries(s, std::move(filename), db::system_keyspace::LARGE_ROWS);
|
||||
large_rows = with_sem([schema, filename, this] () mutable {
|
||||
return delete_large_data_entries(*schema, std::move(filename), db::system_keyspace::LARGE_ROWS);
|
||||
});
|
||||
}
|
||||
future<> large_cells = make_ready_future<>();
|
||||
if (__builtin_expect(data_size > _cell_threshold_bytes, false)) {
|
||||
large_cells = with_sem([&s, filename, this] () mutable {
|
||||
return delete_large_data_entries(s, std::move(filename), db::system_keyspace::LARGE_CELLS);
|
||||
large_cells = with_sem([schema, filename, this] () mutable {
|
||||
return delete_large_data_entries(*schema, std::move(filename), db::system_keyspace::LARGE_CELLS);
|
||||
});
|
||||
}
|
||||
return when_all(std::move(large_partitions), std::move(large_rows), std::move(large_cells)).discard_result();
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <cstdint>
|
||||
#include "schema_fwd.hh"
|
||||
#include "system_keyspace.hh"
|
||||
#include "sstables/shared_sstable.hh"
|
||||
|
||||
namespace sstables {
|
||||
class sstable;
|
||||
@@ -113,7 +114,7 @@ public:
|
||||
return make_ready_future<bool>(false);
|
||||
}
|
||||
|
||||
future<> maybe_delete_large_data_entries(const schema& s, sstring filename, uint64_t data_size);
|
||||
future<> maybe_delete_large_data_entries(sstables::shared_sstable sst);
|
||||
|
||||
const large_data_handler::stats& stats() const { return _stats; }
|
||||
|
||||
|
||||
@@ -2661,7 +2661,7 @@ sstable::unlink()
|
||||
});
|
||||
|
||||
name = get_filename();
|
||||
fut = get_large_data_handler().maybe_delete_large_data_entries(*get_schema(), name, data_size());
|
||||
fut = get_large_data_handler().maybe_delete_large_data_entries(shared_from_this());
|
||||
auto update_large_data_fut = fut.then_wrapped([name = std::move(name)] (future<> f) {
|
||||
if (f.failed()) {
|
||||
// Just log and ignore failures to delete large data entries.
|
||||
|
||||
Reference in New Issue
Block a user