|
- package ec
-
- // import (
- // "errors"
- // "io"
- // "io/ioutil"
-
- // "gitlink.org.cn/cloudream/common/pkgs/ipfs"
- // "gitlink.org.cn/cloudream/common/pkgs/logger"
- // stgglb "gitlink.org.cn/cloudream/storage2/common/globals"
- // )
-
- // type BlockReader struct {
- // ipfsCli *ipfs.PoolClient
- // /*将文件分块相关的属性*/
- // //fileHash
- // fileHash string
- // //fileSize
- // fileSize int64
- // //ecK将文件的分块数
- // ecK int
- // //chunkSize
- // chunkSize int64
-
- // /*可选项*/
- // //fastRead,true的时候直接通过hash读block
- // jumpReadOpt bool
- // }
-
- // func NewBlockReader() (*BlockReader, error) {
- // ipfsClient, err := stgglb.IPFSPool.Acquire()
- // if err != nil {
- // return nil, err
- // }
- // //default:fast模式,通过hash直接获取
- // return &BlockReader{ipfsCli: ipfsClient, chunkSize: 256 * 1024, jumpReadOpt: false}, nil
- // }
-
- // func (r *BlockReader) Close() {
- // r.ipfsCli.Close()
- // }
-
- // func (r *BlockReader) SetJumpRead(fileHash string, fileSize int64, ecK int) {
- // r.fileHash = fileHash
- // r.fileSize = fileSize
- // r.ecK = ecK
- // r.jumpReadOpt = true
- // }
-
- // func (r *BlockReader) SetchunkSize(size int64) {
- // r.chunkSize = size
- // }
-
- // func (r *BlockReader) FetchBLock(blockHash string) (io.ReadCloser, error) {
- // return r.ipfsCli.OpenRead(blockHash)
- // }
-
- // func (r *BlockReader) FetchBLocks(blockHashs []string) ([]io.ReadCloser, error) {
- // readers := make([]io.ReadCloser, len(blockHashs))
- // for i, hash := range blockHashs {
- // var err error
- // readers[i], err = r.ipfsCli.OpenRead(hash)
- // if err != nil {
- // return nil, err
- // }
- // }
- // return readers, nil
- // }
-
- // func (r *BlockReader) JumpFetchBlock(innerID int) (io.ReadCloser, error) {
- // if !r.jumpReadOpt {
- // return nil, nil
- // }
- // pipeReader, pipeWriter := io.Pipe()
- // go func() {
- // for i := int64(r.chunkSize * int64(innerID)); i < r.fileSize; i += int64(r.ecK) * r.chunkSize {
- // reader, err := r.ipfsCli.OpenRead(r.fileHash, ipfs.ReadOption{Offset: i, Length: r.chunkSize})
- // if err != nil {
- // pipeWriter.CloseWithError(err)
- // return
- // }
- // data, err := ioutil.ReadAll(reader)
- // if err != nil {
- // pipeWriter.CloseWithError(err)
- // return
- // }
- // reader.Close()
- // _, err = pipeWriter.Write(data)
- // if err != nil {
- // pipeWriter.CloseWithError(err)
- // return
- // }
- // }
- // //如果文件大小不是分块的整数倍,可能需要补0
- // if r.fileSize%(r.chunkSize*int64(r.ecK)) != 0 {
- // //pktNum_1:chunkNum-1
- // pktNum_1 := r.fileSize / (r.chunkSize * int64(r.ecK))
- // offset := (r.fileSize - int64(pktNum_1)*int64(r.ecK)*r.chunkSize)
- // count0 := int64(innerID)*int64(r.ecK)*r.chunkSize - offset
- // if count0 > 0 {
- // add0 := make([]byte, count0)
- // pipeWriter.Write(add0)
- // }
- // }
- // pipeWriter.Close()
- // }()
- // return pipeReader, nil
- // }
-
- // // FetchBlock1这个函数废弃了
- // func (r *BlockReader) FetchBlock1(input interface{}, errMsg chan error) (io.ReadCloser, error) {
- // /*两种模式下传入第一个参数,但是input的类型不同:
- // jumpReadOpt-》true:传入blcokHash, string型,通过哈希直接读
- // jumpReadOpt->false: 传入innerID,int型,选择需要获取的数据块的id
- // */
- // var innerID int
- // var blockHash string
- // switch input.(type) {
- // case int:
- // // 执行针对整数的逻辑分支
- // if r.jumpReadOpt {
- // return nil, errors.New("conflict, wrong input type and jumpReadOpt:true")
- // } else {
- // innerID = input.(int)
- // }
- // case string:
- // if !r.jumpReadOpt {
- // return nil, errors.New("conflict, wrong input type and jumpReadOpt:false")
- // } else {
- // blockHash = input.(string)
- // }
- // default:
- // return nil, errors.New("wrong input type")
- // }
- // //开始执行
- // if r.jumpReadOpt { //快速读
- // ipfsCli, err := stgglb.IPFSPool.Acquire()
- // if err != nil {
- // logger.Warnf("new ipfs client: %s", err.Error())
- // return nil, err
- // }
- // defer ipfsCli.Close()
- // return ipfsCli.OpenRead(blockHash)
- // } else { //跳跃读
- // ipfsCli, err := stgglb.IPFSPool.Acquire()
- // if err != nil {
- // logger.Warnf("new ipfs client: %s", err.Error())
- // return nil, err
- // }
- // defer ipfsCli.Close()
- // pipeReader, pipeWriter := io.Pipe()
- // go func() {
- // for i := int64(r.chunkSize * int64(innerID)); i < r.fileSize; i += int64(r.ecK) * r.chunkSize {
- // reader, err := ipfsCli.OpenRead(r.fileHash, ipfs.ReadOption{i, r.chunkSize})
- // if err != nil {
- // pipeWriter.Close()
- // errMsg <- err
- // return
- // }
- // data, err := ioutil.ReadAll(reader)
- // if err != nil {
- // pipeWriter.Close()
- // errMsg <- err
- // return
- // }
- // reader.Close()
- // _, err = pipeWriter.Write(data)
- // if err != nil {
- // pipeWriter.Close()
- // errMsg <- err
- // return
- // }
- // }
- // //如果文件大小不是分块的整数倍,可能需要补0
- // if r.fileSize%(r.chunkSize*int64(r.ecK)) != 0 {
- // //pktNum_1:chunkNum-1
- // pktNum_1 := r.fileSize / (r.chunkSize * int64(r.ecK))
- // offset := (r.fileSize - int64(pktNum_1)*int64(r.ecK)*r.chunkSize)
- // count0 := int64(innerID)*int64(r.ecK)*r.chunkSize - offset
- // if count0 > 0 {
- // add0 := make([]byte, count0)
- // pipeWriter.Write(add0)
- // }
- // }
- // pipeWriter.Close()
- // errMsg <- nil
- // }()
- // return pipeReader, nil
- // }
- // }
|