CiviMail "DB error": suspected core bug relating to attachment replace api
Overview
In CiviMail, trying to send a Test mailing gives "Error - DB error - unknown error" on screen, see screenshot, and mail cannot be sent. Seems to be triggered by attachment replace api.
Reproduction steps
- Mailing -> New Mailing
- Proceed to mailing template (I am using Mosaico) and try to send a Test.
Current behaviour
Error in the Civi Log is:
Nov 17 12:28:40 [error] $Fatal Error Details = Array
(
[callback] => Array
(
[0] => CRM_Core_Error
[1] => exceptionHandler
)
[code] => -1
[message] => DB Error: unknown error
[mode] => 16
[debug_info] => ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not exist]
[type] => DB_Error
[user_info] => ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not exist]
[to_string] => [db_error: message="DB Error: unknown error" code=-1 mode=callback callback=CRM_Core_Error::exceptionHandler prefix="" info="ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not exist]"]
)
Nov 17 12:28:40 [debug] $backTrace = #0 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/Error.php(942): CRM_Core_Error::backtrace("backTrace", TRUE)
#1 /home/sclgulf/public_html/sclgulf/vendor/pear/pear-core-minimal/src/PEAR.php(944): CRM_Core_Error::exceptionHandler(Object(DB_Error))
#2 /home/sclgulf/public_html/sclgulf/vendor/pear/db/DB.php(977): PEAR_Error->__construct("DB Error: unknown error", -1, 16, (Array:2), "ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not ex...")
#3 /home/sclgulf/public_html/sclgulf/vendor/pear/pear-core-minimal/src/PEAR.php(575): DB_Error->__construct(-1, 16, (Array:2), "ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not ex...")
#4 /home/sclgulf/public_html/sclgulf/vendor/pear/pear-core-minimal/src/PEAR.php(223): PEAR->_raiseError(Object(DB_mysqli), NULL, -1, 16, (Array:2), "ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not ex...", "DB_Error", TRUE)
#5 /home/sclgulf/public_html/sclgulf/vendor/pear/db/DB/common.php(1913): PEAR->__call("raiseError", (Array:7))
#6 /home/sclgulf/public_html/sclgulf/vendor/pear/db/DB/mysqli.php(932): DB_common->raiseError(-1, NULL, NULL, "ROLLBACK TO SAVEPOINT civi_0 [nativecode=1305 ** SAVEPOINT civi_0 does not ex...", "1305 ** SAVEPOINT civi_0 does not exist")
#7 /home/sclgulf/public_html/sclgulf/vendor/pear/db/DB/mysqli.php(402): DB_mysqli->mysqliRaiseError()
#8 /home/sclgulf/public_html/sclgulf/vendor/pear/db/DB/common.php(1219): DB_mysqli->simpleQuery("ROLLBACK TO SAVEPOINT civi_0")
#9 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/packages/DB/DataObject.php(2696): DB_common->query("ROLLBACK TO SAVEPOINT civi_0")
#10 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/packages/DB/DataObject.php(1829): DB_DataObject->_query("ROLLBACK TO SAVEPOINT civi_0")
#11 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/DAO.php(445): DB_DataObject->query("ROLLBACK TO SAVEPOINT civi_0")
#12 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/Core/Transaction/Frame.php(153): CRM_Core_DAO->query("ROLLBACK TO SAVEPOINT civi_0")
#13 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/Core/Transaction/Manager.php(103): Civi\Core\Transaction\Frame->finish()
#14 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/Transaction.php(126): Civi\Core\Transaction\Manager->dec()
#15 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/Transaction.php(175): CRM_Core_Transaction->commit()
#16 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Subscriber/DynamicFKAuthorization.php(240): CRM_Core_Transaction->run(Object(Closure))
#17 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Subscriber/DynamicFKAuthorization.php(181): Civi\API\Subscriber\DynamicFKAuthorization->authorizeDelegate("get", "civicrm_mailing", "130", (Array:8))
#18 /home/sclgulf/public_html/sclgulf/vendor/symfony/event-dispatcher/EventDispatcher.php(214): Civi\API\Subscriber\DynamicFKAuthorization->onApiAuthorize(Object(Civi\API\Event\AuthorizeEvent), "civi.api.authorize", Object(Civi\Core\CiviEventDispatcher))
#19 /home/sclgulf/public_html/sclgulf/vendor/symfony/event-dispatcher/EventDispatcher.php(44): Symfony\Component\EventDispatcher\EventDispatcher->doDispatch((Array:5), "civi.api.authorize", Object(Civi\API\Event\AuthorizeEvent))
#20 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/Core/CiviEventDispatcher.php(129): Symfony\Component\EventDispatcher\EventDispatcher->dispatch("civi.api.authorize", Object(Civi\API\Event\AuthorizeEvent))
#21 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Kernel.php(219): Civi\Core\CiviEventDispatcher->dispatch("civi.api.authorize", Object(Civi\API\Event\AuthorizeEvent))
#22 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Kernel.php(148): Civi\API\Kernel->authorize(Object(Civi\API\Provider\MagicFunctionProvider), (Array:8))
#23 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Kernel.php(81): Civi\API\Kernel->runRequest((Array:8))
#24 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/api/api.php(22): Civi\API\Kernel->runSafe("Attachment", "get", (Array:4))
#25 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/api/v3/utils.php(1800): civicrm_api("Attachment", "get", (Array:4), (Array:5))
#26 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/api/v3/Generic.php(398): _civicrm_api3_generic_replace("Attachment", (Array:5))
#27 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Provider/MagicFunctionProvider.php(85): civicrm_api3_generic_replace((Array:8))
#28 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Kernel.php(150): Civi\API\Provider\MagicFunctionProvider->invoke((Array:8))
#29 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/Civi/API/Kernel.php(81): Civi\API\Kernel->runRequest((Array:8))
#30 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/api/api.php(22): Civi\API\Kernel->runSafe("Attachment", "replace", (Array:5))
#31 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Utils/REST.php(300): civicrm_api("Attachment", "replace", (Array:5))
#32 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Utils/REST.php(550): CRM_Utils_REST::process((Array:3), (Array:5))
#33 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/Invoke.php(278): CRM_Utils_REST::ajax()
#34 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/Invoke.php(68): CRM_Core_Invoke::runItem((Array:12))
#35 /home/sclgulf/public_html/sclgulf/vendor/civicrm/civicrm-core/CRM/Core/Invoke.php(36): CRM_Core_Invoke::_invoke((Array:3))
#36 /home/sclgulf/public_html/sclgulf/web/modules/contrib/civicrm/src/Civicrm.php(88): CRM_Core_Invoke::invoke((Array:3))
#37 /home/sclgulf/public_html/sclgulf/web/modules/contrib/civicrm/src/Controller/CivicrmController.php(80): Drupal\civicrm\Civicrm->invoke((Array:3))
#38 [internal function](): Drupal\civicrm\Controller\CivicrmController->main((Array:3), "")
#39 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array((Array:2), (Array:2))
#40 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/Render/Renderer.php(573): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#41 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#42 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext((Array:2), (Array:2))
#43 /home/sclgulf/public_html/sclgulf/vendor/symfony/http-kernel/HttpKernel.php(151): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#44 /home/sclgulf/public_html/sclgulf/vendor/symfony/http-kernel/HttpKernel.php(68): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#45 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/StackMiddleware/Session.php(57): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#46 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#47 /home/sclgulf/public_html/sclgulf/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#48 /home/sclgulf/public_html/sclgulf/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#49 /home/sclgulf/public_html/sclgulf/web/modules/contrib/shield/src/ShieldMiddleware.php(91): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#50 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\shield\ShieldMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#51 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#52 /home/sclgulf/public_html/sclgulf/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#53 /home/sclgulf/public_html/sclgulf/web/core/lib/Drupal/Core/DrupalKernel.php(708): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, TRUE)
#54 /home/sclgulf/public_html/sclgulf/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#55 {main}
Expected behaviour
Test mailing gets sent
Environment information
- Browser: Safari 14.0.1
- CiviCRM: 5.29.0
- PHP: 7.3_
- CMS: Drupal 8.96
- Database: 5.5.5-10.3.27-MariaDB
- Web Server: Apache
Comments
My developer says he thinks it is a core bug. "the error seems to be around transaction and how it's being rollbacked". He has done a temporary patch so that mailings can get sent:
[~/www/sclgulf/vendor/civicrm/civicrm-core/api/v3]# diff utils.php utils.php.orig
1800,1805c1800,1803
< if ($entity != 'Attachment') {
< $preexisting = civicrm_api($entity, 'get', $baseParams, $params);
< if (civicrm_error($preexisting)) {
< $transaction->rollback();
< return $preexisting;
< }
---
> $preexisting = civicrm_api($entity, 'get', $baseParams, $params);
> if (civicrm_error($preexisting)) {
> $transaction->rollback();
> return $preexisting;
Edited by bgm