Skip to content

Incorrect ratio tracking with multiple BitTorrent clients #81

@Psmths

Description

@Psmths

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions