Clear thumbnail handles as soon as possible
authorTim Düsterhus <duesterhus@woltlab.com>
Wed, 12 Aug 2020 13:55:02 +0000 (15:55 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Wed, 12 Aug 2020 13:57:48 +0000 (15:57 +0200)
commit993976795cfc182b0fc83d35592af1193323d320
tree2c6b81e0113ae4a9a9b3157ade13d3cf35b4575f
parentaec946fc640fb6f34ebec25b890b0cc83115cb7c
Clear thumbnail handles as soon as possible

This reproduces when rebuilding attachment thumbnails for largish animated
GIF files using ImageMagick. The ImageMagick on-disk cache quota is not
sufficient to hold:

1) The original
2) The tiny thumbnail
3) The in-progress regular thumbnail

The old value of the `$thumbnail` variable will only be destructed once (3)
returns. But the memory is already needed during execution of (3).

So this commit adjusts the code to `null` out the `$thumbnail` variable as
soon as possible, instead of waiting until it goes out of scope naturally.

Example stack trace from the worker:

    ImagickException: cache resources exhausted `/var/www/html/attachments/00/1-*snip*.bin' @ error/cache.c/OpenPixelCache/4083 in /var/www/html/lib/system/image/adapter/ImagickImageAdapter.class.php:132
    Stack trace:
    #0 /var/www/html/lib/system/image/adapter/ImagickImageAdapter.class.php(132): Imagick->cropthumbnailimage(352, 198)
    #1 /var/www/html/lib/system/image/adapter/ImageAdapter.class.php(82): wcf\system\image\adapter\ImagickImageAdapter->createThumbnail(352, 198, 0)
    #2 /var/www/html/lib/system/upload/DefaultUploadFileSaveStrategy.class.php(323): wcf\system\image\adapter\ImageAdapter->createThumbnail(352, 198, 0)
    #3 /var/www/html/lib/data/attachment/AttachmentAction.class.php(226): wcf\system\upload\DefaultUploadFileSaveStrategy->generateThumbnails(Object(wcf\data\attachment\Attachment))
    #4 /var/www/html/lib/data/AbstractDatabaseObjectAction.class.php(204): wcf\data\attachment\AttachmentAction->generateThumbnails()
    #5 /var/www/html/lib/system/worker/AttachmentRebuildDataWorker.class.php(48): wcf\data\AbstractDatabaseObjectAction->executeAction()
    #6 /var/www/html/lib/system/cli/command/WorkerCLICommand.class.php(152): wcf\system\worker\AttachmentRebuildDataWorker->execute()
    #7 /var/www/html/lib/system/CLIWCF.class.php(291): wcf\system\cli\command\WorkerCLICommand->execute(Array)
    #8 /var/www/html/lib/system/CLIWCF.class.php(85): wcf\system\CLIWCF->initCommands()
    #9 /var/www/html/cli.php(18): wcf\system\CLIWCF->__construct()
    #10 {main}
wcfsetup/install/files/lib/acp/form/StyleAddForm.class.php
wcfsetup/install/files/lib/data/style/StyleAction.class.php
wcfsetup/install/files/lib/system/upload/DefaultUploadFileSaveStrategy.class.php
wcfsetup/install/files/lib/system/worker/UserRebuildDataWorker.class.php
wcfsetup/install/files/lib/util/ImageUtil.class.php