Merge pull request #70 from filecoin-project/asr/refactor

extract GetRequiredPadding
This commit is contained in:
Łukasz Magiera 2020-07-13 12:52:43 +02:00 committed by GitHub
commit 937eba4785
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -598,45 +598,65 @@ func GeneratePieceCIDFromFile(proofType abi.RegisteredSealProof, piece io.Reader
return pieceCID, werr() return pieceCID, werr()
} }
func GenerateUnsealedCID(proofType abi.RegisteredSealProof, pieces []abi.PieceInfo) (cid.Cid, error) { func GetRequiredPadding(oldLength abi.PaddedPieceSize, newPieceLength abi.PaddedPieceSize) ([]abi.PaddedPieceSize, abi.PaddedPieceSize) {
allPieces := make([]abi.PieceInfo, 0, len(pieces))
padPieces := make([]abi.PaddedPieceSize, 0)
toFill := uint64(-oldLength % newPieceLength)
n := bits.OnesCount64(toFill)
var sum abi.PaddedPieceSize var sum abi.PaddedPieceSize
for i := 0; i < n; i++ {
next := bits.TrailingZeros64(toFill)
psize := uint64(1) << uint(next)
toFill ^= psize
padTo := func(s abi.PaddedPieceSize, trailing bool) { padded := abi.PaddedPieceSize(psize)
// pad remaining space with 0 CommPs padPieces = append(padPieces, padded)
toFill := uint64(-sum % s) sum += padded
if trailing && sum == 0 {
toFill = uint64(s)
}
n := bits.OnesCount64(toFill)
for i := 0; i < n; i++ {
next := bits.TrailingZeros64(toFill)
psize := uint64(1) << uint(next)
toFill ^= psize
padded := abi.PaddedPieceSize(psize)
allPieces = append(allPieces, abi.PieceInfo{
Size: padded,
PieceCID: zerocomm.ZeroPieceCommitment(padded.Unpadded()),
})
sum += padded
}
} }
for _, p := range pieces { return padPieces, sum
padTo(p.Size, false) }
allPieces = append(allPieces, p)
sum += p.Size
}
func GenerateUnsealedCID(proofType abi.RegisteredSealProof, pieces []abi.PieceInfo) (cid.Cid, error) {
ssize, err := proofType.SectorSize() ssize, err := proofType.SectorSize()
if err != nil { if err != nil {
return cid.Undef, err return cid.Undef, err
} }
padTo(abi.PaddedPieceSize(ssize), true) pssize := abi.PaddedPieceSize(ssize)
allPieces := make([]abi.PieceInfo, 0, len(pieces))
if len(pieces) == 0 {
allPieces = append(allPieces, abi.PieceInfo{
Size: pssize,
PieceCID: zerocomm.ZeroPieceCommitment(pssize.Unpadded()),
})
} else {
var sum abi.PaddedPieceSize
padTo := func(pads []abi.PaddedPieceSize) {
for _, p := range pads {
allPieces = append(allPieces, abi.PieceInfo{
Size: p,
PieceCID: zerocomm.ZeroPieceCommitment(p.Unpadded()),
})
sum += p
}
}
for _, p := range pieces {
ps, _ := GetRequiredPadding(sum, p.Size)
padTo(ps)
allPieces = append(allPieces, p)
sum += p.Size
}
ps, _ := GetRequiredPadding(sum, pssize)
padTo(ps)
}
return ffi.GenerateUnsealedCID(proofType, allPieces) return ffi.GenerateUnsealedCID(proofType, allPieces)
} }