struct copy_buffer_t { uint64_t offset, len; void *buf; }; struct meta_sector_t { uint64_t offset, len; int state; void *buf; int usage_count; }; struct flusher_sync_t { int ready_count; int state; }; class journal_flusher_t; // Journal flusher coroutine class journal_flusher_co { blockstore *bs; journal_flusher_t *flusher; int wait_state, wait_count; struct io_uring_sqe *sqe; struct ring_data_t *data; bool skip_copy; obj_ver_id cur; std::map::iterator dirty_it, dirty_start, dirty_end; std::vector v; std::vector::iterator it; int copy_count; uint64_t offset, len, submit_offset, submit_len, clean_loc, old_clean_loc, meta_sector, meta_pos; std::map::iterator meta_it; std::map::iterator repeat_it; std::map::iterator journal_used_it; std::function simple_callback_r, simple_callback_w; std::list::iterator cur_sync; friend class journal_flusher_t; public: journal_flusher_co(); void loop(); }; // Journal flusher itself class journal_flusher_t { int flusher_count; int sync_threshold; bool sync_required; journal_flusher_co *co; blockstore *bs; friend class journal_flusher_co; int journal_trim_counter, journal_trim_interval; void* journal_superblock; int active_flushers, active_until_sync; std::list syncs; std::map sync_to_repeat; std::map meta_sectors; std::deque flush_queue; std::map flush_versions; public: journal_flusher_t(int flusher_count, blockstore *bs); ~journal_flusher_t(); void loop(); bool is_active(); void enqueue_flush(obj_ver_id oid); void unshift_flush(obj_ver_id oid); };