| 94 | } |
| 95 | |
| 96 | func (fr *fileRecovery) readBucket() (b *core.Bucket, err error) { |
| 97 | buf := make([]byte, core.BucketMetaSize) |
| 98 | _, err = io.ReadFull(fr.reader, buf) |
| 99 | if err != nil { |
| 100 | return nil, err |
| 101 | } |
| 102 | meta := new(core.BucketMeta) |
| 103 | meta.Decode(buf) |
| 104 | bucket := new(core.Bucket) |
| 105 | bucket.Meta = meta |
| 106 | dataBuf := make([]byte, meta.Size) |
| 107 | _, err = io.ReadFull(fr.reader, dataBuf) |
| 108 | if err != nil { |
| 109 | return nil, err |
| 110 | } |
| 111 | err = bucket.Decode(dataBuf) |
| 112 | if err != nil { |
| 113 | return nil, err |
| 114 | } |
| 115 | |
| 116 | if bucket.GetCRC(buf, dataBuf) != bucket.Meta.Crc { |
| 117 | return nil, core.ErrBucketCrcInvalid |
| 118 | } |
| 119 | |
| 120 | return bucket, nil |
| 121 | } |
| 122 | |
| 123 | // calBufferSize calculates the buffer size of bufio.Reader |
| 124 | // if the size < 4 * KB, use 4 * KB as the size of buffer in bufio.Reader |