DEV Community

rukrlf
rukrlf

Posted on

1

Magento 2 Instant Purchase module throws a TypeError on Load Test

I faced the below error when a load test was running, and it started to appear when around 10 users out of 50 are up on load test (initial LT round).

TypeError: Uncaught exception 'TypeError' with message 'Argument 2 passed to Magento\InstantPurchase\Model\PaymentMethodChoose\LastCreatedPaymentTokenChooser::buildSearchCriteria() must be of the type integer, null given, called in /var/www/magento/vendor/magento/module-instant-purchase/Model/PaymentMethodChoose/LastCreatedPaymentTokenChooser.php on line 78' in /var/www/magento/vendor/magento/module-instant-purchase/Model/PaymentMethodChoose/LastCreatedPaymentTokenChooser.php:92

This error was not appearing when it was testing manually.
Could be something to do with session storage on server, but I couldn't identify such. Redis max_concurrency was set to 20 in app/etc/env.php as well.

So when I was checking the code, Magento\InstantPurchase\CustomerData\InstantPurchase class takes Magento\Customer\Model\Session as a constructor parameter. Since this dependent Customer Session class has a bit lengthy constructor injection list itself, and by the nature of it, it loads all of them in its constructor as well, I thought sometimes it could be the problem so I used a proxy class to load it. I have seen in most places people load Magento\Customer\Model\SessionFactory class, when they have issues loading customer session when cache enabled but the purpose of the singleton usage of that class is kind of lost. So it's always better to use Proxy class.

Back to the original problem..
Below is how I injected proxy class into Magento\InstantPurchase\CustomerData\InstantPurchase

Created a custom module and using di.xml I included this;

<type name="Magento\InstantPurchase\CustomerData\InstantPurchase">
    <arguments>
        <argument name="customerSession" xsi:type="object">Magento\Customer\Model\Session\Proxy</argument>
    </arguments>
</type>
Enter fullscreen mode Exit fullscreen mode

Then ran the load test again for 100 users. No errors appeared. Earlier it was throwing the error when it started to hit 10 users.

But then, we ran a load with 700 users, then again the error started to appear. No idea why, if anyone of you have any idea, please share.

Then I had to use an around plugin like this;
Added this in di.xml

<type name="Magento\InstantPurchase\CustomerData\InstantPurchase">
    <plugin name="vendor_instant_purchase_cutomerdata_around" type="Vendor\CustomerSectionLoadFix\Plugin\CustomerData\InstantPurchaseAround" />
</type>
Enter fullscreen mode Exit fullscreen mode

app/code/Vendor/CustomerSectionLoadFix/Plugin/CustomerData/InstantPurchaseAround.php



<?php

namespace Vendor\CustomerSectionLoadFix\Plugin\CustomerData;

use Closure;
use Magento\Customer\Model\Session;
use Magento\InstantPurchase\CustomerData\InstantPurchase;

class InstantPurchaseAround
{
    /**
     * @var Session\Proxy
     */
    private $customerSession;

    /**
     * InstantPurchaseAround constructor.
     * @param Session\Proxy $customerSession
     */
    public function __construct(Session\Proxy $customerSession)
    {
        $this->customerSession = $customerSession;
    }

    /**
     * @param InstantPurchase $subject
     * @param Closure $proceed
     * @return array
     */
    public function aroundGetSectionData(
        InstantPurchase $subject,
        Closure $proceed
    ) {
        if (!$this->customerSession->getCustomer()->getId()) {
            return ['available' => false];
        }

        return $proceed();
    }
}

Please let me know if a you guys have a better solution
Enter fullscreen mode Exit fullscreen mode

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

AWS Q Developer image

Your AI Code Assistant

Generate and update README files, create data-flow diagrams, and keep your project fully documented. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay