171 std::optional<Checkpoint>
load_latest(
const std::string& thread_id)
override;
172 std::optional<Checkpoint>
load_by_id(
const std::string&
id)
override;
173 std::vector<Checkpoint>
list(
const std::string& thread_id,
int limit = 100)
override;
177 const std::string& parent_checkpoint_id,
179 std::vector<PendingWrite>
get_writes(
const std::string& thread_id,
180 const std::string& parent_checkpoint_id)
override;
182 const std::string& parent_checkpoint_id)
override;
196 asio::awaitable<void> save_async(
const Checkpoint& cp)
override;
197 asio::awaitable<std::optional<Checkpoint>> load_latest_async(
198 const std::string& thread_id)
override;
199 asio::awaitable<std::optional<Checkpoint>> load_by_id_async(
const std::string&
id)
override;
200 asio::awaitable<std::vector<Checkpoint>> list_async(
const std::string& thread_id,
201 int limit = 100)
override;
202 asio::awaitable<void> delete_thread_async(
const std::string& thread_id)
override;
204 asio::awaitable<void> put_writes_async(
const std::string& thread_id,
205 const std::string& parent_checkpoint_id,
207 asio::awaitable<std::vector<PendingWrite>> get_writes_async(
208 const std::string& thread_id,
const std::string& parent_checkpoint_id)
override;
209 asio::awaitable<void> clear_writes_async(
const std::string& thread_id,
210 const std::string& parent_checkpoint_id)
override;
214 asio::awaitable<bool> requires_managed_budget_async(std::string thread_id)
override;
216 std::shared_ptr<OwnedManagedBudgetLease> acquire_managed_budget_lease(
217 const ManagedBudgetLeaseScope& scope,
const std::string& expected_checkpoint_id,
218 const std::string& expected_checkpoint_commitment)
override;
219 asio::awaitable<std::shared_ptr<OwnedManagedBudgetLease>> acquire_managed_budget_lease_async(
220 ManagedBudgetLeaseScope scope, std::string expected_checkpoint_id,
221 std::string expected_checkpoint_commitment)
override;
223 const std::shared_ptr<OwnedManagedBudgetLease>& lease,
const std::string& effect_id,
224 std::uint64_t exact_claim_amount,
const std::string& prepared_request_digest)
override;
225 asio::awaitable<ManagedBudgetEffectReceipt> begin_managed_budget_effect_async(
226 std::shared_ptr<OwnedManagedBudgetLease> lease, std::string effect_id,
227 std::uint64_t exact_claim_amount, std::string prepared_request_digest)
override;
228 void settle_managed_budget_effect(
const std::shared_ptr<OwnedManagedBudgetLease>& lease,
230 const UsageAccumulator::AuthoritySnapshot& authority)
override;
231 asio::awaitable<void> settle_managed_budget_effect_async(
233 sp::runtime::Result genuine_outcome, UsageAccumulator::AuthoritySnapshot authority)
override;
234 void publish_managed_budget_checkpoint(
235 const std::shared_ptr<OwnedManagedBudgetLease>& lease,
const Checkpoint& checkpoint)
override;
236 asio::awaitable<void> publish_managed_budget_checkpoint_async(
237 std::shared_ptr<OwnedManagedBudgetLease> lease,
Checkpoint checkpoint)
override;
238 void release_managed_budget_lease(
const std::shared_ptr<OwnedManagedBudgetLease>& lease)
override;
239 asio::awaitable<void> release_managed_budget_lease_async(
240 std::shared_ptr<OwnedManagedBudgetLease> lease)
override;
254 struct PoolOnlyTag {};
257 void ensure_schema();
261 template <
typename Fn>
262 auto with_conn(Fn&& fn);
273 template <
typename Fn>
274 auto with_conn_async(Fn& fn) ->
decltype(fn(std::declval<pg_conn*>()));
278 size_t acquire_slot();
279 asio::awaitable<size_t> acquire_slot_async();
280 void release_slot(
size_t idx);
281 void rebuild_slot(
size_t idx);
282 asio::awaitable<void> rebuild_slot_async(
size_t idx);
283 size_t waiter_count_for_test();
284 static asio::awaitable<bool> wait_socket_either_for_test(
int fd);
285 static void set_async_connection_test_seams(
int poll_delay_ms,
int timeout_ms);
286 static int async_connection_timeout_ms_for_test(
const std::string& conn_str);
290 std::string conn_str_;
294 std::vector<std::unique_ptr<PgConn>> pool_;
299 std::queue<size_t> free_;
300 std::mutex pool_mutex_;
301 std::condition_variable pool_cv_;
306 std::atomic<size_t> reconnect_count_{0};
308 friend class test_access::PostgresCheckpointStoreTestAccess;
Persistent CheckpointStore backed by PostgreSQL via libpq.
PostgresCheckpointStore(const std::string &conn_str, size_t pool_size=8)
std::vector< PendingWrite > get_writes(const std::string &thread_id, const std::string &parent_checkpoint_id) override
Load all pending writes attached to a parent checkpoint.
void save(const Checkpoint &cp) override
Save a checkpoint.
void clear_writes(const std::string &thread_id, const std::string &parent_checkpoint_id) override
Discard pending writes for a parent checkpoint once its successor super-step has been fully committed...
bool requires_managed_budget(const std::string &thread_id) override
Indexed denial obligation; does not authenticate or authorize a bank.
size_t reconnect_count() const
Number of times a pool slot's connection was replaced after a broken connection or an interrupted asy...
void delete_thread(const std::string &thread_id) override
Delete all checkpoints for a thread.
std::vector< Checkpoint > list(const std::string &thread_id, int limit=100) override
List checkpoints for a thread, most recently saved first, one entry per ID; the first entry is load_l...
void drop_schema()
Drop checkpoint data tables, retaining obligations, migration markers, currency heads and write-ahead...
std::optional< Checkpoint > load_by_id(const std::string &id) override
Load a checkpoint by its unique ID.
std::optional< Checkpoint > load_latest(const std::string &thread_id) override
Load the most recently saved checkpoint for a thread.
void put_writes(const std::string &thread_id, const std::string &parent_checkpoint_id, const PendingWrite &write) override
Record a successful node execution within an in-progress super-step.
size_t blob_count()
Test helper: count rows in neograph_checkpoint_blobs.