Skip to content

Memory Leak in openFile() with uv Driver #88

Description

@Fneufneu

Hi,

I have a memory leak in my daemon and i think i found the cause: openFile().
Memory does not go up if i replace it with a new WritableResourceStream(\fopen($filename, 'w'));

Code to reproduce (taken from a amphp/socket issue)

<?php

use Revolt\EventLoop;
use Amp\File\File;
use function Amp\File\openFile;
use function Amp\Socket\listen;

require_once(__DIR__ . '/vendor/autoload.php');

EventLoop::repeat(10, function () {
    echo 'Counters: '. Test::$constructInc . ' - ' . Test::$destructInc . PHP_EOL;
    echo 'Memory: ' . round(memory_get_usage() / 1024, 2) . ' KB' . PHP_EOL;
});

Amp\async(function () {
    $uri = "tcp://127.0.0.1:1337";
    $server = listen($uri);
    $clients = new \WeakMap();
    while ($socket = $server->accept()) {
        $obj = new Test($socket);
        $clients[$obj] = true;
        EventLoop::queue($obj->run(...));
    }
})->await();

class Test
{
    public static int $constructInc = 0;
    public static int $destructInc = 0;
    public string $content;
    public ?File $file = null;

    public function __construct(private \Amp\Socket\ResourceSocket $socket)
    {
        $this->content = str_repeat('a', 2048);
        self::$constructInc++;
    }

    public function __destruct()
    {
        self::$destructInc++;
    }

    public function run()
    {
        $this->file = openFile(rtrim(sys_get_temp_dir(), '/') . '/leaktest-' . mt_rand(), 'w');
        Amp\delay(mt_rand(0, 3));
        $this->socket->write('bye');
        $this->socket->end();
        $this->file->close();
    }
}

Will show:

Counters: 0 - 0
Memory: 1313.06 KB
Counters: 4 - 3
Memory: 1638.35 KB
Counters: 4 - 3
Memory: 1638.35 KB
Counters: 13 - 12
Memory: 1645.09 KB
Counters: 22 - 18
Memory: 1768.31 KB
Counters: 43 - 42
Memory: 1670.28 KB
Counters: 43 - 42
Memory: 1670.28 KB
Counters: 43 - 42
Memory: 1670.28 KB
Counters: 134 - 117
Memory: 2259.37 KB
Counters: 231 - 219
Memory: 2141.72 KB
Counters: 267 - 266
Memory: 1791.28 KB
Counters: 267 - 266
Memory: 1791.28 KB
Counters: 347 - 328
Memory: 2424.6 KB
Counters: 425 - 422
Memory: 1946.41 KB
Counters: 425 - 424
Memory: 1860.41 KB
Counters: 425 - 424
Memory: 1860.41 KB
Counters: 425 - 424
Memory: 1860.41 KB

You can spam connections with: while : ; do (echo | nc localhost 1337 ) & sleep .1 ; done

The memory will grow up until 128M default max limit and the process will crash.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions