]> Sergey Matveev's repositories - btrtrc.git/log
btrtrc.git
2 years agoInlineable `(*Torrent).AddPeers()` (#622)
YenForYang [Wed, 15 Sep 2021 00:14:07 +0000 (19:14 -0500)]
Inlineable `(*Torrent).AddPeers()` (#622)

2 years agoInlineable `DownloadPieces()` and `CancelPieces()` (#623)
YenForYang [Wed, 15 Sep 2021 00:13:46 +0000 (19:13 -0500)]
Inlineable `DownloadPieces()` and `CancelPieces()` (#623)

2 years agoCreate default constructor for Client (#567)
YenForYang [Tue, 14 Sep 2021 13:01:20 +0000 (08:01 -0500)]
Create default constructor for Client (#567)

Allow for certain values to always be properly initialized on construction -- namely the maps for now. I'm currently working on a change that requires a baseline constructor; this change would make the use of `chansync.BroadcastCond` and `chansync.SetOnce` obsolete -- i.e. one can have channel members without worrying about proper initialization/destruction of a `chan struct{}`.

As for why `makeClient` returns a value instead of a pointer: returning a value gives us more options -- you can always take a pointer from a value later on cheaply, and have things moved to the heap if they weren't already. The same can't be said about getting a value back from a pointer. GC also could potentially have less work to do. Plus I personally find ownership to be an important concept (semi-borrowed from rust) -- use of values make ownership clear.

2 years agoClarify maximum value of "metadata_size" (#609)
YenForYang [Tue, 14 Sep 2021 12:36:19 +0000 (07:36 -0500)]
Clarify maximum value of "metadata_size" (#609)

2 years agoInlineable `(*File).BytesCompleted()` (#612)
YenForYang [Tue, 14 Sep 2021 12:11:35 +0000 (07:11 -0500)]
Inlineable `(*File).BytesCompleted()` (#612)

2 years agoOptimize `LoopbackListenHost()` (#615)
YenForYang [Tue, 14 Sep 2021 11:54:37 +0000 (06:54 -0500)]
Optimize `LoopbackListenHost()` (#615)

2 years agoInlineable (*reader).SetReadAhead and (*reader).Close (#594)
YenForYang [Tue, 14 Sep 2021 04:05:37 +0000 (23:05 -0500)]
Inlineable (*reader).SetReadAhead and (*reader).Close (#594)

Small fixes that prevent inlining of public functions

2 years agoDrop bradfitz/iter dependency (#605)
YenForYang [Tue, 14 Sep 2021 03:46:50 +0000 (22:46 -0500)]
Drop bradfitz/iter dependency (#605)

* Drop bradfitz/iter dependency

`range iter.N` looks nice and doesn't allocate, but unfortunately using a `range` expression blocks a function from being inlined wherever it's used (for now). It's not that we need inlining in all cases, but I do think a C-style for loop looks just as nice and is probably clearer to the majority. There also aren't any clear disadvantages to changing (unless you just happen to dislike the look of C)

* Update misc_test.go

* Update rlreader_test.go

* Update torrent_test.go

* Update bench_test.go

* Update client_test.go

* Update iplist_test.go

* Update mse_test.go

* Update peerconn_test.go

* Update peerconn.go

* Update order_test.go

* Update decoder_test.go

* Update main.go

* Update bench-piece-mark-complete.go

* Update main.go

* Update torrent.go

* Update iplist_test.go

* Update main.go

2 years agoCheaper byte to string conversion (#602)
YenForYang [Tue, 14 Sep 2021 00:41:04 +0000 (19:41 -0500)]
Cheaper byte to string conversion (#602)

Revamped https://github.com/anacrolix/torrent/pull/587

2 years agoInlineable reader.Seek and no-lock return for bad whence (#577)
YenForYang [Mon, 13 Sep 2021 12:52:58 +0000 (07:52 -0500)]
Inlineable reader.Seek and no-lock return for bad whence (#577)

* Inlineable reader.Seek and no-lock return for bad whence

Couldn't find an elegant way to early exit on bad whence. Using a closure could reduce code duplication slightly, but it's overkill for only 3 cases.

Note that returning 0 on an invalid whence is the behavior of `strings.Reader` and `bytes.Reader`.

* Update reader.go

2 years agoFix usages of eachListener() and make inlineable (#599)
YenForYang [Mon, 13 Sep 2021 11:35:51 +0000 (06:35 -0500)]
Fix usages of eachListener() and make inlineable (#599)

2 years agoInlineable methods to access File piecePriority (#601)
YenForYang [Mon, 13 Sep 2021 11:17:54 +0000 (06:17 -0500)]
Inlineable methods to access File piecePriority (#601)

2 years agoSimplify (*Torrent).gotMetainfo (#581)
YenForYang [Mon, 13 Sep 2021 01:41:11 +0000 (20:41 -0500)]
Simplify (*Torrent).gotMetainfo (#581)

2 years agoRemove xerrors dependency (#600)
YenForYang [Mon, 13 Sep 2021 01:38:08 +0000 (20:38 -0500)]
Remove xerrors dependency (#600)

* Remove xerrors dependency

* Update main.go

2 years agoReorder fields to reduce padding in reader (#597)
YenForYang [Mon, 13 Sep 2021 01:36:35 +0000 (20:36 -0500)]
Reorder fields to reduce padding in reader (#597)

Reorder some of the fields to reduce the size of `reader`. Not much of a change -- original size was 104 bytes, with changes (moving bool's to the end) the size is 96 bytes. There's also the whole cache-friendly bit -- I tried reordering fields to help here, but I doubt it makes much of a difference.

Some other notes: `sync.Locker` is a 16 byte field. I suggest changing this to something like `*sync.RWMutex` or `*lockWithDeferreds`. This would not only reduce size but would allow access to `RLock`/`RUnlock`.
`pieceRange` could also be shrunk to 8 bytes, but I feel like I'm probably asking for too much lol.

2 years agoUpdate ReadCloser interface check to ReadSeekCloser (#595)
YenForYang [Sun, 12 Sep 2021 04:14:07 +0000 (23:14 -0500)]
Update ReadCloser interface check to ReadSeekCloser (#595)

2 years agoFix http announce of infohash containing ' ' bytes (#591)
Matt Joiner [Sun, 12 Sep 2021 04:11:59 +0000 (14:11 +1000)]
Fix http announce of infohash containing ' ' bytes (#591)

Fixes https://github.com/anacrolix/torrent/issues/534.

2 years agoDon't call Client onClose handlers until torrent storages are closed
Matt Joiner [Fri, 10 Sep 2021 04:15:45 +0000 (14:15 +1000)]
Don't call Client onClose handlers until torrent storages are closed

2 years agoFix Torrent.Drop to wait for storage close without client lock
Matt Joiner [Fri, 10 Sep 2021 04:14:57 +0000 (14:14 +1000)]
Fix Torrent.Drop to wait for storage close without client lock

2 years agoAvoid allocating memory when checking interface (#588)
YenForYang [Fri, 10 Sep 2021 22:26:43 +0000 (17:26 -0500)]
Avoid allocating memory when checking interface (#588)

Not a big deal, but there isn't a need to allocate an object to check that `*Node` satisfies `bencode.Unmarshaler`.

2 years agoOptimize peersForPieces allocations for make and sorting
Matt Joiner [Fri, 10 Sep 2021 13:06:23 +0000 (23:06 +1000)]
Optimize peersForPieces allocations for make and sorting

2 years agoOptimize requesting peerId Uintptr allocation
Matt Joiner [Fri, 10 Sep 2021 13:02:20 +0000 (23:02 +1000)]
Optimize requesting peerId Uintptr allocation

2 years agoDisable ensureValidSortedPeersForPieceRequests
Matt Joiner [Fri, 10 Sep 2021 12:13:39 +0000 (22:13 +1000)]
Disable ensureValidSortedPeersForPieceRequests

Should approximately half the contribution of the parent function to overhead.

2 years agoOptimize sortPeersForPiece in allocatePendingChunks
Matt Joiner [Fri, 10 Sep 2021 12:12:08 +0000 (22:12 +1000)]
Optimize sortPeersForPiece in allocatePendingChunks

2 years agoOptimize Torrent.worstBadConn
Matt Joiner [Fri, 10 Sep 2021 11:48:44 +0000 (21:48 +1000)]
Optimize Torrent.worstBadConn

2 years agoRemove reader.opMu
Matt Joiner [Fri, 10 Sep 2021 10:58:11 +0000 (20:58 +1000)]
Remove reader.opMu

https://github.com/anacrolix/torrent/issues/553

2 years agogo fmt ./...
Matt Joiner [Thu, 9 Sep 2021 12:51:24 +0000 (22:51 +1000)]
go fmt ./...

2 years agoFix possible misuse of reflect.StringHeader
Matt Joiner [Thu, 9 Sep 2021 12:49:22 +0000 (22:49 +1000)]
Fix possible misuse of reflect.StringHeader

2 years agouseTorrentSources: fix http request resource leak (#562)
YenForYang [Thu, 9 Sep 2021 12:39:12 +0000 (07:39 -0500)]
useTorrentSources: fix http request resource leak (#562)

2 years agoClarify ownership of (*Torrent).chunkPool (#583)
YenForYang [Thu, 9 Sep 2021 12:27:16 +0000 (07:27 -0500)]
Clarify ownership of (*Torrent).chunkPool (#583)

Basically bind the lifetime of chunkPool to the torrent by using `sync.Pool` in lieu of `*sync.Pool`. Gives the GC ever so slightly less work to do.

2 years agoDon't readahead until a read occurs
Matt Joiner [Thu, 9 Sep 2021 12:19:29 +0000 (22:19 +1000)]
Don't readahead until a read occurs

2 years agoMake readahead algorithm linear
Matt Joiner [Thu, 9 Sep 2021 12:16:24 +0000 (22:16 +1000)]
Make readahead algorithm linear

2 years agoAdd default sqrt readahead algorithm
Matt Joiner [Thu, 9 Sep 2021 10:55:09 +0000 (20:55 +1000)]
Add default sqrt readahead algorithm

2 years agoExtract common Torrent.newReader
Matt Joiner [Thu, 9 Sep 2021 07:41:12 +0000 (17:41 +1000)]
Extract common Torrent.newReader

2 years agoAdd Webtor to downstream projects
Matt Joiner [Thu, 9 Sep 2021 12:12:29 +0000 (22:12 +1000)]
Add Webtor to downstream projects

2 years agoFix unit tests littering working directory
Matt Joiner [Thu, 9 Sep 2021 02:58:07 +0000 (12:58 +1000)]
Fix unit tests littering working directory

2 years agoUpdate README.md
Matt Joiner [Wed, 8 Sep 2021 03:46:03 +0000 (13:46 +1000)]
Update README.md

2 years agoUpdate README.md
Matt Joiner [Wed, 8 Sep 2021 03:45:25 +0000 (13:45 +1000)]
Update README.md

2 years agoDrop xerrors and missinggo/slices dependency for Client (#572)
YenForYang [Tue, 7 Sep 2021 23:34:06 +0000 (18:34 -0500)]
Drop xerrors and missinggo/slices dependency for Client (#572)

* Drop xerrors and missinggo/slices dependency for Client

Made `BadPeerIPs` inlineable since I changed `badPeerIPsLocked` anyway. Also eliminated an extra torrentsAsSlice copy since Go wasn't smart enough to figure it out.

2 years agoImprove Closing (#559)
Zilog8 [Sun, 5 Sep 2021 01:33:41 +0000 (21:33 -0400)]
Improve Closing (#559)

- Prevent double-closing in cmd/torrent
- Move async closing from storage to torrents, and wait on them to finish tidying up before returning/exiting.

2 years agoUpdate chansync
Matt Joiner [Sat, 4 Sep 2021 13:34:06 +0000 (23:34 +1000)]
Update chansync

2 years agoReturn error on sqlite PieceCompletion.Set when closed
Matt Joiner [Thu, 2 Sep 2021 10:54:22 +0000 (20:54 +1000)]
Return error on sqlite PieceCompletion.Set when closed

2 years agoRework Reader waiting
Matt Joiner [Thu, 2 Sep 2021 10:53:49 +0000 (20:53 +1000)]
Rework Reader waiting

2 years agoSimplify dhtPort()
YenForYang [Sat, 4 Sep 2021 02:24:35 +0000 (21:24 -0500)]
Simplify dhtPort()

A similar case of `haveDhtServer`

2 years agoDrop xerrors and reflection dependency
YenForYang [Sat, 4 Sep 2021 06:30:14 +0000 (01:30 -0500)]
Drop xerrors and reflection dependency

Nothing wrong with missinggo.CopyExact -- but fewer dependencies is better IMO.  Also changed String() to use a consistent receiver name -- not a big deal.

2 years ago[gomod] Update anacrolix/dht and run 'go mod tidy'
afjoseph [Thu, 2 Sep 2021 12:31:09 +0000 (14:31 +0200)]
[gomod] Update anacrolix/dht and run 'go mod tidy'

2 years agoSimplify haveDhtServers()
YenForYang [Fri, 3 Sep 2021 03:03:47 +0000 (22:03 -0500)]
Simplify haveDhtServers()

A bit too much functional programming, lol.

2 years agoMerge branch 'master' into squirrel
Matt Joiner [Thu, 2 Sep 2021 04:19:29 +0000 (14:19 +1000)]
Merge branch 'master' into squirrel

2 years agogo get -u ./...
Matt Joiner [Thu, 2 Sep 2021 00:31:47 +0000 (10:31 +1000)]
go get -u ./...

2 years agoAdd generics TODO v1.31.0
Matt Joiner [Thu, 2 Sep 2021 00:21:56 +0000 (10:21 +1000)]
Add generics TODO

2 years agoAdd "no name" handling and storage.NewFileOpts
Matt Joiner [Thu, 2 Sep 2021 00:21:46 +0000 (10:21 +1000)]
Add "no name" handling and storage.NewFileOpts

This came out of testing against Transmission in https://github.com/anacrolix/torrent/discussions/556#discussioncomment-1263670.

2 years ago./cmd/torrent-create: Update the builtin announce list
Matt Joiner [Wed, 1 Sep 2021 23:28:29 +0000 (09:28 +1000)]
./cmd/torrent-create: Update the builtin announce list

2 years agoFix info name when building from . and ..
Matt Joiner [Wed, 1 Sep 2021 06:17:23 +0000 (16:17 +1000)]
Fix info name when building from . and ..

2 years agocmd/torrent download: Don't seed if no torrents are specified
Matt Joiner [Wed, 1 Sep 2021 05:26:12 +0000 (15:26 +1000)]
cmd/torrent download: Don't seed if no torrents are specified

2 years agoFix panic on double Close of sqlite piece completion DB
Matt Joiner [Wed, 1 Sep 2021 05:25:46 +0000 (15:25 +1000)]
Fix panic on double Close of sqlite piece completion DB

2 years agoPieceStateRuns: reduce copying and make inlineable
YenForYang [Wed, 1 Sep 2021 04:06:25 +0000 (23:06 -0500)]
PieceStateRuns: reduce copying and make inlineable

Just a heads up: using `range` and/or `defer` prevents function inlining. This is fine for infrequently called functions and/or large functions, but for simple public methods like these, I'd assume it's better for them to be inlined.

2 years agoFix some DeepSource lints
Matt Joiner [Mon, 30 Aug 2021 01:48:34 +0000 (11:48 +1000)]
Fix some DeepSource lints

2 years agoSet Go CI workflow to use Go 1.17
Matt Joiner [Mon, 30 Aug 2021 01:19:16 +0000 (11:19 +1000)]
Set Go CI workflow to use Go 1.17

2 years agogo mod tidy
Matt Joiner [Thu, 26 Aug 2021 01:20:52 +0000 (11:20 +1000)]
go mod tidy

2 years agoAdd function to wrap squirrel.Cache as storage.ClientImpl
Matt Joiner [Thu, 26 Aug 2021 01:20:37 +0000 (11:20 +1000)]
Add function to wrap squirrel.Cache as storage.ClientImpl

2 years agoUpdate squirrel
Matt Joiner [Thu, 26 Aug 2021 01:19:39 +0000 (11:19 +1000)]
Update squirrel

2 years agoUse separate squirrel module
Matt Joiner [Wed, 25 Aug 2021 04:37:00 +0000 (14:37 +1000)]
Use separate squirrel module

2 years agoRemoved unused sqlite "provider" storage
Matt Joiner [Wed, 25 Aug 2021 02:35:07 +0000 (12:35 +1000)]
Removed unused sqlite "provider" storage

2 years agoEmbed SQL
Matt Joiner [Tue, 24 Aug 2021 12:24:39 +0000 (22:24 +1000)]
Embed SQL

2 years agoImplement {Set,Get}Tag on SquirrelBlob
Matt Joiner [Tue, 24 Aug 2021 08:37:38 +0000 (18:37 +1000)]
Implement {Set,Get}Tag on SquirrelBlob

2 years agoBegin extracting 'squirrel' from storage/sqlite
Matt Joiner [Tue, 24 Aug 2021 07:52:31 +0000 (17:52 +1000)]
Begin extracting 'squirrel' from storage/sqlite

2 years agoAvoid reallocating keep alive timer on each pass v1.30.4
Matt Joiner [Sun, 22 Aug 2021 10:05:53 +0000 (20:05 +1000)]
Avoid reallocating keep alive timer on each pass

2 years agoDon't run linter on master branch
Matt Joiner [Sun, 22 Aug 2021 06:59:40 +0000 (16:59 +1000)]
Don't run linter on master branch

Super unimpressed with this pedantic rubbish. PRs to adjust the settings welcome.

2 years agoUpdate install command
Matt Joiner [Sun, 22 Aug 2021 05:52:35 +0000 (15:52 +1000)]
Update install command

2 years agoChange linter workflow branches and name v1.30.3
Matt Joiner [Thu, 19 Aug 2021 06:12:28 +0000 (16:12 +1000)]
Change linter workflow branches and name

2 years agoRemove unused code
Matt Joiner [Thu, 19 Aug 2021 06:06:46 +0000 (16:06 +1000)]
Remove unused code

2 years agoUpdate staticcheck go target to 1.16
Matt Joiner [Thu, 19 Aug 2021 06:06:24 +0000 (16:06 +1000)]
Update staticcheck go target to 1.16

2 years agoDisable excessively pedantic linters
Matt Joiner [Thu, 19 Aug 2021 06:05:58 +0000 (16:05 +1000)]
Disable excessively pedantic linters

2 years agoFix data race closing incoming PeerConn
Matt Joiner [Thu, 19 Aug 2021 03:35:52 +0000 (13:35 +1000)]
Fix data race closing incoming PeerConn

2 years agoSet direct sqlite storage conn to nil on close
Matt Joiner [Wed, 18 Aug 2021 06:56:05 +0000 (16:56 +1000)]
Set direct sqlite storage conn to nil on close

This might help catch the reason for SQLITE_MISUSE in getCapacity.

2 years agoRewrite peerConnMsgWriter.run
Matt Joiner [Wed, 18 Aug 2021 06:51:30 +0000 (16:51 +1000)]
Rewrite peerConnMsgWriter.run

2 years agoSet testing keep alive timeout to 1 millisecond
Matt Joiner [Wed, 18 Aug 2021 06:23:51 +0000 (16:23 +1000)]
Set testing keep alive timeout to 1 millisecond

If it's too fast, we get stuck trying to send keep alives rather than actually communicating with the peer.

2 years agoFix deadlock when checking whether to send keep alive
Matt Joiner [Wed, 18 Aug 2021 06:23:04 +0000 (16:23 +1000)]
Fix deadlock when checking whether to send keep alive

2 years agoLimit keep alives for rate limited download test
Matt Joiner [Wed, 18 Aug 2021 04:49:13 +0000 (14:49 +1000)]
Limit keep alives for rate limited download test

2 years agoFix race in assigning keep alive timer
Matt Joiner [Wed, 18 Aug 2021 04:48:25 +0000 (14:48 +1000)]
Fix race in assigning keep alive timer

2 years agoUse different keep alive timeout in tests
Matt Joiner [Wed, 18 Aug 2021 01:27:21 +0000 (11:27 +1000)]
Use different keep alive timeout in tests

Exposes bug found in email discussions resulting from https://github.com/anacrolix/torrent/discussions/547.

2 years agoAdd linter CI (#542)
Bora M. Alper [Mon, 16 Aug 2021 01:11:31 +0000 (04:11 +0300)]
Add linter CI (#542)

* Add linter CI

Signed-off-by: Bora M. Alper <bora@boramalper.org>
* Make gosec CI ignore SHA1 and upload sarif

Signed-off-by: Bora M. Alper <bora@boramalper.org>
* Fix formatting of source files

Signed-off-by: Bora M. Alper <bora@boramalper.org>
* Make go vet ignore unkeyed composite literals and fix other warnings

Signed-off-by: Bora M. Alper <bora@boramalper.org>
* Make staticcheck ignore unused methods and fix other warnings

Signed-off-by: Bora M. Alper <bora@boramalper.org>
* Use golangci-lint

Signed-off-by: Bora M. Alper <bora@boramalper.org>
2 years agoUse roaring.Bitmap directly for completed pieces
Matt Joiner [Mon, 16 Aug 2021 01:07:10 +0000 (11:07 +1000)]
Use roaring.Bitmap directly for completed pieces

Looking at improving the performance around this per https://github.com/anacrolix/torrent/discussions/547#discussion-3522317.

2 years agoSet go 1.17 in go.mod
Matt Joiner [Mon, 16 Aug 2021 00:38:43 +0000 (10:38 +1000)]
Set go 1.17 in go.mod

2 years agogo get -u
Matt Joiner [Mon, 16 Aug 2021 00:37:19 +0000 (10:37 +1000)]
go get -u

2 years agoFix mmap panic on darwin with Go 1.17 v1.30.2
Matt Joiner [Fri, 13 Aug 2021 04:02:37 +0000 (14:02 +1000)]
Fix mmap panic on darwin with Go 1.17

2 years agoDon't panic on int parse failures
Matt Joiner [Thu, 12 Aug 2021 03:46:02 +0000 (13:46 +1000)]
Don't panic on int parse failures

This means for UnmarshalTypeErrors we now include context. There are still some other error types remaining that are thrown up via panic.

2 years agoFix panic unmarshalling bencode dict into unsupported type v1.30.1
Matt Joiner [Thu, 12 Aug 2021 02:16:53 +0000 (12:16 +1000)]
Fix panic unmarshalling bencode dict into unsupported type

2 years agoFix allocation of empty DhtNodes in TorrentSpec
Matt Joiner [Wed, 11 Aug 2021 02:27:00 +0000 (12:27 +1000)]
Fix allocation of empty DhtNodes in TorrentSpec

https://github.com/anacrolix/torrent/pull/536#issuecomment-896392738

2 years agoFix race in sqlite direct storage init v1.30.0
Matt Joiner [Tue, 10 Aug 2021 23:43:40 +0000 (09:43 +1000)]
Fix race in sqlite direct storage init

There's a race between starting the blob flusher and assigning the timer to the storage client.

2 years agoReadme: Add downstream project (#543)
Alfonso Montero [Tue, 10 Aug 2021 01:13:00 +0000 (03:13 +0200)]
Readme: Add downstream project (#543)

2 years agoIncrease request update interval if there's no signalling
Matt Joiner [Sun, 1 Aug 2021 12:52:51 +0000 (22:52 +1000)]
Increase request update interval if there's no signalling

2 years agoMinimize allocations and resizing in request computation
Matt Joiner [Sun, 1 Aug 2021 12:02:40 +0000 (22:02 +1000)]
Minimize allocations and resizing in request computation

2 years agoPrecompute File.DisplayPath
Matt Joiner [Sun, 1 Aug 2021 12:01:24 +0000 (22:01 +1000)]
Precompute File.DisplayPath

This is an optimization for dir lookups in torrentfs.

2 years agocmd/torrentfs: Fix panic on missing info
Matt Joiner [Sun, 1 Aug 2021 11:38:35 +0000 (21:38 +1000)]
cmd/torrentfs: Fix panic on missing info

2 years agoTrim UDP tracker client read allocations v1.29.2
Matt Joiner [Mon, 26 Jul 2021 00:18:24 +0000 (10:18 +1000)]
Trim UDP tracker client read allocations

2 years agoClose torrent storage asynchronously on drop
Matt Joiner [Sat, 17 Jul 2021 09:10:07 +0000 (19:10 +1000)]
Close torrent storage asynchronously on drop

2 years agoAdd debug level to piece hash failure log message
Matt Joiner [Sat, 17 Jul 2021 08:52:41 +0000 (18:52 +1000)]
Add debug level to piece hash failure log message

2 years agoFix go:build directives v1.29.1
Matt Joiner [Wed, 14 Jul 2021 04:35:52 +0000 (14:35 +1000)]
Fix go:build directives

2 years agoRemove unused badges
Matt Joiner [Fri, 2 Jul 2021 04:43:13 +0000 (14:43 +1000)]
Remove unused badges