This commit is contained in:
Benjamin Wilson
2025-02-26 09:50:42 -05:00
parent bd5333a725
commit fd24807c55
2 changed files with 16 additions and 25 deletions
@@ -8,7 +8,9 @@ import { ClientStatisticsEntity } from './client-statistics.entity';
@Injectable() @Injectable()
export class ClientStatisticsService { export class ClientStatisticsService {
private bulkAsyncUpdates: Partial<ClientStatisticsEntity>[] = []; private bulkAsyncUpdates: {
[key: string]: Partial<ClientStatisticsEntity>
} = {};
constructor( constructor(
@@ -30,26 +32,21 @@ export class ClientStatisticsService {
// }); // });
// } // }
public updateBulkAsync(clientStatistic: Partial<ClientStatisticsEntity>, lastSeenIndex: number) { public updateBulkAsync(clientStatistic: Partial<ClientStatisticsEntity>) {
this.bulkAsyncUpdates[clientStatistic.client + clientStatistic.time.toString()] = clientStatistic;
if(this.bulkAsyncUpdates.length > lastSeenIndex && this.bulkAsyncUpdates[lastSeenIndex].clientId == clientStatistic.clientId && this.bulkAsyncUpdates[lastSeenIndex].time == clientStatistic.time){
this.bulkAsyncUpdates[lastSeenIndex].shares = clientStatistic.shares;
this.bulkAsyncUpdates[lastSeenIndex].acceptedCount = clientStatistic.acceptedCount;
return lastSeenIndex;
}
return this.bulkAsyncUpdates.push(clientStatistic) - 1;
} }
public async doBulkAsyncUpdate(){ public async doBulkAsyncUpdate(){
if(this.bulkAsyncUpdates.length < 1){ if(Object.keys(this.bulkAsyncUpdates).length < 1){
console.log('No client stats to update.') console.log('No client stats to update.')
return; return;
} }
// Step 1: Prepare data for bulk update // Step 1: Prepare data for bulk update
const values = this.bulkAsyncUpdates.map(stat => const values = Object.entries(this.bulkAsyncUpdates).map(([key, value]) => {
`('${stat.clientId}', ${stat.time}, ${stat.shares ?? 0}, ${stat.acceptedCount ?? 0}, NOW())` return `('${value.clientId}', ${value.time}, ${value.shares}, ${value.acceptedCount}, NOW())`
).join(','); }).join(',');
const query = ` const query = `
DO $$ DO $$
@@ -83,7 +80,7 @@ export class ClientStatisticsService {
throw error; throw error;
} }
this.bulkAsyncUpdates = []; this.bulkAsyncUpdates = {};
} }
public async insert(clientStatistic: Partial<ClientStatisticsEntity>) { public async insert(clientStatistic: Partial<ClientStatisticsEntity>) {
+4 -10
View File
@@ -14,9 +14,6 @@ export class StratumV1ClientStatistics {
private submissionCache: { time: Date, difficulty: number }[] = []; private submissionCache: { time: Date, difficulty: number }[] = [];
private currentTimeSlot: number = null; private currentTimeSlot: number = null;
private lastSave: number = null;
private bulkUpdateIndex = 0;
constructor( constructor(
private readonly clientStatisticsService: ClientStatisticsService, private readonly clientStatisticsService: ClientStatisticsService,
@@ -43,7 +40,6 @@ export class StratumV1ClientStatistics {
difficulty: targetDifficulty, difficulty: targetDifficulty,
}); });
if (this.currentTimeSlot == null) { if (this.currentTimeSlot == null) {
// First record, insert it // First record, insert it
this.currentTimeSlot = timeSlot; this.currentTimeSlot = timeSlot;
@@ -58,16 +54,15 @@ export class StratumV1ClientStatistics {
clientName: client.clientName, clientName: client.clientName,
sessionId: client.sessionId sessionId: client.sessionId
}); });
this.lastSave = new Date().getTime();
} else if (this.currentTimeSlot != timeSlot) { } else if (this.currentTimeSlot != timeSlot) {
// Transitioning to a new time slot, // Transitioning to a new time slot,
// First update the old time slot with the latest data // First update the old time slot with the latest data
this.bulkUpdateIndex = this.clientStatisticsService.updateBulkAsync({ this.clientStatisticsService.updateBulkAsync({
time: this.currentTimeSlot, time: this.currentTimeSlot,
clientId: client.id, clientId: client.id,
shares: this.shares, shares: this.shares,
acceptedCount: this.acceptedCount, acceptedCount: this.acceptedCount,
}, this.bulkUpdateIndex); });
// Set the new time slot and add incoming shares then insert it // Set the new time slot and add incoming shares then insert it
this.currentTimeSlot = timeSlot; this.currentTimeSlot = timeSlot;
this.shares = targetDifficulty; this.shares = targetDifficulty;
@@ -81,18 +76,17 @@ export class StratumV1ClientStatistics {
clientName: client.clientName, clientName: client.clientName,
sessionId: client.sessionId sessionId: client.sessionId
}); });
this.lastSave = new Date().getTime();
} else { } else {
// Accept the shares if none of the prior conditions are met, // Accept the shares if none of the prior conditions are met,
// saving to memory for storing later // saving to memory for storing later
this.shares += targetDifficulty; this.shares += targetDifficulty;
this.acceptedCount++; this.acceptedCount++;
this.bulkUpdateIndex = this.clientStatisticsService.updateBulkAsync({ this.clientStatisticsService.updateBulkAsync({
time: this.currentTimeSlot, time: this.currentTimeSlot,
clientId: client.id, clientId: client.id,
shares: this.shares, shares: this.shares,
acceptedCount: this.acceptedCount, acceptedCount: this.acceptedCount,
}, this.bulkUpdateIndex); });
} }
} }