From c897a6413eadd90a7f595fcd95deca868a811e6a Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Fri, 11 Aug 2023 09:19:26 -0400 Subject: [PATCH] WITHOUT ROWID --- src/ORM/client/client.entity.ts | 25 ++++++++++++++---------- src/models/StratumV1Client.ts | 31 ++++++++++++++++++++++-------- src/services/stratum-v1.service.ts | 5 ----- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/ORM/client/client.entity.ts b/src/ORM/client/client.entity.ts index 4210036..5787362 100644 --- a/src/ORM/client/client.entity.ts +++ b/src/ORM/client/client.entity.ts @@ -1,27 +1,32 @@ -import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, Entity, Index, PrimaryColumn } from 'typeorm'; import { DateTimeTransformer } from '../utils/DateTimeTransformer'; import { TrackedEntity } from '../utils/TrackedEntity.entity'; -@Entity() +//https://www.sqlite.org/withoutrowid.html + +//The WITHOUT ROWID optimization is likely to be helpful for tables that have non-integer +// or composite (multi-column) PRIMARY KEYs and that do not store large strings or BLOBs. +//WITHOUT ROWID tables work best when individual rows are not too large. +@Entity({ withoutRowid: true }) +@Index(['address', 'clientName', 'sessionId'], { unique: true }) export class ClientEntity extends TrackedEntity { - @PrimaryGeneratedColumn() - id: number; - - @Column({ length: 62, type: 'varchar' }) + @PrimaryColumn({ length: 62, type: 'varchar' }) address: string; - @Column({ length: 64, type: 'varchar' }) + @PrimaryColumn({ length: 64, type: 'varchar' }) clientName: string; + @PrimaryColumn({ length: 8, type: 'varchar' }) + sessionId: string; + + @Column({ length: 128, type: 'varchar', nullable: true }) userAgent: string; - @Index() - @Column({ length: 8, type: 'varchar', unique: true }) - sessionId: string; + @Column({ type: 'datetime', transformer: new DateTimeTransformer() }) startTime: Date; diff --git a/src/models/StratumV1Client.ts b/src/models/StratumV1Client.ts index 96989d2..5960f86 100644 --- a/src/models/StratumV1Client.ts +++ b/src/models/StratumV1Client.ts @@ -41,7 +41,9 @@ export class StratumV1Client { private stratumInitialized = false; private usedSuggestedDifficulty = false; private sessionDifficulty: number = 16384; + private entity: ClientEntity; + private creatingEntity: Promise; public extraNonceAndSessionId: string; public sessionStart: Date; @@ -416,14 +418,27 @@ export class StratumV1Client { private async handleMiningSubmission(submission: MiningSubmitMessage) { if (this.entity == null) { - this.entity = await this.clientService.insert({ - sessionId: this.extraNonceAndSessionId, - address: this.clientAuthorization.address, - clientName: this.clientAuthorization.worker, - userAgent: this.clientSubscription.userAgent, - startTime: new Date(), - bestDifficulty: 0 - }); + if (this.creatingEntity == null) { + this.creatingEntity = new Promise(async (resolve, reject) => { + try { + this.entity = await this.clientService.insert({ + sessionId: this.extraNonceAndSessionId, + address: this.clientAuthorization.address, + clientName: this.clientAuthorization.worker, + userAgent: this.clientSubscription.userAgent, + startTime: new Date(), + bestDifficulty: 0 + }); + } catch (e) { + reject(e); + } + resolve(); + }); + await this.creatingEntity; + + } else { + await this.creatingEntity; + } } diff --git a/src/services/stratum-v1.service.ts b/src/services/stratum-v1.service.ts index fbfd729..11cdcdc 100644 --- a/src/services/stratum-v1.service.ts +++ b/src/services/stratum-v1.service.ts @@ -42,11 +42,6 @@ export class StratumV1Service implements OnModuleInit { private startSocketServer() { const server = new Server(async (socket: Socket) => { - // socket.setTimeout(5000, () => { - // console.log(`Client ${client.extraNonceAndSessionId} timeout`); - // socket.destroy(); - // }); - const client = new StratumV1Client( socket, this.stratumV1JobsService,