From ef10316fa00cfc9df980718c97ec25b3b5bd1091 Mon Sep 17 00:00:00 2001
From: Cristian Partica <cpartica@magento.com>
Date: Fri, 13 Jan 2017 10:44:50 -0600
Subject: [PATCH] MAGETWO-58924: SQL error wait timeout error when saving
 categories

- fix singleton resource
---
 .../Model/Map/DataCategoryHashMap.php           | 17 +++++++++--------
 .../Unit/Model/Map/DataCategoryHashMapTest.php  | 17 +++++++++++++----
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php
index ece8b203395..668517f46d8 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Map/DataCategoryHashMap.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\CatalogUrlRewrite\Model\Map;
 
-use Magento\Catalog\Model\ResourceModel\Category;
+use Magento\Catalog\Model\ResourceModel\CategoryFactory;
 use Magento\Catalog\Model\CategoryRepository;
 use Magento\Catalog\Api\Data\CategoryInterface;
 
@@ -20,19 +20,19 @@ class DataCategoryHashMap implements HashMapInterface
     /** @var CategoryRepository */
     private $categoryRepository;
 
-    /** @var Category */
-    private $categoryResource;
+    /** @var CategoryFactory */
+    private $categoryResourceFactory;
 
     /**
      * @param CategoryRepository $categoryRepository
-     * @param Category $categoryResource
+     * @param CategoryFactory $categoryResourceFactory
      */
     public function __construct(
         CategoryRepository $categoryRepository,
-        Category $categoryResource
+        CategoryFactory $categoryResourceFactory
     ) {
         $this->categoryRepository = $categoryRepository;
-        $this->categoryResource = $categoryResource;
+        $this->categoryResourceFactory = $categoryResourceFactory;
     }
 
     /**
@@ -70,9 +70,10 @@ class DataCategoryHashMap implements HashMapInterface
      */
     private function getAllCategoryChildrenIds(CategoryInterface $category)
     {
-        $connection = $this->categoryResource->getConnection();
+        $categoryResource = $this->categoryResourceFactory->create();
+        $connection = $categoryResource->getConnection();
         $select = $connection->select()
-            ->from($this->categoryResource->getEntityTable(), 'entity_id')
+            ->from($categoryResource->getEntityTable(), 'entity_id')
             ->where($connection->quoteIdentifier('path') . ' LIKE :c_path');
         $bind = ['c_path' => $category->getPath() . '%'];
         return $connection->fetchCol($select, $bind);
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/DataCategoryHashMapTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/DataCategoryHashMapTest.php
index 1aa6276742b..52d65710fed 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/DataCategoryHashMapTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/DataCategoryHashMapTest.php
@@ -5,7 +5,8 @@
  */
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model\Map;
 
-use Magento\Catalog\Model\ResourceModel\Category as CategoryResource;
+use Magento\Catalog\Model\ResourceModel\CategoryFactory;
+use Magento\Catalog\Model\ResourceModel\Category;
 use Magento\Framework\DB\Select;
 use Magento\Catalog\Model\CategoryRepository;
 use Magento\Catalog\Api\Data\CategoryInterface;
@@ -21,7 +22,10 @@ class DataCategoryHashMapTest extends \PHPUnit_Framework_TestCase
     /** @var CategoryRepository|\PHPUnit_Framework_MockObject_MockObject */
     private $categoryRepository;
 
-    /** @var CategoryResource|\PHPUnit_Framework_MockObject_MockObject */
+    /** @var CategoryResourceFactory|\PHPUnit_Framework_MockObject_MockObject */
+    private $categoryResourceFactory;
+
+    /** @var Category|\PHPUnit_Framework_MockObject_MockObject */
     private $categoryResource;
 
     /** @var DataCategoryHashMap|\PHPUnit_Framework_MockObject_MockObject */
@@ -30,19 +34,24 @@ class DataCategoryHashMapTest extends \PHPUnit_Framework_TestCase
     protected function setUp()
     {
         $this->categoryRepository = $this->getMock(CategoryRepository::class, [], [], '', false);
+        $this->categoryResourceFactory = $this->getMock(CategoryFactory::class, ['create'], [], '', false);
         $this->categoryResource = $this->getMock(
-            CategoryResource::class,
+            Category::class,
             ['getConnection', 'getEntityTable'],
             [],
             '',
             false
         );
 
+        $this->categoryResourceFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->categoryResource);
+
         $this->model = (new ObjectManager($this))->getObject(
             DataCategoryHashMap::class,
             [
                 'categoryRepository' => $this->categoryRepository,
-                'categoryResource' => $this->categoryResource
+                'categoryResourceFactory' => $this->categoryResourceFactory
             ]
         );
     }
-- 
GitLab