carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package hostbox
2
3import (
4 "context"
5 "io"
6 "sync"
7
8 "github.com/carlosframework/platform/internal/lease"
9)
10
11// RequestStore bounds complete SDK operations, including retries. Check must
12// inspect current captured authority and aggregate lease health. The supplied
13// context must also be cancelled by the operation owner on lease loss.
14type RequestStore struct {
15 Store lease.VersionedStore
16 Check func(context.Context) error
17}
18
19func (s RequestStore) request(ctx context.Context) (context.Context, context.CancelFunc, error) {
20 if ctx == nil || s.Store == nil || s.Check == nil {
21 return nil, nil, ErrUnsupported
22 }
23 bounded, cancel := context.WithTimeout(ctx, RequestLimit)
24 if err := s.Check(bounded); err != nil {
25 cancel()
26 return nil, nil, err
27 }
28 if err := bounded.Err(); err != nil {
29 cancel()
30 return nil, nil, err
31 }
32 return bounded, cancel, nil
33}
34func (s RequestStore) ListVersions(ctx context.Context, bucket, prefix string) ([]lease.ObjectVersion, error) {
35 ctx, cancel, err := s.request(ctx)
36 if err != nil {
37 return nil, err
38 }
39 defer cancel()
40 return s.Store.ListVersions(ctx, bucket, prefix)
41}
42func (s RequestStore) GetVersion(ctx context.Context, bucket, key, version string) ([]byte, error) {
43 ctx, cancel, err := s.request(ctx)
44 if err != nil {
45 return nil, err
46 }
47 defer cancel()
48 return s.Store.GetVersion(ctx, bucket, key, version)
49}
50func (s RequestStore) OpenVersion(ctx context.Context, bucket, key, version string) (io.ReadCloser, error) {
51 ctx, cancel, err := s.request(ctx)
52 if err != nil {
53 return nil, err
54 }
55 r, err := s.Store.OpenVersion(ctx, bucket, key, version)
56 if err != nil {
57 cancel()
58 return nil, err
59 }
60 if r == nil {
61 cancel()
62 return nil, ErrUnsupported
63 }
64 return &requestReader{ReadCloser: r, cancel: cancel}, nil
65}
66func (s RequestStore) CopyVersion(ctx context.Context, sb, sk, sv, db, dk string, createOnly bool) (string, string, error) {
67 ctx, cancel, err := s.request(ctx)
68 if err != nil {
69 return "", "", err
70 }
71 defer cancel()
72 return s.Store.CopyVersion(ctx, sb, sk, sv, db, dk, createOnly)
73}
74func (s RequestStore) DeleteVersion(ctx context.Context, bucket, key, version string) error {
75 ctx, cancel, err := s.request(ctx)
76 if err != nil {
77 return err
78 }
79 defer cancel()
80 return s.Store.DeleteVersion(ctx, bucket, key, version)
81}
82func (s RequestStore) PutIfAbsent(ctx context.Context, bucket, key string, body []byte) (string, error) {
83 ctx, cancel, err := s.request(ctx)
84 if err != nil {
85 return "", err
86 }
87 defer cancel()
88 return s.Store.PutIfAbsent(ctx, bucket, key, body)
89}
90
91type requestReader struct {
92 io.ReadCloser
93 cancel context.CancelFunc
94 once sync.Once
95}
96
97func (r *requestReader) Close() error { err := r.ReadCloser.Close(); r.once.Do(r.cancel); return err }
98
99var _ lease.VersionedStore = RequestStore{}
100