From bf2e0745e1fe580088f7f6cc99f99cf4c9cd9081 Mon Sep 17 00:00:00 2001 From: Jon Bailey Date: Tue, 11 Feb 2025 09:59:24 +0000 Subject: [PATCH] erasure-code: Add plugin flag to indicate if plugins require sub chunks Signed-off-by: Jon Bailey --- src/erasure-code/ErasureCodeInterface.h | 5 +++++ src/erasure-code/clay/ErasureCodeClay.h | 4 ++-- src/test/erasure-code/TestErasureCodePlugins.cc | 13 +++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/erasure-code/ErasureCodeInterface.h b/src/erasure-code/ErasureCodeInterface.h index f57c0a1d41f..2be9387f2d1 100644 --- a/src/erasure-code/ErasureCodeInterface.h +++ b/src/erasure-code/ErasureCodeInterface.h @@ -565,6 +565,10 @@ namespace ceph { * data chunk and the coding parity chunks. */ FLAG_EC_PLUGIN_PARITY_DELTA_OPTIMIZATION = 1<<4, + /* This plugin requires sub-chunks (at the time of writing this was only + * clay). Other plugins will not process the overhead of stub sub-chunks. + */ + FLAG_EC_PLUGIN_REQUIRE_SUB_CHUNKS = 1<<5, }; static const char *get_optimization_flag_name(const plugin_flags flag) { switch (flag) { @@ -573,6 +577,7 @@ namespace ceph { case FLAG_EC_PLUGIN_ZERO_INPUT_ZERO_OUTPUT_OPTIMIZATION: return "zeroinout"; case FLAG_EC_PLUGIN_ZERO_PADDING_OPTIMIZATION: return "zeropadding"; case FLAG_EC_PLUGIN_PARITY_DELTA_OPTIMIZATION: return "paritydelta"; + case FLAG_EC_PLUGIN_REQUIRE_SUB_CHUNKS: return "requiresubchunks"; default: return "???"; } } diff --git a/src/erasure-code/clay/ErasureCodeClay.h b/src/erasure-code/clay/ErasureCodeClay.h index 77216cd922e..500ff2d5eff 100644 --- a/src/erasure-code/clay/ErasureCodeClay.h +++ b/src/erasure-code/clay/ErasureCodeClay.h @@ -52,10 +52,10 @@ public: // the corner case of m = 1 return FLAG_EC_PLUGIN_PARTIAL_READ_OPTIMIZATION | FLAG_EC_PLUGIN_PARTIAL_WRITE_OPTIMIZATION | - FLAG_EC_PLUGIN_ZERO_INPUT_ZERO_OUTPUT_OPTIMIZATION; + FLAG_EC_PLUGIN_REQUIRE_SUB_CHUNKS; } return FLAG_EC_PLUGIN_PARTIAL_READ_OPTIMIZATION | - FLAG_EC_PLUGIN_ZERO_INPUT_ZERO_OUTPUT_OPTIMIZATION; + FLAG_EC_PLUGIN_REQUIRE_SUB_CHUNKS; } unsigned int get_chunk_count() const override { diff --git a/src/test/erasure-code/TestErasureCodePlugins.cc b/src/test/erasure-code/TestErasureCodePlugins.cc index cd656c8f5f8..dac02af88eb 100644 --- a/src/test/erasure-code/TestErasureCodePlugins.cc +++ b/src/test/erasure-code/TestErasureCodePlugins.cc @@ -455,6 +455,19 @@ TEST_P(PluginTest,MinimumGranularity) EXPECT_EQ(erasure_code->get_minimum_granularity(), 1); } } +TEST_P(PluginTest,SubChunkSupport) +{ + initialize(); + + /* If any configurations of the plugin support !=1 sub chunk, then sub-chunk + * support must be enabled. Setting the flag unnecessarily is not-ideal, but + * is a performance penalty. + */ + if (erasure_code->get_sub_chunk_count() != 1) { + ASSERT_TRUE((erasure_code->get_supported_optimizations() & + ErasureCodeInterface::FLAG_EC_PLUGIN_REQUIRE_SUB_CHUNKS) != 0); + } +} INSTANTIATE_TEST_SUITE_P( PluginTests, PluginTest, -- 2.39.5