Module Async_smtp__.Cache.Make

Parameters

Signature

module Status : Status_intf with module Key := R.Key
type t
val init : config:Config.t ‑> t
val status : t ‑> Status.t
val config : t ‑> Config.t
val with_ : ?⁠open_timeout:Core.Time.Span.t ‑> ?⁠give_up:unit Async.Deferred.t ‑> t ‑> R.Args.t ‑> f:(R.t ‑> 'a Async.Deferred.t) ‑> 'a Async.Deferred.Or_error.t

with_ t args ~f calls f resource where resource is either:

1) An existing cached resource that was opened with args' such that R.Args.Key.equal (R.Args.key args) (R.Args.key args') = true 2) A newly opened resource created by R.open_ args, respecting the limits of t.config

Returns an error if:

If f raises, the exception is not caught, but the resource will be closed and the Cache will remain in a working state (no resources are lost).

val with_' : ?⁠open_timeout:Core.Time.Span.t ‑> ?⁠give_up:unit Async.Deferred.t ‑> t ‑> R.Args.t ‑> f:(R.t ‑> 'a Async.Deferred.t) ‑> [ `Ok of 'a | `Gave_up_waiting_for_resource | `Error_opening_resource of Core.Error.t | `Cache_is_closed ] Async.Deferred.t

Like with_ but classify the different errors

val with_any : ?⁠open_timeout:Core.Time.Span.t ‑> ?⁠give_up:unit Async.Deferred.t ‑> t ‑> R.Args.t list ‑> f:(R.t ‑> 'a Async.Deferred.t) ‑> (R.Args.t * 'a) Async.Deferred.Or_error.t

Like with_ and with_' except f is run on the first matching available resource (or the first resource that has availability to be opened). Preference is given towards those earlier in args_list when possible

val with_any' : ?⁠open_timeout:Core.Time.Span.t ‑> ?⁠give_up:unit Async.Deferred.t ‑> t ‑> R.Args.t list ‑> f:(R.t ‑> 'a Async.Deferred.t) ‑> [ `Ok of R.Args.t * 'a | `Error_opening_resource of R.Args.t * Core.Error.t | `Gave_up_waiting_for_resource | `Cache_is_closed ] Async.Deferred.t
val with_any_loop : ?⁠open_timeout:Core.Time.Span.t ‑> ?⁠give_up:unit Async.Deferred.t ‑> t ‑> R.Args.t list ‑> f:(R.t ‑> 'a Async.Deferred.t) ‑> [ `Ok of R.Args.t * 'a | `Error_opening_all_resources of (R.Args.t * Core.Error.t) list | `Gave_up_waiting_for_resource | `Cache_is_closed ] Async.Deferred.t

Tries with_any' in a loop (removing args that have open errors) until receiving an `Ok, or until it has failed to open all resources in args_list.

val close_started : t ‑> bool
val close_finished : t ‑> unit Async.Deferred.t
val close_and_flush : t ‑> unit Async.Deferred.t

Close all currently open resources and prevent the creation of new ones. All subsequent calls to with_ and immediate fail with `Cache_is_closed. Any jobs that are waiting for a connection will return with `Cache_is_closed. The returned Deferred.t is determined when all jobs have finished running and all resources have been closed.