24
24
#include " model/namespace.h"
25
25
#include " random/generators.h"
26
26
#include " ssx/future-util.h"
27
+ #include " utils/retry_chain_node.h"
27
28
28
29
#include < seastar/core/shared_ptr.hh>
29
30
#include < seastar/util/log.hh>
30
31
32
+ #include < chrono>
33
+
34
+ using namespace std ::chrono_literals;
35
+
31
36
namespace {
32
37
ss::logger lg (" reconciler" );
33
38
@@ -535,6 +540,37 @@ reconciler::add_object_metadata(
535
540
co_return std::expected<void , reconcile_error>{};
536
541
}
537
542
543
+ ss::future<std::expected<l1::metastore::add_response, l1::metastore::errc>>
544
+ reconciler::add_objects_with_retry (
545
+ std::unique_ptr<l1::metastore::object_metadata_builder> meta_builder,
546
+ l1::metastore::term_offset_map_t terms) {
547
+ static constexpr auto timeout = 5s;
548
+ static constexpr auto backoff = 100ms;
549
+
550
+ retry_chain_node rtc (_as, ss::lowres_clock::now () + timeout, backoff);
551
+ retry_chain_logger ctxlog (lg, rtc, " add_objects" );
552
+ for (auto permit = rtc.retry (); permit.is_allowed ; permit = rtc.retry ()) {
553
+ auto add_result = co_await _metastore->add_objects (
554
+ *meta_builder, terms);
555
+
556
+ if (add_result.has_value ()) {
557
+ co_return std::move (add_result).value ();
558
+ }
559
+
560
+ if (add_result.error () != l1::metastore::errc::transport_error) {
561
+ vlog (
562
+ lg.error ,
563
+ " Non-retryable error adding objects to the L1 metastore: {}" ,
564
+ add_result.error ());
565
+ co_return std::unexpected (add_result.error ());
566
+ }
567
+
568
+ co_await ss::sleep_abortable (permit.delay , rtc.root_abort_source ());
569
+ }
570
+
571
+ co_return std::unexpected (l1::metastore::errc::transport_error);
572
+ }
573
+
538
574
ss::future<std::expected<void , reconcile_error>> reconciler::commit_objects (
539
575
const chunked_vector<built_object_metadata>& objects,
540
576
std::unique_ptr<l1::metastore::object_metadata_builder> meta_builder) {
@@ -552,11 +588,11 @@ ss::future<std::expected<void, reconcile_error>> reconciler::commit_objects(
552
588
}
553
589
}
554
590
555
- auto add_objects_result = co_await _metastore-> add_objects (
556
- * meta_builder, terms);
591
+ auto add_objects_result = co_await add_objects_with_retry (
592
+ std::move ( meta_builder), std::move ( terms) );
557
593
if (!add_objects_result.has_value ()) {
558
594
vlog (
559
- lg.error ,
595
+ lg.warn ,
560
596
" Failed to add objects to the L1 metastore: {}" ,
561
597
add_objects_result.error ());
562
598
// TODO: The objects have been uploaded. The reconciler could
0 commit comments