sqtracker
sqtracker copied to clipboard
Incorrect ratio tracking with multiple BitTorrent clients
I have encountered an issue with ratio tracking in the event that users are seeding from multiple BitTorrent clients. I think that this is caused by ratio for each torrent being tracked only by userId
, and conflicting information between multiple clients under the same userId
were causing the upload/download to increase indefinitely.
I was able to fix this issue by adding a peerId
field to the schema:
const Progress = new mongoose.Schema({
infoHash: String,
userId: mongoose.Schema.ObjectId,
peerId: String,
uploaded: {
session: Number,
total: Number,
},
downloaded: {
session: Number,
total: Number,
},
left: Number,
});
And updating the announce API endpoint as follows:
const peerId = params.peer_id // Grabbing the peer ID from the announce query
const prevProgressRecord = await Progress.findOne({
userId: user._id,
peerId: peerId,
infoHash,
}).lean();
...
await Progress.findOneAndUpdate(
{ userId: user._id, peerId: peerId, infoHash },
{
$set: {
userId: user._id,
infoHash,
uploaded: {
session: uploaded,
total:
(prevProgressRecord?.uploaded?.total ?? 0) + uploadDeltaSession,
},
left: Number(params.left),
},
},
{ upsert: true }
);
Since making these changes it seems that ratio has been tracked correctly.
A possible issue with this is that the Peer ID changes when a BitTorrent client is restarted, and I believe some clients also change their Peer ID during runtime occasionally which could lead to a large amount of entries over time.