@@ -10,11 +10,13 @@ import (
1010 blockstore "github.com/ipfs/go-ipfs-blockstore"
1111 "github.com/ipld/go-car"
1212 "github.com/ipld/go-ipld-prime"
13+ "github.com/prometheus/common/log"
14+ "golang.org/x/xerrors"
1315
16+ ffi "github.com/filecoin-project/filecoin-ffi"
1417 "github.com/filecoin-project/go-multistore"
1518 "github.com/filecoin-project/go-padreader"
16- "github.com/filecoin-project/sector-storage/ffiwrapper"
17- "github.com/filecoin-project/specs-actors/actors/abi"
19+ "github.com/filecoin-project/go-state-types/abi"
1820
1921 "github.com/filecoin-project/go-fil-markets/filestore"
2022)
@@ -134,7 +136,7 @@ func (pio *pieceIOWithStore) GeneratePieceCommitmentToFile(rt abi.RegisteredSeal
134136
135137func GeneratePieceCommitment (rt abi.RegisteredSealProof , rd io.Reader , pieceSize uint64 ) (cid.Cid , abi.UnpaddedPieceSize , error ) {
136138 paddedReader , paddedSize := padreader .New (rd , pieceSize )
137- commitment , err := ffiwrapper . GeneratePieceCIDFromFile (rt , paddedReader , paddedSize )
139+ commitment , err := GeneratePieceCIDFromFile (rt , paddedReader , paddedSize )
138140 if err != nil {
139141 return cid .Undef , 0 , err
140142 }
@@ -159,3 +161,61 @@ func (pio *pieceIO) bstore(storeID *multistore.StoreID) (blockstore.Blockstore,
159161 }
160162 return store .Bstore , nil
161163}
164+
165+ func ToReadableFile (r io.Reader , n int64 ) (* os.File , func () error , error ) {
166+ f , ok := r .(* os.File )
167+ if ok {
168+ return f , func () error { return nil }, nil
169+ }
170+
171+ var w * os.File
172+
173+ f , w , err := os .Pipe ()
174+ if err != nil {
175+ return nil , nil , err
176+ }
177+
178+ var wait sync.Mutex
179+ var werr error
180+
181+ wait .Lock ()
182+ go func () {
183+ defer wait .Unlock ()
184+
185+ var copied int64
186+ copied , werr = io .CopyN (w , r , n )
187+ if werr != nil {
188+ log .Warnf ("toReadableFile: copy error: %+v" , werr )
189+ }
190+
191+ err := w .Close ()
192+ if werr == nil && err != nil {
193+ werr = err
194+ log .Warnf ("toReadableFile: close error: %+v" , err )
195+ return
196+ }
197+ if copied != n {
198+ log .Warnf ("copied different amount than expected: %d != %d" , copied , n )
199+ werr = xerrors .Errorf ("copied different amount than expected: %d != %d" , copied , n )
200+ }
201+ }()
202+
203+ return f , func () error {
204+ wait .Lock ()
205+ return werr
206+ }, nil
207+ }
208+
209+ func GeneratePieceCIDFromFile (proofType abi.RegisteredSealProof , piece io.Reader , pieceSize abi.UnpaddedPieceSize ) (cid.Cid , error ) {
210+ f , werr , err := ToReadableFile (piece , int64 (pieceSize ))
211+ if err != nil {
212+ return cid .Undef , err
213+ }
214+
215+ pieceCID , err := ffi .GeneratePieceCIDFromFile (proofType , f , pieceSize )
216+ if err != nil {
217+ return cid .Undef , err
218+ }
219+
220+ return pieceCID , werr ()
221+ }
0 commit comments