Fix leaderboard out of memory error with batchedWaitAll instead of Promise.all
This commit is contained in:
		
							parent
							
								
									ff92338873
								
							
						
					
					
						commit
						fe98a61e43
					
				
							
								
								
									
										18
									
								
								common/util/promise.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								common/util/promise.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | export const batchedWaitAll = async <T>( | ||||||
|  |   createPromises: (() => Promise<T>)[], | ||||||
|  |   batchSize = 10 | ||||||
|  | ) => { | ||||||
|  |   const numBatches = Math.ceil(createPromises.length / batchSize) | ||||||
|  |   const result: T[] = [] | ||||||
|  |   for (let batchIndex = 0; batchIndex < numBatches; batchIndex++) { | ||||||
|  |     const from = batchIndex * batchSize | ||||||
|  |     const to = from + batchSize | ||||||
|  | 
 | ||||||
|  |     const promises = createPromises.slice(from, to).map((f) => f()) | ||||||
|  | 
 | ||||||
|  |     const batch = await Promise.all(promises) | ||||||
|  |     result.push(...batch) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return result | ||||||
|  | } | ||||||
|  | @ -5,6 +5,7 @@ import * as _ from 'lodash' | ||||||
| import { getValues } from './utils' | import { getValues } from './utils' | ||||||
| import { Contract } from '../../common/contract' | import { Contract } from '../../common/contract' | ||||||
| import { Bet } from '../../common/bet' | import { Bet } from '../../common/bet' | ||||||
|  | import { batchedWaitAll } from '../../common/util/promise' | ||||||
| 
 | 
 | ||||||
| const firestore = admin.firestore() | const firestore = admin.firestore() | ||||||
| 
 | 
 | ||||||
|  | @ -17,8 +18,8 @@ export const updateContractMetrics = functions.pubsub | ||||||
|       firestore.collection('contracts') |       firestore.collection('contracts') | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     await Promise.all( |     await batchedWaitAll( | ||||||
|       contracts.map(async (contract) => { |       contracts.map((contract) => async () => { | ||||||
|         const volume24Hours = await computeVolumeFrom(contract, oneDay) |         const volume24Hours = await computeVolumeFrom(contract, oneDay) | ||||||
|         const volume7Days = await computeVolumeFrom(contract, oneDay * 7) |         const volume7Days = await computeVolumeFrom(contract, oneDay * 7) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ import { Contract } from '../../common/contract' | ||||||
| import { Bet } from '../../common/bet' | import { Bet } from '../../common/bet' | ||||||
| import { User } from '../../common/user' | import { User } from '../../common/user' | ||||||
| import { calculatePayout } from '../../common/calculate' | import { calculatePayout } from '../../common/calculate' | ||||||
|  | import { batchedWaitAll } from '../../common/util/promise' | ||||||
| 
 | 
 | ||||||
| const firestore = admin.firestore() | const firestore = admin.firestore() | ||||||
| 
 | 
 | ||||||
|  | @ -22,8 +23,8 @@ export const updateUserMetrics = functions.pubsub | ||||||
|       contracts.map((contract) => [contract.id, contract]) |       contracts.map((contract) => [contract.id, contract]) | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     await Promise.all( |     await batchedWaitAll( | ||||||
|       users.map(async (user) => { |       users.map((user) => async () => { | ||||||
|         const [investmentValue, creatorVolume] = await Promise.all([ |         const [investmentValue, creatorVolume] = await Promise.all([ | ||||||
|           computeInvestmentValue(user, contractsDict), |           computeInvestmentValue(user, contractsDict), | ||||||
|           computeTotalPool(user, contractsDict), |           computeTotalPool(user, contractsDict), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user