@@ -102,12 +102,6 @@ class replicated_object_builder : public metastore::object_metadata_builder {
102102
103103private:
104104 friend class cloud_topics ::l1::replicated_metastore;
105- std::expected<
106- chunked_hash_map<
107- model::partition_id,
108- chunked_vector<metastore::object_metadata>>,
109- error>
110- release ();
111105
112106 struct partitioned_objects {
113107 chunked_hash_map<
@@ -196,33 +190,6 @@ replicated_object_builder::finish(
196190 return {};
197191}
198192
199- std::expected<
200- chunked_hash_map<
201- model::partition_id,
202- chunked_vector<metastore::object_metadata>>,
203- replicated_object_builder::error>
204- replicated_object_builder::release () {
205- for (const auto & [partition_id, partition_objects] : partitions_) {
206- if (!partition_objects.pending_objects_ .empty ()) {
207- return std::unexpected (error{" Unfinished objects remain" });
208- }
209- }
210-
211- chunked_hash_map<
212- model::partition_id,
213- chunked_vector<metastore::object_metadata>>
214- result;
215- for (auto & [partition_id, partition_objects] : partitions_) {
216- chunked_vector<metastore::object_metadata> metas;
217- for (auto & obj : partition_objects.finished_objects_ ) {
218- metas.push_back (std::move (obj));
219- }
220- result.emplace (partition_id, std::move (metas));
221- }
222-
223- partitions_.clear ();
224- return result;
225- }
226193} // anonymous namespace
227194
228195replicated_metastore::replicated_metastore (frontend& fe)
@@ -258,18 +225,19 @@ replicated_metastore::get_offsets(const model::topic_id_partition& tidp) {
258225
259226ss::future<std::expected<metastore::add_response, metastore::errc>>
260227replicated_metastore::add_objects (
261- std::unique_ptr< metastore::object_metadata_builder> builder,
228+ const metastore::object_metadata_builder& builder,
262229 const metastore::term_offset_map_t & terms) {
263- auto replicated_builder = std::unique_ptr<replicated_object_builder>(
264- static_cast <replicated_object_builder*>(builder.release ()));
265-
266- auto objects_result = replicated_builder->release ();
267- if (!objects_result.has_value ()) {
268- vlog (
269- cd_log.error ,
270- " Error while sending request: {}" ,
271- objects_result.error ());
272- co_return std::unexpected (metastore::errc::invalid_request);
230+ auto & replicated_builder = static_cast <const replicated_object_builder&>(
231+ builder);
232+
233+ for (const auto & [partition_id, partition_objects] :
234+ replicated_builder.partitions_ ) {
235+ if (!partition_objects.pending_objects_ .empty ()) {
236+ vlog (
237+ cd_log.error ,
238+ " Error while sending request: unfinished objects remain" );
239+ co_return std::unexpected (metastore::errc::invalid_request);
240+ }
273241 }
274242 chunked_hash_map<model::partition_id, term_state_update_t >
275243 partitioned_terms;
@@ -286,7 +254,8 @@ replicated_metastore::add_objects(
286254 }
287255 }
288256 add_response resp;
289- for (auto & [partition_id, partition_objects] : objects_result.value ()) {
257+ for (auto & [partition_id, partition_objects] :
258+ replicated_builder.partitions_ ) {
290259 auto terms_it = partitioned_terms.find (partition_id);
291260 if (terms_it == partitioned_terms.end ()) {
292261 // TODO: consider making this less strict, down to the STM layer?
@@ -300,7 +269,7 @@ replicated_metastore::add_objects(
300269 req.metastore_partition = partition_id;
301270 req.new_terms = std::move (terms_it->second );
302271 chunked_vector<new_object> new_objects;
303- for (auto & obj : partition_objects) {
272+ for (auto & obj : partition_objects. finished_objects_ ) {
304273 new_objects.emplace_back (meta_to_rpc_obj (obj));
305274 }
306275 req.new_objects = std::move (new_objects);
@@ -325,23 +294,25 @@ replicated_metastore::add_objects(
325294
326295ss::future<std::expected<void , metastore::errc>>
327296replicated_metastore::replace_objects (
328- std::unique_ptr<metastore::object_metadata_builder> builder) {
329- auto replicated_builder = std::unique_ptr<replicated_object_builder>(
330- static_cast <replicated_object_builder*>(builder.release ()));
331-
332- auto objects_result = replicated_builder->release ();
333- if (!objects_result) {
334- vlog (
335- cd_log.error ,
336- " Error while sending request: {}" ,
337- objects_result.error ());
338- co_return std::unexpected (metastore::errc::invalid_request);
297+ const metastore::object_metadata_builder& builder) {
298+ auto & replicated_builder = static_cast <const replicated_object_builder&>(
299+ builder);
300+
301+ for (const auto & [partition_id, partition_objects] :
302+ replicated_builder.partitions_ ) {
303+ if (!partition_objects.pending_objects_ .empty ()) {
304+ vlog (
305+ cd_log.error ,
306+ " Error while sending request: unfinished objects remain" );
307+ co_return std::unexpected (metastore::errc::invalid_request);
308+ }
339309 }
340- for (auto & [partition_id, partition_objects] : objects_result.value ()) {
310+ for (auto & [partition_id, partition_objects] :
311+ replicated_builder.partitions_ ) {
341312 rpc::replace_objects_request req;
342313 req.metastore_partition = partition_id;
343314 chunked_vector<new_object> new_objects;
344- for (auto & obj : partition_objects) {
315+ for (auto & obj : partition_objects. finished_objects_ ) {
345316 new_objects.emplace_back (meta_to_rpc_obj (obj));
346317 }
347318 req.new_objects = std::move (new_objects);
@@ -514,18 +485,19 @@ replicated_metastore::get_end_offset_for_term(
514485
515486ss::future<std::expected<void , metastore::errc>>
516487replicated_metastore::compact_objects (
517- std::unique_ptr< metastore::object_metadata_builder> builder,
488+ const metastore::object_metadata_builder& builder,
518489 const metastore::compaction_map_t & compaction_updates) {
519- auto replicated_builder = std::unique_ptr<replicated_object_builder>(
520- static_cast <replicated_object_builder*>(builder.release ()));
521-
522- auto objects_result = replicated_builder->release ();
523- if (!objects_result) {
524- vlog (
525- cd_log.error ,
526- " Error while sending request: {}" ,
527- objects_result.error ());
528- co_return std::unexpected (metastore::errc::invalid_request);
490+ auto & replicated_builder = static_cast <const replicated_object_builder&>(
491+ builder);
492+
493+ for (const auto & [partition_id, partition_objects] :
494+ replicated_builder.partitions_ ) {
495+ if (!partition_objects.pending_objects_ .empty ()) {
496+ vlog (
497+ cd_log.error ,
498+ " Error while sending request: unfinished objects remain" );
499+ co_return std::unexpected (metastore::errc::invalid_request);
500+ }
529501 }
530502 chunked_hash_map<
531503 model::partition_id,
@@ -537,7 +509,7 @@ replicated_metastore::compact_objects(
537509 vlog (cd_log.warn , " Unable to get metastore partition for {}" , tp);
538510 co_return std::unexpected (errc::transport_error);
539511 }
540- if (!objects_result-> contains (*metastore_partition)) {
512+ if (!replicated_builder. partitions_ . contains (*metastore_partition)) {
541513 vlog (
542514 cd_log.error ,
543515 " Expected objects for partition {}" ,
@@ -547,11 +519,12 @@ replicated_metastore::compact_objects(
547519 compaction_updates_by_partition[*metastore_partition].emplace (
548520 tp, meta_to_rpc_compact_update (update));
549521 }
550- for (auto & [partition_id, partition_objects] : objects_result.value ()) {
522+ for (auto & [partition_id, partition_objects] :
523+ replicated_builder.partitions_ ) {
551524 rpc::replace_objects_request req;
552525 req.metastore_partition = partition_id;
553526 chunked_vector<new_object> new_objects;
554- for (auto & obj : partition_objects) {
527+ for (auto & obj : partition_objects. finished_objects_ ) {
555528 new_objects.emplace_back (meta_to_rpc_obj (obj));
556529 }
557530 req.new_objects = std::move (new_objects);
0 commit comments