fix: lock recent blockhash poll to prevent concurrent polling
This commit is contained in:
committed by
Justin Starry
parent
d6ecb2699f
commit
7aa8b1c658
@ -1377,6 +1377,7 @@ export class Connection {
|
|||||||
transactionSignatures: Array<string>,
|
transactionSignatures: Array<string>,
|
||||||
};
|
};
|
||||||
_disableBlockhashCaching: boolean = false;
|
_disableBlockhashCaching: boolean = false;
|
||||||
|
_pollingBlockhash: boolean = false;
|
||||||
_accountChangeSubscriptions: {[number]: AccountSubscriptionInfo} = {};
|
_accountChangeSubscriptions: {[number]: AccountSubscriptionInfo} = {};
|
||||||
_accountChangeSubscriptionCounter: number = 0;
|
_accountChangeSubscriptionCounter: number = 0;
|
||||||
_programAccountChangeSubscriptions: {
|
_programAccountChangeSubscriptions: {
|
||||||
@ -2478,6 +2479,10 @@ export class Connection {
|
|||||||
|
|
||||||
async _recentBlockhash(disableCache: boolean): Promise<Blockhash> {
|
async _recentBlockhash(disableCache: boolean): Promise<Blockhash> {
|
||||||
if (!disableCache) {
|
if (!disableCache) {
|
||||||
|
// Wait for polling to finish
|
||||||
|
while (this._pollingBlockhash) {
|
||||||
|
await sleep(100);
|
||||||
|
}
|
||||||
// Attempt to use a recent blockhash for up to 30 seconds
|
// Attempt to use a recent blockhash for up to 30 seconds
|
||||||
const expired =
|
const expired =
|
||||||
Date.now() - this._blockhashInfo.lastFetch >=
|
Date.now() - this._blockhashInfo.lastFetch >=
|
||||||
@ -2491,6 +2496,8 @@ export class Connection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _pollNewBlockhash(): Promise<Blockhash> {
|
async _pollNewBlockhash(): Promise<Blockhash> {
|
||||||
|
this._pollingBlockhash = true;
|
||||||
|
try {
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
for (let i = 0; i < 50; i++) {
|
for (let i = 0; i < 50; i++) {
|
||||||
const {blockhash} = await this.getRecentBlockhash('max');
|
const {blockhash} = await this.getRecentBlockhash('max');
|
||||||
@ -2512,6 +2519,9 @@ export class Connection {
|
|||||||
throw new Error(
|
throw new Error(
|
||||||
`Unable to obtain a new blockhash after ${Date.now() - startTime}ms`,
|
`Unable to obtain a new blockhash after ${Date.now() - startTime}ms`,
|
||||||
);
|
);
|
||||||
|
} finally {
|
||||||
|
this._pollingBlockhash = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user