Documentation ¶
Overview ¶
cache
hdcache
Compute missing pieces for a torrent.
Index ¶
- Constants
- func CreateListener(flags *TorrentFlags) (listener net.Listener, externalPort int, err error)
- func Dump(buff []byte)
- func ListenForPeerConnections(flags *TorrentFlags) (conChan chan *BtConn, listenPort int, err error)
- func NewPeerState(conn net.Conn) *peerState
- func RunTorrents(flags *TorrentFlags, torrentFiles []string) (err error)
- func WriteMetaInfoBytes(root, tracker string, w io.Writer) (err error)
- type Accumulator
- type ActivePiece
- type Announce
- type Announcer
- type Bitset
- func (b *Bitset) AndNot(b2 *Bitset)
- func (b *Bitset) Bytes() []byte
- func (b *Bitset) Clear(index int)
- func (b *Bitset) FindNextClear(index int) int
- func (b *Bitset) FindNextSet(index int) int
- func (b *Bitset) InRange(index int) bool
- func (b *Bitset) IsEndValid() bool
- func (b *Bitset) IsSet(index int) bool
- func (b *Bitset) Len() int
- func (b *Bitset) Set(index int)
- type BtConn
- type ByDownloadBPS
- type CacheProvider
- type ChokePolicy
- type Choker
- type ClassicChokePolicy
- type ClientStatusReport
- type Device
- type DeviceList
- type Envelope
- type ExtensionHandshake
- type ExternalIPAddress
- type ExternalIPAddressResponse
- type File
- type FileDict
- type FileStore
- type FileStoreFileAdapter
- type FileStoreFileSystemAdapter
- type FileSystem
- type FsProvider
- type HdCache
- type HdCacheProvider
- type InfoDict
- type Magnet
- type MetaDataExchange
- type MetaInfo
- type MetaInfoFile
- type MetaInfoFileSystem
- type MetadataMessage
- type NAT
- type NeverChokePolicy
- type OSMetaInfoFileSystem
- type OsFsProvider
- type RamCache
- type RamCacheProvider
- type Root
- type Service
- type ServiceList
- type SessionInfo
- type SftpFile
- type SftpFileSystem
- type SftpFsProvider
- type SoapBody
- type TorrentFlags
- type TorrentSession
- func (ts *TorrentSession) AcceptNewPeer(btconn *BtConn)
- func (ts *TorrentSession) AddPeer(btconn *BtConn)
- func (ts *TorrentSession) ChoosePiece(p *peerState) (piece int)
- func (ts *TorrentSession) ClosePeer(peer *peerState)
- func (ts *TorrentSession) DoExtension(msg []byte, p *peerState) (err error)
- func (ts *TorrentSession) DoMessage(p *peerState, message []byte) (err error)
- func (ts *TorrentSession) DoMetadata(msg []byte, p *peerState)
- func (ts *TorrentSession) DoTorrent()
- func (ts *TorrentSession) Header() (header []byte)
- func (ts *TorrentSession) HintNewPeer(peer string)
- func (ts *TorrentSession) Quit() (err error)
- func (ts *TorrentSession) RecordBlock(p *peerState, piece, begin, length uint32) (err error)
- func (ts *TorrentSession) RequestBlock(p *peerState) error
- func (ts *TorrentSession) RequestBlock2(p *peerState, piece int, endGame bool) (err error)
- func (ts *TorrentSession) Shutdown() (err error)
- type TrackerResponse
Constants ¶
const ( MAX_NUM_PEERS = 60 TARGET_NUM_PEERS = 15 )
const ( CHOKE = iota UNCHOKE INTERESTED NOT_INTERESTED HAVE BITFIELD REQUEST PIECE CANCEL PORT // Not implemented. For DHT support. EXTENSION = 20 )
BitTorrent message types. Sources: http://bittorrent.org/beps/bep_0003.html http://wiki.theory.org/BitTorrentSpecification
const ( METADATA_REQUEST = iota METADATA_DATA METADATA_REJECT )
const (
EXTENSION_HANDSHAKE = iota
)
const HIGH_BANDWIDTH_SLOTS = 3
const MAX_OUR_REQUESTS = 2
const MAX_PEER_REQUESTS = 10
const MinimumPieceLength = 16 * 1024
const OPTIMISTIC_UNCHOKE_COUNT = 3
How many cycles of this algorithm before we pick a new optimistic
const OPTIMISTIC_UNCHOKE_INDEX = HIGH_BANDWIDTH_SLOTS
const STANDARD_BLOCK_LENGTH = 16 * 1024
const TargetPieceCountLog2 = 10
const TargetPieceCountMax = TargetPieceCountMin << 1
Target piece count should be < TargetPieceCountMax
const TargetPieceCountMin = 1 << TargetPieceCountLog2
Variables ¶
This section is empty.
Functions ¶
func CreateListener ¶
func CreateListener(flags *TorrentFlags) (listener net.Listener, externalPort int, err error)
func Dump ¶
func Dump(buff []byte)
Simple utility for dumping a []byte to log. It skips over sections of '0', unlike encoding/hex.Dump()
func ListenForPeerConnections ¶
func ListenForPeerConnections(flags *TorrentFlags) (conChan chan *BtConn, listenPort int, err error)
listenForPeerConnections listens on a TCP port for incoming connections and demuxes them to the appropriate active torrentSession based on the InfoHash in the header.
func NewPeerState ¶
func RunTorrents ¶
func RunTorrents(flags *TorrentFlags, torrentFiles []string) (err error)
Types ¶
type Accumulator ¶
type Accumulator struct {
// contains filtered or unexported fields
}
An accumulator that keeps track of the rate of increase.
func NewAccumulator ¶
func NewAccumulator(now time.Time, maxRatePeriod time.Duration) (acc *Accumulator)
func (*Accumulator) DurationUntilRate ¶
func (*Accumulator) GetRateNoUpdate ¶
func (a *Accumulator) GetRateNoUpdate() float64
type ActivePiece ¶
type ActivePiece struct {
// contains filtered or unexported fields
}
type Announcer ¶
type Announcer struct { Announces chan *Announce // contains filtered or unexported fields }
func NewAnnouncer ¶
func (*Announcer) StopAnnouncing ¶
type Bitset ¶
type Bitset struct {
// contains filtered or unexported fields
}
func NewBitsetFromBytes ¶
Creates a new bitset from a given byte stream. Returns nil if the data is invalid in some way.
func (*Bitset) IsEndValid ¶
type BtConn ¶
type BtConn struct { RemoteAddr net.Addr Infohash string // contains filtered or unexported fields }
btConn wraps an incoming network connection and contains metadata that helps identify which active torrentSession it's relevant for.
type ByDownloadBPS ¶
type ByDownloadBPS []Choker
func (ByDownloadBPS) Len ¶
func (a ByDownloadBPS) Len() int
func (ByDownloadBPS) Less ¶
func (a ByDownloadBPS) Less(i, j int) bool
func (ByDownloadBPS) Swap ¶
func (a ByDownloadBPS) Swap(i, j int)
type CacheProvider ¶
type CacheProvider interface {
NewCache(infohash string, numPieces int, pieceLength int64, totalSize int64, undelying FileStore) FileStore
}
func NewHdCacheProvider ¶
func NewHdCacheProvider(capacity int) CacheProvider
func NewRamCacheProvider ¶
func NewRamCacheProvider(capacity int) CacheProvider
type ChokePolicy ¶
type Choker ¶
type Choker interface {
DownloadBPS() float32 // bps
}
The choking policy's view of a peer. For current policies we only care about identity and download bandwidth.
type ClassicChokePolicy ¶
type ClassicChokePolicy struct {
// contains filtered or unexported fields
}
Our interpretation of the classic bittorrent choke policy. Expects to be called once every 10 seconds. See the section "Choking and optimistic unchoking" in https://wiki.theory.org/BitTorrentSpecification
type ClientStatusReport ¶
type Device ¶
type Device struct { XMLName xml.Name `xml:"device"` DeviceType string `xml:"deviceType"` DeviceList DeviceList `xml:"deviceList"` ServiceList ServiceList `xml:"serviceList"` }
type DeviceList ¶
type DeviceList struct {
Device []Device `xml:"device"`
}
type ExtensionHandshake ¶
type ExternalIPAddress ¶
type FileStore ¶
type FileStore interface { io.ReaderAt io.Closer WritePiece(buffer []byte, piece int) (written int, err error) }
A torrent file store. WritePiece should be called for full, verified pieces only;
func NewFileStore ¶
func NewFileStore(info *InfoDict, fileSystem FileSystem) (f FileStore, totalSize int64, err error)
type FileStoreFileAdapter ¶
type FileStoreFileAdapter struct {
// contains filtered or unexported fields
}
func (*FileStoreFileAdapter) Close ¶
func (f *FileStoreFileAdapter) Close() (err error)
type FileStoreFileSystemAdapter ¶
type FileStoreFileSystemAdapter struct {
// contains filtered or unexported fields
}
Adapt a MetaInfoFileSystem into a torrent file store FileSystem
func (*FileStoreFileSystemAdapter) Close ¶
func (f *FileStoreFileSystemAdapter) Close() error
type FileSystem ¶
Interface for a file system. A file system contains files.
func NewRAMFileSystem ¶
func NewRAMFileSystem() (fs FileSystem, err error)
type FsProvider ¶
type FsProvider interface {
NewFS(directory string) (FileSystem, error)
}
Interface for a provider of filesystems.
type HdCache ¶
type HdCache struct {
// contains filtered or unexported fields
}
'pieceSize' is the size of the average piece 'capacity' is how many pieces the cache can hold 'actualUsage' is how many pieces the cache has at the moment 'atime' is an array of access times for each stored box 'boxExists' indicates if a box is existent in cache 'boxPrefix' is the partial path to the boxes. 'torrentLength' is the number of bytes in the torrent 'cacheProvider' is a pointer to the cacheProvider that created this cache 'infohash' is the infohash of the torrent 'underlying' is the FileStore we're caching
type HdCacheProvider ¶
type HdCacheProvider struct {
// contains filtered or unexported fields
}
This provider creates an HD cache for each torrent. Each time a cache is created or closed, all cache are recalculated so they total <= capacity (in MiB).
type MetaDataExchange ¶
type MetaInfo ¶
type MetaInfo struct { Info InfoDict InfoHash string Announce string AnnounceList [][]string `bencode:"announce-list"` CreationDate string `bencode:"creation date"` Comment string CreatedBy string `bencode:"created by"` Encoding string }
func CreateMetaInfoFromFileSystem ¶
func CreateMetaInfoFromFileSystem(fs MetaInfoFileSystem, root, tracker string, pieceLength int64, wantMD5Sum bool) (metaInfo *MetaInfo, err error)
Create a MetaInfo for a given file and file system. If fs is nil then the OSMetaInfoFileSystem will be used. If pieceLength is 0 then an optimal piece length will be chosen.
func GetMetaInfo ¶
func (*MetaInfo) UpdateInfoHash ¶
Updates the InfoHash field. Call this after manually changing the Info data.
type MetaInfoFile ¶
type MetaInfoFileSystem ¶
type MetadataMessage ¶
type NAT ¶
type NAT interface { GetExternalAddress() (addr net.IP, err error) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) }
protocol is either "udp" or "tcp"
func CreatePortMapping ¶
func CreatePortMapping(flags *TorrentFlags) (nat NAT, err error)
createPortMapping creates a NAT port mapping, or nil if none requested or found.
type OSMetaInfoFileSystem ¶
type OSMetaInfoFileSystem struct {
// contains filtered or unexported fields
}
func (*OSMetaInfoFileSystem) Open ¶
func (o *OSMetaInfoFileSystem) Open(name string) (MetaInfoFile, error)
type OsFsProvider ¶
type OsFsProvider struct{}
func (OsFsProvider) NewFS ¶
func (o OsFsProvider) NewFS(directory string) (fs FileSystem, err error)
type RamCache ¶
type RamCache struct {
// contains filtered or unexported fields
}
'pieceSize' is the size of the average piece 'capacity' is how many pieces the cache can hold 'actualUsage' is how many pieces the cache has at the moment 'atime' is an array of access times for each stored box 'store' is an array of "boxes" ([]byte of 1 piece each) 'torrentLength' is the number of bytes in the torrent 'cacheProvider' is a pointer to the cacheProvider that created this cache 'infohash' is the infohash of the torrent
type RamCacheProvider ¶
type RamCacheProvider struct {
// contains filtered or unexported fields
}
This provider creates a ram cache for each torrent. Each time a cache is created or closed, all cache are recalculated so they total <= capacity (in MiB).
type ServiceList ¶
type ServiceList struct {
Service []Service `xml:"service"`
}
type SessionInfo ¶
type SftpFileSystem ¶
type SftpFileSystem struct {
// contains filtered or unexported fields
}
func (*SftpFileSystem) Close ¶
func (sfs *SftpFileSystem) Close() (err error)
func (*SftpFileSystem) Connect ¶
func (sfs *SftpFileSystem) Connect() error
type SftpFsProvider ¶
func NewSftpFsProvider ¶
func NewSftpFsProvider(connection string) SftpFsProvider
Connection string: username:password@example.com:8042/over/there/
func (SftpFsProvider) NewFS ¶
func (o SftpFsProvider) NewFS(directory string) (fs FileSystem, err error)
type SoapBody ¶
type SoapBody struct { XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Body"` ExternalIP *ExternalIPAddressResponse }
type TorrentFlags ¶
type TorrentFlags struct { Port int FileDir string SeedRatio float64 UseDeadlockDetector bool UseLPD bool UseDHT bool UseUPnP bool UseNATPMP bool TrackerlessMode bool ExecOnSeeding string // The dial function to use. Nil means use net.Dial Dial proxy.Dialer // IP address of gateway used for NAT-PMP Gateway string //Provides the filesystems added torrents are saved to FileSystemProvider FsProvider //Whether to check file hashes when adding torrents InitialCheck bool //Provides cache to each torrent Cacher CacheProvider //Whether to write and use *.haveBitset resume data QuickResume bool //How many torrents should be active at a time MaxActive int //Maximum amount of memory (in MiB) to use for each torrent's Active Pieces. //0 means a single Active Piece. Negative means Unlimited Active Pieces. MemoryPerTorrent int }
type TorrentSession ¶
type TorrentSession struct { M *MetaInfo Session SessionInfo // contains filtered or unexported fields }
func NewTorrentSession ¶
func NewTorrentSession(flags *TorrentFlags, torrent string, listenPort uint16) (t *TorrentSession, err error)
func (*TorrentSession) AcceptNewPeer ¶
func (ts *TorrentSession) AcceptNewPeer(btconn *BtConn)
func (*TorrentSession) AddPeer ¶
func (ts *TorrentSession) AddPeer(btconn *BtConn)
Can be called from any goroutine
func (*TorrentSession) ChoosePiece ¶
func (ts *TorrentSession) ChoosePiece(p *peerState) (piece int)
func (*TorrentSession) ClosePeer ¶
func (ts *TorrentSession) ClosePeer(peer *peerState)
func (*TorrentSession) DoExtension ¶
func (ts *TorrentSession) DoExtension(msg []byte, p *peerState) (err error)
func (*TorrentSession) DoMessage ¶
func (ts *TorrentSession) DoMessage(p *peerState, message []byte) (err error)
func (*TorrentSession) DoMetadata ¶
func (ts *TorrentSession) DoMetadata(msg []byte, p *peerState)
func (*TorrentSession) DoTorrent ¶
func (ts *TorrentSession) DoTorrent()
func (*TorrentSession) Header ¶
func (ts *TorrentSession) Header() (header []byte)
func (*TorrentSession) HintNewPeer ¶
func (ts *TorrentSession) HintNewPeer(peer string)
Try to connect if the peer is not already in our peers. Can be called from any goroutine.
func (*TorrentSession) Quit ¶
func (ts *TorrentSession) Quit() (err error)
func (*TorrentSession) RecordBlock ¶
func (ts *TorrentSession) RecordBlock(p *peerState, piece, begin, length uint32) (err error)
func (*TorrentSession) RequestBlock ¶
func (ts *TorrentSession) RequestBlock(p *peerState) error
func (*TorrentSession) RequestBlock2 ¶
func (ts *TorrentSession) RequestBlock2(p *peerState, piece int, endGame bool) (err error)
func (*TorrentSession) Shutdown ¶
func (ts *TorrentSession) Shutdown() (err error)