Compact the meta file TODO 考虑自动Compact的时机(脏数据比例?)
()
| 302 | // Compact the meta file |
| 303 | // TODO 考虑自动Compact的时机(脏数据比例?) |
| 304 | func (this *MetaFile) Compact() error { |
| 305 | this.mu.Lock() |
| 306 | defer this.mu.Unlock() |
| 307 | |
| 308 | var buf = bytes.NewBuffer(nil) |
| 309 | for hash, lazyHeader := range this.headerMap { |
| 310 | header, err := lazyHeader.FileHeaderUnsafe() |
| 311 | if err != nil { |
| 312 | return err |
| 313 | } |
| 314 | |
| 315 | blockBytes, err := header.Encode(hash) |
| 316 | if err != nil { |
| 317 | return err |
| 318 | } |
| 319 | buf.Write(blockBytes) |
| 320 | } |
| 321 | |
| 322 | AckWriteThread() |
| 323 | err := this.fp.Truncate(int64(buf.Len())) |
| 324 | ReleaseWriteThread() |
| 325 | if err != nil { |
| 326 | return err |
| 327 | } |
| 328 | |
| 329 | AckReadThread() |
| 330 | _, err = this.fp.Seek(0, io.SeekStart) |
| 331 | ReleaseReadThread() |
| 332 | if err != nil { |
| 333 | return err |
| 334 | } |
| 335 | |
| 336 | AckWriteThread() |
| 337 | _, err = this.fp.Write(buf.Bytes()) |
| 338 | ReleaseWriteThread() |
| 339 | this.isModified = true |
| 340 | return err |
| 341 | } |
| 342 | |
| 343 | func (this *MetaFile) SyncUnsafe() error { |
| 344 | if !this.isModified { |