Merge pull request #1413 from SevInf/feat/future-leak-repro
test: Memory leak reproduction for futures
This commit is contained in:
commit
a131c8aa40
4 changed files with 39 additions and 6 deletions
|
@ -5,3 +5,4 @@ await createSuite('tokio-future')
|
||||||
await createSuite('serde')
|
await createSuite('serde')
|
||||||
await createSuite('tsfn')
|
await createSuite('tsfn')
|
||||||
await createSuite('buffer')
|
await createSuite('buffer')
|
||||||
|
await createSuite('returns-future')
|
||||||
|
|
26
memory-testing/returns-future.mjs
Normal file
26
memory-testing/returns-future.mjs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { createRequire } from 'module'
|
||||||
|
|
||||||
|
import { displayMemoryUsageFromNode } from './util.mjs'
|
||||||
|
|
||||||
|
const initialMemoryUsage = process.memoryUsage()
|
||||||
|
|
||||||
|
const require = createRequire(import.meta.url)
|
||||||
|
|
||||||
|
const api = require(`./index.node`)
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
let i = 1
|
||||||
|
// eslint-disable-next-line no-constant-condition
|
||||||
|
while (true) {
|
||||||
|
await api.returnsFuture()
|
||||||
|
if (i % 100000 === 0) {
|
||||||
|
displayMemoryUsageFromNode(initialMemoryUsage)
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((e) => {
|
||||||
|
console.error(e)
|
||||||
|
process.exit(1)
|
||||||
|
})
|
|
@ -171,3 +171,6 @@ pub fn buffer_pass_through(buffer: Buffer) -> Buffer {
|
||||||
pub fn array_buffer_pass_through(array_buffer: Uint8Array) -> Uint8Array {
|
pub fn array_buffer_pass_through(array_buffer: Uint8Array) -> Uint8Array {
|
||||||
array_buffer
|
array_buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[napi]
|
||||||
|
pub async fn returns_future() {}
|
||||||
|
|
|
@ -44,14 +44,19 @@ export async function createSuite(testFile, maxMemoryUsage) {
|
||||||
const stats = await container.stats()
|
const stats = await container.stats()
|
||||||
|
|
||||||
let shouldAssertMemoryUsage = false
|
let shouldAssertMemoryUsage = false
|
||||||
|
let initialMemoryUsage
|
||||||
const initialMemoryUsage = await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
|
const initialDate = Date.now()
|
||||||
stats.on('data', (d) => {
|
stats.on('data', (d) => {
|
||||||
const { memory_stats } = JSON.parse(d.toString('utf8'))
|
const { memory_stats } = JSON.parse(d.toString('utf8'))
|
||||||
resolve(memory_stats.usage)
|
if (Date.now() - initialDate > 10000 && !shouldAssertMemoryUsage) {
|
||||||
|
resolve()
|
||||||
|
initialMemoryUsage = memory_stats.usage
|
||||||
|
shouldAssertMemoryUsage = true
|
||||||
|
}
|
||||||
if (shouldAssertMemoryUsage && memory_stats?.usage) {
|
if (shouldAssertMemoryUsage && memory_stats?.usage) {
|
||||||
const memoryGrowth = memory_stats.usage - initialMemoryUsage
|
const memoryGrowth = memory_stats.usage - initialMemoryUsage
|
||||||
if (memoryGrowth > maxMemoryUsage ?? initialMemoryUsage) {
|
if (memoryGrowth > (maxMemoryUsage ?? initialMemoryUsage)) {
|
||||||
console.info(
|
console.info(
|
||||||
chalk.redBright(
|
chalk.redBright(
|
||||||
`Potential memory leak, memory growth: ${prettyBytes(
|
`Potential memory leak, memory growth: ${prettyBytes(
|
||||||
|
@ -72,8 +77,6 @@ export async function createSuite(testFile, maxMemoryUsage) {
|
||||||
|
|
||||||
await sleep(60000)
|
await sleep(60000)
|
||||||
|
|
||||||
shouldAssertMemoryUsage = true
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await container.stop()
|
await container.stop()
|
||||||
await container.remove()
|
await container.remove()
|
||||||
|
|
Loading…
Reference in a new issue