diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 06953e4..7ad026c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ changes in. The average contribution flow is as follows: -- Create a topic branch from where you want to base your work. This is usually master. +- Create a topic branch from where you want to base your work. This is usually `develop`. - Make commits of logical units. - Make sure your commit messages are in the [proper format] - Push your changes to a topic branch in your fork of the repository. diff --git a/Godeps/_workspace/src/golang.org/x/net/netutil/listen.go b/Godeps/_workspace/src/golang.org/x/net/netutil/listen.go index b317ba2..a2591f8 100644 --- a/Godeps/_workspace/src/golang.org/x/net/netutil/listen.go +++ b/Godeps/_workspace/src/golang.org/x/net/netutil/listen.go @@ -4,7 +4,7 @@ // Package netutil provides network utility functions, complementing the more // common ones in the net package. -package netutil // import "golang.org/x/net/netutil" +package netutil import ( "net" diff --git a/backend/backend.go b/backend/backend.go index a643741..7ec60ea 100644 --- a/backend/backend.go +++ b/backend/backend.go @@ -53,6 +53,10 @@ type Conn interface { // down the driver Close() error + // Ping just checks to see if the database is still alive. This is typically + // used for health checks. + Ping() error + // RecordAnnounce is called once per announce, and is passed the delta in // statistics for the client peer since its last announce. RecordAnnounce(delta *models.AnnounceDelta) error diff --git a/backend/noop/driver.go b/backend/noop/driver.go index 8fc6fd1..ab6a57c 100644 --- a/backend/noop/driver.go +++ b/backend/noop/driver.go @@ -14,6 +14,8 @@ import ( type driver struct{} +// NoOp is a backend driver for Chihaya that does nothing. This is used by +// public trackers. type NoOp struct{} // New returns a new Chihaya backend driver that does nothing. @@ -26,6 +28,11 @@ func (n *NoOp) Close() error { return nil } +// Ping returns nil. +func (n *NoOp) Ping() error { + return nil +} + // RecordAnnounce returns nil. func (n *NoOp) RecordAnnounce(delta *models.AnnounceDelta) error { return nil diff --git a/http/routes.go b/http/routes.go index a7eae79..f2733d1 100644 --- a/http/routes.go +++ b/http/routes.go @@ -33,6 +33,10 @@ func handleError(err error) (int, error) { } func (s *Server) check(w http.ResponseWriter, r *http.Request, p httprouter.Params) (int, error) { + // Ping the backend if private tracker is enabled. + if err := s.tracker.Backend.Ping(); s.config.PrivateEnabled && err != nil { + return handleError(err) + } _, err := w.Write([]byte("STILL-ALIVE")) return handleError(err) } diff --git a/tracker/storage.go b/tracker/storage.go index b3d73e9..1ec59de 100644 --- a/tracker/storage.go +++ b/tracker/storage.go @@ -48,14 +48,14 @@ func (s *Storage) Len() int { return int(atomic.LoadInt32(&s.size)) } -func (s *Storage) GetShardIndex(infohash string) uint32 { +func (s *Storage) getShardIndex(infohash string) uint32 { idx := fnv.New32() idx.Write([]byte(infohash)) return idx.Sum32() % uint32(len(s.shards)) } -func (s *Storage) GetTorrentShard(infohash string, readonly bool) *Torrents { - shardindex := s.GetShardIndex(infohash) +func (s *Storage) getTorrentShard(infohash string, readonly bool) *Torrents { + shardindex := s.getShardIndex(infohash) if readonly { s.shards[shardindex].RLock() } else { @@ -65,7 +65,7 @@ func (s *Storage) GetTorrentShard(infohash string, readonly bool) *Torrents { } func (s *Storage) TouchTorrent(infohash string) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -79,7 +79,7 @@ func (s *Storage) TouchTorrent(infohash string) error { } func (s *Storage) FindTorrent(infohash string) (*models.Torrent, error) { - shard := s.GetTorrentShard(infohash, true) + shard := s.getTorrentShard(infohash, true) defer shard.RUnlock() torrent, exists := shard.torrents[infohash] @@ -91,7 +91,7 @@ func (s *Storage) FindTorrent(infohash string) (*models.Torrent, error) { } func (s *Storage) PutTorrent(torrent *models.Torrent) { - shard := s.GetTorrentShard(torrent.Infohash, false) + shard := s.getTorrentShard(torrent.Infohash, false) defer shard.Unlock() _, exists := shard.torrents[torrent.Infohash] @@ -102,7 +102,7 @@ func (s *Storage) PutTorrent(torrent *models.Torrent) { } func (s *Storage) DeleteTorrent(infohash string) { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() if _, exists := shard.torrents[infohash]; exists { @@ -112,7 +112,7 @@ func (s *Storage) DeleteTorrent(infohash string) { } func (s *Storage) IncrementTorrentSnatches(infohash string) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -126,7 +126,7 @@ func (s *Storage) IncrementTorrentSnatches(infohash string) error { } func (s *Storage) PutLeecher(infohash string, p *models.Peer) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -140,7 +140,7 @@ func (s *Storage) PutLeecher(infohash string, p *models.Peer) error { } func (s *Storage) DeleteLeecher(infohash string, p *models.Peer) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -154,7 +154,7 @@ func (s *Storage) DeleteLeecher(infohash string, p *models.Peer) error { } func (s *Storage) PutSeeder(infohash string, p *models.Peer) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -168,7 +168,7 @@ func (s *Storage) PutSeeder(infohash string, p *models.Peer) error { } func (s *Storage) DeleteSeeder(infohash string, p *models.Peer) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -182,7 +182,7 @@ func (s *Storage) DeleteSeeder(infohash string, p *models.Peer) error { } func (s *Storage) PurgeInactiveTorrent(infohash string) error { - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) defer shard.Unlock() torrent, exists := shard.torrents[infohash] @@ -223,7 +223,7 @@ func (s *Storage) PurgeInactivePeers(purgeEmptyTorrents bool, before time.Time) // Process the keys while allowing other goroutines to run. for _, infohash := range keys { runtime.Gosched() - shard := s.GetTorrentShard(infohash, false) + shard := s.getTorrentShard(infohash, false) torrent := shard.torrents[infohash] if torrent == nil {