-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjiffy.go
103 lines (89 loc) · 2.47 KB
/
jiffy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package jiffy
import (
"context"
"io"
"github.com/filecoin-project/go-state-types/abi"
"github.com/ipfs/go-log/v2"
)
var (
logger = log.Logger("jiffy")
_ Segmentor = (*Jiffy)(nil)
_ Replicator = (*Jiffy)(nil)
_ Retriever = (*Jiffy)(nil)
)
type (
Jiffy struct {
*options
offloader Offloader
segmentor Segmentor
replicator Replicator
retriever Retriever
dealer Dealer
}
)
func New(o ...Option) (*Jiffy, error) {
var err error
var j Jiffy
if j.options, err = newOptions(o...); err != nil {
return nil, err
}
if s, err := newHeadlessCarSegmentor(&j); err != nil {
return nil, err
} else {
j.segmentor = s
// Use the headless segmentor as retriever until we implement remote HTTP piece retrieval with local fallback.
// Using the segmentor in this way essentially means we get local retrieval only.
// TODO replace with remote retriever with local retrieval fallback.
j.retriever = s
}
if j.replicator, err = newSimpleReplicator(&j); err != nil {
return nil, err
}
if j.dealer, err = newStorageMarketDealer_1_2_0(&j); err != nil {
return nil, err
}
if j.offloader, err = newHttpOffloader(&j); err != nil {
return nil, err
}
return &j, nil
}
func (j *Jiffy) Start(ctx context.Context) error {
type starter interface {
Start(ctx context.Context) error
}
for _, component := range []any{j.segmentor, j.replicator, j.replicator, j.offloader} {
if svc, ok := component.(starter); ok {
if err := svc.Start(ctx); err != nil {
return err
}
}
}
return nil
}
func (j *Jiffy) Retrieve(ctx context.Context, info abi.PieceInfo) (io.ReadSeekCloser, error) {
return j.retriever.Retrieve(ctx, info)
}
func (j *Jiffy) GetReplicas(ctx context.Context, info abi.PieceInfo) ([]Replica, error) {
return j.replicator.GetReplicas(ctx, info)
}
func (j *Jiffy) Segment(ctx context.Context, closer io.ReadCloser) (*Segment, error) {
return j.segmentor.Segment(ctx, closer)
}
func (j *Jiffy) GetSegment(ctx context.Context, info abi.PieceInfo) (*Segment, error) {
return j.segmentor.GetSegment(ctx, info)
}
func (j *Jiffy) ListSegments(ctx context.Context) ([]*Segment, error) {
return j.segmentor.ListSegments(ctx)
}
func (j *Jiffy) Shutdown(ctx context.Context) error {
type shutdowner interface {
Shutdown(ctx context.Context) error
}
var err error // TODO use multierr
for _, component := range []any{j.segmentor, j.replicator, j.replicator, j.offloader} {
if svc, ok := component.(shutdowner); ok {
err = svc.Shutdown(ctx)
}
}
return err
}