(off int64)
| 442 | } |
| 443 | |
| 444 | func (r *RangeReadReadAtSeeker) getReaderAtOffset(off int64) (io.Reader, error) { |
| 445 | for { |
| 446 | var cur int64 = -1 |
| 447 | r.readerMap.Range(func(key, value any) bool { |
| 448 | k := key.(int64) |
| 449 | if off == k { |
| 450 | cur = k |
| 451 | return false |
| 452 | } |
| 453 | if off > k && off-k <= 4*utils.MB && k > cur { |
| 454 | cur = k |
| 455 | } |
| 456 | return true |
| 457 | }) |
| 458 | if cur < 0 { |
| 459 | break |
| 460 | } |
| 461 | v, ok := r.readerMap.LoadAndDelete(int64(cur)) |
| 462 | if !ok { |
| 463 | continue |
| 464 | } |
| 465 | rr := v.(io.Reader) |
| 466 | if off == int64(cur) { |
| 467 | // logrus.Debugf("getReaderAtOffset match_%d", off) |
| 468 | return rr, nil |
| 469 | } |
| 470 | n, _ := utils.CopyWithBufferN(io.Discard, rr, off-cur) |
| 471 | cur += n |
| 472 | if cur == off { |
| 473 | // logrus.Debugf("getReaderAtOffset old_%d", off) |
| 474 | return rr, nil |
| 475 | } |
| 476 | break |
| 477 | } |
| 478 | |
| 479 | // logrus.Debugf("getReaderAtOffset new_%d", off) |
| 480 | reader, err := r.ss.RangeRead(http_range.Range{Start: off, Length: -1}) |
| 481 | if err != nil { |
| 482 | return nil, err |
| 483 | } |
| 484 | return reader, nil |
| 485 | } |
| 486 | |
| 487 | func (r *RangeReadReadAtSeeker) ReadAt(p []byte, off int64) (n int, err error) { |
| 488 | if off < 0 || off >= r.ss.GetSize() { |
no test coverage detected