diff --git a/cmd/reflector.go b/cmd/reflector.go index e411781..869d757 100644 --- a/cmd/reflector.go +++ b/cmd/reflector.go @@ -59,12 +59,12 @@ func reflectorCmd(cmd *cobra.Command, args []string) { case "tcp": blobStore = peer.NewStore(peer.StoreOpts{ Address: reflectorServerAddress + ":" + reflectorServerPort, - Timeout: 30 * time.Second, + Timeout: 10 * time.Second, }) case "udp": blobStore = quic.NewStore(quic.StoreOpts{ Address: reflectorServerAddress + ":" + reflectorServerPort, - Timeout: 30 * time.Second, + Timeout: 10 * time.Second, }) } } else { diff --git a/peer/store.go b/peer/store.go index c5d3d5a..3857426 100644 --- a/peer/store.go +++ b/peer/store.go @@ -10,8 +10,7 @@ import ( // Store is a blob store that gets blobs from a peer. // It satisfies the store.BlobStore interface but cannot put or delete blobs. type Store struct { - client *Client - connErr error + opts StoreOpts } // StoreOpts allows to set options for a new Store. @@ -22,27 +21,33 @@ type StoreOpts struct { // NewStore makes a new peer store. func NewStore(opts StoreOpts) *Store { - c := &Client{Timeout: opts.Timeout} - err := c.Connect(opts.Address) - return &Store{client: c, connErr: err} + return &Store{opts: opts} +} + +func (p *Store) getClient() (*Client, error) { + c := &Client{Timeout: p.opts.Timeout} + err := c.Connect(p.opts.Address) + return c, errors.Prefix("connection error", err) } // Has asks the peer if they have a hash func (p *Store) Has(hash string) (bool, error) { - if p.connErr != nil { - return false, errors.Prefix("connection error", p.connErr) + c, err := p.getClient() + if err != nil { + return false, err } - - return p.client.HasBlob(hash) + defer c.Close() + return c.HasBlob(hash) } // Get downloads the blob from the peer func (p *Store) Get(hash string) (stream.Blob, error) { - if p.connErr != nil { - return nil, errors.Prefix("connection error", p.connErr) + c, err := p.getClient() + if err != nil { + return nil, err } - - return p.client.GetBlob(hash) + defer c.Close() + return c.GetBlob(hash) } // Put is not supported