Skip to content

Commit

Permalink
Merge pull request #256 from candirugame/fix-stale-peer-sharing
Browse files Browse the repository at this point in the history
fix: unban dead URLs every 2 hours
  • Loading branch information
IsaacThoman authored Jan 31, 2025
2 parents 656a714 + 55a2a9f commit b07abca
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
6 changes: 4 additions & 2 deletions src/server/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ const defaults = {
SERVER_CLEANUP_INTERVAL: '1000',

// Peer settings
PEER_UPDATE_INTERVAL: '1', //update a stale peer from queue every x seconds
PEER_UPDATE_TICK_INTERVAL: '1', //update a stale peer from queue every x seconds
PEER_SHARE_INTERVAL: '300', //share peer list every 5 minutes
PEER_MAX_FAILED_ATTEMPTS: '5',
PEER_STALE_THRESHOLD: '120', //check peers every 2 minutes
PEER_MAX_SERVERS: '200', //max servers to keep track of in memory
PEER_HEALTHCHECK_RETRIES: '10',
PEER_HEALTHCHECK_INTERVAL: '30',
PEER_URL_FAILURE_FORGET_TIME: '7200', //forget failed urls after 2 hours

// Player settings
PLAYER_DISCONNECT_TIME: '10',
Expand Down Expand Up @@ -78,13 +79,14 @@ function parseConfig(env: Record<string, string>) {
cleanupInterval: parseInt(env.SERVER_CLEANUP_INTERVAL),
},
peer: {
updateInterval: parseInt(env.PEER_UPDATE_INTERVAL),
updateInterval: parseInt(env.PEER_UPDATE_TICK_INTERVAL),
shareInterval: parseInt(env.PEER_SHARE_INTERVAL),
maxFailedAttempts: parseInt(env.PEER_MAX_FAILED_ATTEMPTS),
staleThreshold: parseInt(env.PEER_STALE_THRESHOLD),
maxServers: parseInt(env.PEER_MAX_SERVERS),
healthcheckRetries: parseInt(env.PEER_HEALTHCHECK_RETRIES),
healthcheckInterval: parseInt(env.PEER_HEALTHCHECK_INTERVAL),
urlFailureForgetTime: parseInt(env.PEER_URL_FAILURE_FORGET_TIME),
},
game: {
mode: env.GAME_MODE,
Expand Down
15 changes: 13 additions & 2 deletions src/server/managers/PeerManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export class PeerManager {
private updateQueue: string[] = [];
private shareQueue: string[] = [];
private urlFailureCounts = new Map<string, number>();
private lastUrlFailureCountClearTime: number = 0;
healthSecret: string;
private serversFilePath = './servers.txt';

Expand Down Expand Up @@ -64,6 +65,17 @@ export class PeerManager {
this.processUpdateQueue();
this.processShareQueue();
this.checkStalePeers();

this.clearFailedUrlCounts();
}

private clearFailedUrlCounts() {
const now = Date.now() / 1000;
if (now - this.lastUrlFailureCountClearTime > config.peer.urlFailureForgetTime) {
this.urlFailureCounts.clear();
this.lastUrlFailureCountClearTime = now;
console.log('Cleared failed url counts');
}
}

private async processUpdateQueue() {
Expand Down Expand Up @@ -105,12 +117,11 @@ export class PeerManager {
try {
const peer = this.peers.find((p) => p.url === url);
const canShare = !peer || (Date.now() / 1000 - peer.lastShare) > config.peer.shareInterval;

if (canShare) {
const serverList = [
config.server.url,
...this.peers
.filter((p) => p.serverInfo && p.url !== config.server.url)
.filter((p) => p.serverInfo && p.url !== config.server.url) //don't include self again
.map((p) => p.url),
].slice(0, config.peer.maxServers);

Expand Down

0 comments on commit b07abca

Please sign in to comment.