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:
Benny Halevy
2020-11-22 17:39:04 +02:00
parent f7d0ae3d10
commit 8cebe7776f
3 changed files with 14 additions and 9 deletions

View File

@@ -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();

View File

@@ -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; }

View File

@@ -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.