@@ -38,6 +38,9 @@ export class TransactionDB {
38
38
private static cancelledTransactionsKey = `transaction:cancelled` ;
39
39
private static erroredTransactionsKey = `transaction:errored` ;
40
40
41
+ // ioredis has limits over 100k+ (source: https://github.com/redis/ioredis/issues/801).
42
+ private static REDIS_BATCH_SIZE = 100_000 ;
43
+
41
44
/**
42
45
* Inserts or replaces a transaction details.
43
46
* Also adds to the appropriate "status" sorted set.
@@ -109,13 +112,17 @@ export class TransactionDB {
109
112
return [ ] ;
110
113
}
111
114
112
- const keys = queueIds . map ( this . transactionDetailsKey ) ;
113
- const vals = await redis . mget ( ...keys ) ;
114
-
115
115
const result : AnyTransaction [ ] = [ ] ;
116
- for ( const val of vals ) {
117
- if ( val ) {
118
- result . push ( superjson . parse ( val ) ) ;
116
+ for ( let i = 0 ; i < queueIds . length ; i += this . REDIS_BATCH_SIZE ) {
117
+ const keys = queueIds
118
+ . slice ( i , i + this . REDIS_BATCH_SIZE )
119
+ . map ( this . transactionDetailsKey ) ;
120
+ const vals = await redis . mget ( ...keys ) ;
121
+
122
+ for ( const val of vals ) {
123
+ if ( val ) {
124
+ result . push ( superjson . parse ( val ) ) ;
125
+ }
119
126
}
120
127
}
121
128
return result ;
@@ -131,8 +138,14 @@ export class TransactionDB {
131
138
return 0 ;
132
139
}
133
140
134
- const keys = queueIds . map ( this . transactionDetailsKey ) ;
135
- return await redis . unlink ( ...keys ) ;
141
+ let numDeleted = 0 ;
142
+ for ( let i = 0 ; i < queueIds . length ; i += this . REDIS_BATCH_SIZE ) {
143
+ const keys = queueIds
144
+ . slice ( i , i + this . REDIS_BATCH_SIZE )
145
+ . map ( this . transactionDetailsKey ) ;
146
+ numDeleted += await redis . unlink ( ...keys ) ;
147
+ }
148
+ return numDeleted ;
136
149
} ;
137
150
138
151
/**
0 commit comments