Skip to content

Commit 87bbf73

Browse files
committed
fix: reuse q in Queue
1 parent 881b845 commit 87bbf73

3 files changed

Lines changed: 39 additions & 30 deletions

File tree

packages/neuron-wallet/src/services/sync/block-listener.ts

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { BehaviorSubject } from 'rxjs'
1+
import { BehaviorSubject, Subscription } from 'rxjs'
22
import NodeService from '../node'
33
import Queue from './queue'
44
import RangeForCheck from './range-for-check'
@@ -12,6 +12,7 @@ export default class BlockListener {
1212
private rangeForCheck: RangeForCheck
1313
private currentBlockNumber: BlockNumber
1414
private interval: number = 5000
15+
private tipNumberListener: Subscription
1516

1617
constructor(
1718
lockHashes: string[],
@@ -21,7 +22,7 @@ export default class BlockListener {
2122
this.currentBlockNumber = new BlockNumber()
2223
this.rangeForCheck = new RangeForCheck()
2324

24-
tipNumberSubject.subscribe(async num => {
25+
this.tipNumberListener = tipNumberSubject.subscribe(async num => {
2526
if (num) {
2627
this.tipBlockNumber = parseInt(num, 10)
2728
}
@@ -50,11 +51,11 @@ export default class BlockListener {
5051
}
5152

5253
public stop = async () => {
54+
this.tipNumberListener.unsubscribe()
5355
if (!this.queue) {
5456
return
5557
}
5658
await this.queue.kill()
57-
await this.queue.get().remove(() => true)
5859
this.queue = null
5960
}
6061

@@ -74,10 +75,7 @@ export default class BlockListener {
7475
}
7576

7677
public regenerate = async (): Promise<void> => {
77-
if (this.queue) {
78-
if (this.queue.get().length() <= 0) {
79-
this.queue = undefined
80-
}
78+
if (this.queue && this.queue.get().length() > 0) {
8179
return
8280
}
8381

@@ -86,29 +84,26 @@ export default class BlockListener {
8684
const endBlockNumber: string = this.tipBlockNumber.toString()
8785

8886
// TODO: check this queue stopped
89-
const queue: Queue | undefined = this.generateQueue(startBlockNumber, endBlockNumber)
90-
91-
if (queue) {
92-
queue.process()
93-
}
87+
this.generateQueue(startBlockNumber, endBlockNumber)
9488
}
9589

9690
public generateQueue = (startBlockNumber: string, endBlockNumber: string): Queue | undefined => {
9791
if (BigInt(startBlockNumber) > BigInt(endBlockNumber)) {
9892
return undefined
9993
}
10094

101-
this.queue = new Queue(
102-
this.lockHashes,
103-
startBlockNumber,
104-
endBlockNumber,
105-
this.currentBlockNumber,
106-
this.rangeForCheck
107-
)
108-
109-
this.queue.get().drain(() => {
110-
this.queue = undefined
111-
})
95+
if (!this.queue) {
96+
this.queue = new Queue(
97+
this.lockHashes,
98+
startBlockNumber,
99+
endBlockNumber,
100+
this.currentBlockNumber,
101+
this.rangeForCheck
102+
)
103+
this.queue.process()
104+
} else {
105+
this.queue.reset(startBlockNumber, endBlockNumber)
106+
}
112107

113108
return this.queue
114109
}

packages/neuron-wallet/src/services/queue-adapter.ts renamed to packages/neuron-wallet/src/services/sync/queue-adapter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ export default class QueueAdapter {
2626
this.q.remove(callback)
2727
}
2828

29+
public removeAll = () => {
30+
this.remove(() => true)
31+
}
32+
2933
public pause = () => {
3034
this.q.pause()
3135
}

packages/neuron-wallet/src/services/sync/queue.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import RangeForCheck from './range-for-check'
44
import BlockNumber from './block-number'
55
import Utils from './utils'
66
import TransactionsService from '../transactions'
7-
import QueueAdapter from '../queue-adapter'
7+
import QueueAdapter from './queue-adapter'
88

99
export default class Queue {
1010
private q: any
@@ -39,10 +39,8 @@ export default class Queue {
3939
this.q = new QueueAdapter(this.getWorker(), this.concurrent)
4040
}
4141

42-
private regenerateQueue = async () => {
43-
this.kill()
44-
await Utils.sleep(3000)
45-
this.generateQueue()
42+
public cleanQueue = () => {
43+
this.q.removeAll()
4644
}
4745

4846
public setLockHashes = (lockHashes: string[]): void => {
@@ -78,7 +76,7 @@ export default class Queue {
7876

7977
public kill = () => {
8078
this.q.kill()
81-
this.q.remove(() => true)
79+
this.q.removeAll()
8280
}
8381

8482
public pipeline = async (blockNumbers: string[]) => {
@@ -109,7 +107,7 @@ export default class Queue {
109107
await this.currentBlockNumber.updateCurrent(BigInt(rangeFirstBlockHeader.number))
110108
await this.rangeForCheck.setRange([])
111109
await TransactionsService.deleteWhenFork(rangeFirstBlockHeader.number)
112-
await this.regenerateQueue()
110+
await this.cleanQueue()
113111
this.startBlockNumber = await this.currentBlockNumber.getCurrent()
114112
this.batchPush()
115113
} else if (checkResult.type === 'block-headers-not-match') {
@@ -133,6 +131,18 @@ export default class Queue {
133131
})
134132
}
135133

134+
public reset = (startBlockNumber: string, endBlockNumber: string) => {
135+
this.startBlockNumber = BigInt(startBlockNumber)
136+
this.endBlockNumber = BigInt(endBlockNumber)
137+
138+
if (this.startBlockNumber > this.endBlockNumber) {
139+
return
140+
}
141+
142+
this.q.removeAll()
143+
this.batchPush()
144+
}
145+
136146
public process = () => {
137147
if (this.startBlockNumber > this.endBlockNumber) {
138148
return undefined

0 commit comments

Comments
 (0)