return storage.NewResourcePieces(fc.AsResourceProvider())
}
-func fileCachePieceFileStorage(fc *filecache.Cache) storage.ClientImpl {
- return storage.NewFileStorePieces(fc.AsFileStore())
-}
-
func TestClientTransferSmallCache(t *testing.T) {
testClientTransfer(t, testClientTransferParams{
LeecherStorage: NewFileCacheClientStorageFactory(FileCacheClientStorageFactoryParams{
func TestClientTransferVarious(t *testing.T) {
// Leecher storage
for _, ls := range []storageFactory{
- NewFileCacheClientStorageFactory(FileCacheClientStorageFactoryParams{
- Wrapper: fileCachePieceFileStorage,
- }),
NewFileCacheClientStorageFactory(FileCacheClientStorageFactoryParams{
Wrapper: fileCachePieceResourceStorage,
}),
}
func TestAddTorrentPiecesAlreadyCompleted(t *testing.T) {
- testAddTorrentPriorPieceCompletion(t, true, fileCachePieceFileStorage)
testAddTorrentPriorPieceCompletion(t, true, fileCachePieceResourceStorage)
}
func TestAddTorrentPiecesNotAlreadyCompleted(t *testing.T) {
- testAddTorrentPriorPieceCompletion(t, false, fileCachePieceFileStorage)
testAddTorrentPriorPieceCompletion(t, false, fileCachePieceResourceStorage)
}
if ps.SetLeecherStorageCapacity {
fc.SetCapacity(ps.LeecherStorageCapacity)
}
- cfg.DefaultStorage = storage.NewFileStorePieces(fc.AsFileStore())
+ cfg.DefaultStorage = storage.NewResourcePieces(fc.AsResourceProvider())
cfg.DataDir = leecherDataDir
leecher, _ := NewClient(&cfg)
defer leecher.Close()
+++ /dev/null
-package storage
-
-import (
- "io"
- "os"
- "path"
-
- "github.com/anacrolix/missinggo"
-
- "github.com/anacrolix/torrent/metainfo"
-)
-
-type pieceFileStorage struct {
- fs missinggo.FileStore
-}
-
-func NewFileStorePieces(fs missinggo.FileStore) ClientImpl {
- return &pieceFileStorage{
- fs: fs,
- }
-}
-
-func (pieceFileStorage) Close() error { return nil }
-
-type pieceFileTorrentStorage struct {
- s *pieceFileStorage
-}
-
-func (s *pieceFileStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error) {
- return &pieceFileTorrentStorage{s}, nil
-}
-
-func (s *pieceFileTorrentStorage) Close() error {
- return nil
-}
-
-func (s *pieceFileTorrentStorage) Piece(p metainfo.Piece) PieceImpl {
- return pieceFileTorrentStoragePiece{s, p, s.s.fs}
-}
-
-type pieceFileTorrentStoragePiece struct {
- ts *pieceFileTorrentStorage
- p metainfo.Piece
- fs missinggo.FileStore
-}
-
-func (s pieceFileTorrentStoragePiece) completedPath() string {
- return path.Join("completed", s.p.Hash().HexString())
-}
-
-func (s pieceFileTorrentStoragePiece) incompletePath() string {
- return path.Join("incomplete", s.p.Hash().HexString())
-}
-
-func (s pieceFileTorrentStoragePiece) GetIsComplete() bool {
- fi, err := s.fs.Stat(s.completedPath())
- return err == nil && fi.Size() == s.p.Length()
-}
-
-func (s pieceFileTorrentStoragePiece) MarkComplete() error {
- return s.fs.Rename(s.incompletePath(), s.completedPath())
-}
-
-func (s pieceFileTorrentStoragePiece) MarkNotComplete() error {
- return s.fs.Remove(s.completedPath())
-}
-
-func (s pieceFileTorrentStoragePiece) openFile() (f missinggo.File, err error) {
- f, err = s.fs.OpenFile(s.completedPath(), os.O_RDONLY)
- if err == nil {
- var fi os.FileInfo
- fi, err = f.Stat()
- if err == nil && fi.Size() == s.p.Length() {
- return
- }
- f.Close()
- } else if !os.IsNotExist(err) {
- return
- }
- f, err = s.fs.OpenFile(s.incompletePath(), os.O_RDONLY)
- if os.IsNotExist(err) {
- err = io.ErrUnexpectedEOF
- }
- return
-}
-
-func (s pieceFileTorrentStoragePiece) ReadAt(b []byte, off int64) (n int, err error) {
- f, err := s.openFile()
- if err != nil {
- return
- }
- defer f.Close()
- return f.ReadAt(b, off)
-}
-
-func (s pieceFileTorrentStoragePiece) WriteAt(b []byte, off int64) (n int, err error) {
- f, err := s.fs.OpenFile(s.incompletePath(), os.O_WRONLY|os.O_CREATE)
- if err != nil {
- return
- }
- defer f.Close()
- return f.WriteAt(b, off)
-}