yum
upgrades for production use, this is the repository for you.
Active subscription is required.
About Argento theme
The Argento theme by SwissUp Labs is one of the most popular themes for Magento 2.
It comes with a bunch of modules, including some for SEO purposes.
Should you use it? Now there is a big reason to say no. And here is why.
The disgraceful bug
There is a hidden disgrace with Argento products: a bug within SEO modules causes a continuous flush of your cache.
These modules are NOT PRODUCTION READY at all because they were poorly tested and allow for issues like this to exist.
Discovered in October 2019, their SEO module is responsible for flushing the FPC cache.
The discovery was possible thanks to Full Page Cache Warmer‘s log features,
which allow pinpointing modules responsible for clearing caches.
At the bottom of this post, you can find the relevant entry from cache warmer’s flush log which shows the issue: in one of Swissup’s SEO templates module cron tasks, swissup_seotemplates_generate cron
, there is flushCache
function, which is being called on schedule. The Swissup support had nothing to comment on its purpose and only had to say that this will be fixed in the new versions.
Having SEO modules by Swissup Labs is a risk to serious performance problems.
Even if you haven’t configured those modules and only have them installed, the cache flush will regularly happen.
How to check if you’re affected
List all SEO
modules using n98-magerun2
, e.g. n98-magerun2 dev:module:list | grep --ignore-case seo
.
If the output contains a number of Swissup modules, then you’re at risk of very poor performance, especially if your store is large and where it takes a long time to refill the entire cache.
| Swissup_SeoCanonical | 0.0.1 |
| Swissup_SeoCore | 0.0.1 |
| Swissup_SeoCrossLinks | 1.0.1 |
| Swissup_SeoHtmlSitemap | 1.0.0 |
| Swissup_SeoImages | 1.1.0 |
| Swissup_SeoPager | 0.0.1 |
| Swissup_SeoTemplates | 1.0.0 |
| Swissup_SeoUrls | 1.5.0 |
| Swissup_SeoXmlSitemap ...
The remedy
The solution is disabling the modules, or getting rid of poor quality theme altogether. To disable SEO modules by Swissup, you can use n98-magerun2
:
n98-magerun2 module:disable Swissup_SeoCanonical \
Swissup_SeoCore Swissup_SeoCrossLinks Swissup_SeoHtmlSitemap \
Swissup_SeoImages Swissup_SeoPager Swissup_SeoTemplates \
Swissup_SeoUrls Swissup_SeoXmlSitemap \
Swissup_RichSnippets Swissup_Hreflang
Or, disable modules without downtime, using clearmage2:
clearmage2 --disable 'Swissup_Seo*,Swissup_RichSnippets,Swissup_Hreflang'
Your mileage might vary depending on different SEO modules you might have.
The cache clear log
[2019-10-24 02:00:07] CacheWarmerFlushLogger.DEBUG: Clean cache {"mode":"all","tags":[],"backtrace":"#1 Mirasvit\\CacheWarmer\\Service\\CacheCleanService#000000004e3975920000000061b3a83b#->logCacheClean() called at [app/code/Mirasvit/CacheWarmer/Preference/Framework/Cache/Frontend/Decorator/TagScopePreference.php:41]
#2 Mirasvit\\CacheWarmer\\Preference\\Framework\\Cache\\Frontend\\Decorator\\TagScopePreference#000000004e396ffe0000000061b3a83b#->clean() called at [vendor/magento/framework/Cache/Frontend/Decorator/Bare.php:91]
#3 Magento\\Framework\\Cache\\Frontend\\Decorator\\Logger[Magento\\Framework\\Cache\\Frontend\\Decorator\\Bare]#000000004e396ff10000000061b3a83b#->clean() called at [vendor/magento/framework/Cache/Frontend/Decorator/Logger.php:47]
#4 Magento\\Framework\\Cache\\Frontend\\Decorator\\Logger#000000004e396ff10000000061b3a83b#->clean() called at [vendor/swissup/module-seo-templates/Model/Cron.php:205]
#5 Swissup\\SeoTemplates\\Model\\Cron#000000004e3975680000000061b3a83b#->flushCache() called at [vendor/swissup/module-seo-templates/Model/Cron.php:193]
#6 Swissup\\SeoTemplates\\Model\\Cron#000000004e3975680000000061b3a83b#->setupGenerationJob() called at [vendor/swissup/module-seo-templates/Model/Cron.php:137]
#7 Swissup\\SeoTemplates\\Model\\Cron#000000004e3975680000000061b3a83b#->init()
#8 call_user_func_array() called at [vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php:317]
#9 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor[Magento\\Cron\\Observer\\ProcessCronQueueObserver]#000000004e396f1a0000000061b3a83b#->_runJob() called at [vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php:737]
#10 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor[Magento\\Cron\\Observer\\ProcessCronQueueObserver]#000000004e396f1a0000000061b3a83b#->processPendingJobs() called at [vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php:243]
#11 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor[Magento\\Cron\\Observer\\ProcessCronQueueObserver]#000000004e396f1a0000000061b3a83b#->Magento\\Cron\\Observer\\{closure}() called at [vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php:272]
#12 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor[Magento\\Cron\\Observer\\ProcessCronQueueObserver]#000000004e396f1a0000000061b3a83b#->lockGroup() called at [vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php:244]
#13 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor[Magento\\Cron\\Observer\\ProcessCronQueueObserver]#000000004e396f1a0000000061b3a83b#->execute() called at [vendor/magento/framework/Interception/Interceptor.php:58]
#14 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor#000000004e396f1a0000000061b3a83b#->___callParent() called at [vendor/magento/framework/Interception/Interceptor.php:138]
#15 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor#000000004e396f1a0000000061b3a83b#->Magento\\Framework\\Interception\\{closure}() called at [vendor/magento/framework/Interception/Interceptor.php:153]
#16 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor#000000004e396f1a0000000061b3a83b#->___callPlugins() called at [generated/code/Magento/Cron/Observer/ProcessCronQueueObserver/Interceptor.php:26]
#17 Magento\\Cron\\Observer\\ProcessCronQueueObserver\\Interceptor#000000004e396f1a0000000061b3a83b#->execute() called at [vendor/magento/framework/Event/Invoker/InvokerDefault.php:72]
#18 Magento\\Framework\\Event\\Invoker\\InvokerDefault#000000004e396c050000000061b3a83b#->_callObserverMethod() called at [vendor/magento/framework/Event/Invoker/InvokerDefault.php:60]
#19 Magento\\Framework\\Event\\Invoker\\InvokerDefault#000000004e396c050000000061b3a83b#->dispatch() called at [vendor/magento/framework/Event/Manager.php:66]
#20 Magento\\Framework\\Event\\Manager#000000004e396c190000000061b3a83b#->dispatch() called at [generated/code/Magento/Framework/Event/Manager/Proxy.php:95]
#21 Magento\\Framework\\Event\\Manager\\Proxy#000000004e3963060000000061b3a83b#->dispatch() called at [vendor/magento/framework/App/Cron.php:86]
#22 Magento\\Framework\\App\\Cron#000000004e396c620000000061b3a83b#->launch() called at [vendor/magento/module-cron/Console/Command/CronCommand.php:117]
#23 Magento\\Cron\\Console\\Command\\CronCommand#000000004e39736a0000000061b3a83b#->execute() called at [vendor/symfony/console/Command/Command.php:255]
#24 Magento\\Cron\\Console\\Command\\CronCommand[Symfony\\Component\\Console\\Command\\Command]#000000004e39736a0000000061b3a83b#->run() called at [vendor/symfony/console/Application.php:893]
#25 Magento\\Framework\\Console\\Cli[Symfony\\Component\\Console\\Application]#000000004e3962130000000061b3a83b#->doRunCommand() called at [vendor/symfony/console/Application.php:262]
#26 Magento\\Framework\\Console\\Cli[Symfony\\Component\\Console\\Application]#000000004e3962130000000061b3a83b#->doRun() called at [vendor/magento/framework/Console/Cli.php:102]
#27 Magento\\Framework\\Console\\Cli#000000004e3962130000000061b3a83b#->doRun() called at [vendor/symfony/console/Application.php:145]
#28 Magento\\Framework\\Console\\Cli[Symfony\\Component\\Console\\Application]#000000004e3962130000000061b3a83b#->run() called at [bin/magento:23]