Problem/Motivation

There are several existing issues related to this error during installation:

PHP Fatal error: Call to a member function hasTranslation() on null in .../docroot/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php on line 47

but I believe I have a straight forward way of reproducing it. These are the steps I took:

  1. Fresh site install (I was on 8.2.2) only extra module I enabled was admin_toolbar
  2. Edit Basic Page content type and add a File field (I added pdf to allowed extensions)
  3. Create a new Basic Page with a file attached and Save and publish (I chose a small pdf, but I don't believe filetype matters)
  4. Edit the page that was just created, then click Save and keep published. This creates a new revision which also increases the file use count to 2
  5. Enable multiversion

Proposed resolution

Drupal core has had file usage problems for years (ex. https://www.drupal.org/node/1239558) so I don't know if this is even a bug in multiversion, or a residual effect of existing core issues. This is a workaround I tried that is far from a good solution, but helped me feel confident that the problem was related to file fields with usage counts greater than 1:

  // Get all fids of published files
  $query = \Drupal::entityQuery('file')->condition('status', 1);
  $result = $query->execute();

  // Load all the files
  $files = \Drupal::entityTypeManager()->getStorage('file')->loadMultiple(array_keys($result));
  $file_usage = \Drupal::service('file.usage');

  // Delete all file usages greater than 1
  foreach ($files as $file) {
    $list = $file_usage->listUsage($file);
    if (!empty($list)) {
      foreach ($list as $modname => $objtypes) {
        foreach ($objtypes as $objtype => $objids) {
          foreach ($objids as $objid => $count) {
            if ($count > 1) {
              $file_usage->delete($file, $modname, $objtype, $objid, $count - 1);
            }
          }
        }
      }
    }
  }

This just goes through all files and deletes any file usages with use count > 1. After running that code on my site with a lot of files (and even file_entity installed as well), I was able to get past the error. This would most likely break being able to go back to old revisions, and cause who knows what other problems, but again, was just to see if it could act as a workaround.

Remaining tasks

Would someone please verify they are able to reproduce the problem in the way that I described? Any thoughts on what the core issue may be? Better workaround or fix?

Thanks,
Mustafa

Comments

mabdullah2010 created an issue. See original summary.

mabdullah2010’s picture

Issue summary: View changes
jeqq’s picture

@mabdullah2010 I think this issue is related to #2825477: ContentEntityStorageTrait uses current entity as original, which breaks things and the problem is in $entity->original, not file usage. At least for me, deleting file usages for revisions doesn't look like a solution.

mabdullah2010’s picture

@jeqq You're correct about the problem ultimately being due to $entity->original being null. In my specific situation, deleting the file usage count avoids this problem from occurring, but yes, it is definitely not a solution. I was just stating that in case it helped to track down the exact cause. I think, like you said, that it is another version of the issue you posted. Thanks.

weynhamz’s picture

Spent couple of hours on this issue, clearly it is in core, as can be seen from the call stack.

@jeqq, I have tried and tested you patches on the multiversion's override store class, but the problem facing is no-relevant to that part of code.

Error: Call to a member function hasTranslation() on null in /var/www/hikd/docroot/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php on line 47 #0 /var/www/hikd/docroot/core/lib/Drupal/Core/Field/FieldItemList.php(244): Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem->preSave()
#1 /var/www/hikd/docroot/core/lib/Drupal/Core/Field/FieldItemList.php(202): Drupal\Core\Field\FieldItemList->delegateMethod('preSave')
#2 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(479): Drupal\Core\Field\FieldItemList->preSave()
#3 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(429): Drupal\Core\Entity\ContentEntityStorageBase->invokeFieldMethod('preSave', Object(Drupal\file\Entity\File))
#4 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/EntityStorageBase.php(439): Drupal\Core\Entity\ContentEntityStorageBase->invokeHook('presave', Object(Drupal\file\Entity\File))
#5 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(298): Drupal\Core\Entity\EntityStorageBase->doPreSave(Object(Drupal\file\Entity\File))
#6 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/EntityStorageBase.php(389): Drupal\Core\Entity\ContentEntityStorageBase->doPreSave(Object(Drupal\file\Entity\File))
#7 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php(768): Drupal\Core\Entity\EntityStorageBase->save(Object(Drupal\file\Entity\File))
#8 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/Entity.php(364): Drupal\Core\Entity\Sql\SqlContentEntityStorage->save(Object(Drupal\file\Entity\File))
#9 /var/www/hikd/docroot/core/modules/file/src/FileUsage/FileUsageBase.php(32): Drupal\Core\Entity\Entity->save()
#10 /var/www/hikd/docroot/core/modules/file/src/FileUsage/DatabaseFileUsageBackend.php(92): Drupal\file\FileUsage\FileUsageBase->delete(Object(Drupal\file\Entity\File), 'file', 'media', '1', 0)
#11 /var/www/hikd/docroot/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php(88): Drupal\file\FileUsage\DatabaseFileUsageBackend->delete(Object(Drupal\file\Entity\File), 'file', 'media', '1', 0)
#12 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(479): Drupal\file\Plugin\Field\FieldType\FileFieldItemList->delete()
#13 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(341): Drupal\Core\Entity\ContentEntityStorageBase->invokeFieldMethod('delete', Object(Drupal\media_entity\Entity\Media))
#14 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/EntityStorageBase.php(363): Drupal\Core\Entity\ContentEntityStorageBase->doDelete(Array)
#15 /var/www/hikd/docroot/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php(717): Drupal\Core\Entity\EntityStorageBase->delete(Array)
#16 /var/www/hikd/docroot/modules/contrib/multiversion/src/MultiversionMigration.php(143): Drupal\Core\Entity\Sql\SqlContentEntityStorage->delete(Array)
#17 /var/www/hikd/docroot/modules/contrib/multiversion/src/MultiversionManager.php(461): Drupal\multiversion\MultiversionMigration->emptyOldStorage(Object(Drupal\media_entity\MediaStorage))
#18 /var/www/hikd/docroot/modules/contrib/multiversion/src/MultiversionManager.php(445): Drupal\multiversion\MultiversionManager->emptyOldStorage(Object(Drupal\media_entity\MediaStorage), Object(Drupal\multiversion\MultiversionMigration))
#19 /var/www/hikd/docroot/modules/contrib/multiversion/src/MultiversionManager.php(229): Drupal\multiversion\MultiversionManager->prepareContentForMigration(Array, Object(Drupal\multiversion\MultiversionMigration))
#20 /var/www/hikd/docroot/modules/contrib/multiversion/multiversion.install(17): Drupal\multiversion\MultiversionManager->enableEntityTypes()
#21 [internal function]: multiversion_install()
#22 /var/www/hikd/docroot/core/lib/Drupal/Core/Extension/ModuleHandler.php(391): call_user_func_array('multiversion_in...', Array)
#23 /var/www/hikd/docroot/core/lib/Drupal/Core/Extension/ModuleInstaller.php(287): Drupal\Core\Extension\ModuleHandler->invoke('multiversion', 'install')
#24 /var/www/hikd/docroot/core/lib/Drupal/Core/ProxyClass/Extension/ModuleInstaller.php(83): Drupal\Core\Extension\ModuleInstaller->install(Array, true)
#25 /opt/drush-8.x/vendor/drush/drush/commands/core/drupal/environment.inc(131): Drupal\Core\ProxyClass\Extension\ModuleInstaller->install(Array, true)
#26 /opt/drush-8.x/vendor/drush/drush/commands/core/drupal/environment.inc(198): drush_module_install(Array)
#27 /opt/drush-8.x/vendor/drush/drush/commands/pm/pm.drush.inc(1180): drush_module_enable(Array)
#28 /opt/drush-8.x/vendor/drush/drush/includes/command.inc(422): drush_pm_enable('deploy')
#29 /opt/drush-8.x/vendor/drush/drush/includes/command.inc(231): _drush_invoke_hooks(Array, Array)
#30 /opt/drush-8.x/vendor/drush/drush/includes/command.inc(199): drush_command('deploy')
#31 /opt/drush-8.x/vendor/drush/drush/lib/Drush/Boot/BaseBoot.php(67): drush_dispatch(Array)
#32 /opt/drush-8.x/vendor/drush/drush/includes/preflight.inc(66): Drush\Boot\BaseBoot->bootstrap_and_dispatch()
#33 /opt/drush-8.x/vendor/drush/drush/drush.php(12): drush_main()
#34 {main}
Error: Call to a member function hasTranslation() on null in Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem->preSave() (line 47 of /var/www/hikd/docroot/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php).
Drush command terminated abnormally due to an unrecoverable error.   
jeqq’s picture

Status: Active » Closed (cannot reproduce)
vdenis’s picture

Status: Closed (cannot reproduce) » Needs work

Reopened this issue because I get a similar problem.

drush queue:run workspace_replication
 [error]  Error: Call to a member function hasTranslation() on null in Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem->preSave() (line 47 of /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php) #0 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/FieldItemList.php(233): Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem->preSave()
#1 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/FieldItemList.php(191): Drupal\Core\Field\FieldItemList->delegateMethod('preSave')
#2 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(768): Drupal\Core\Field\FieldItemList->preSave()
#3 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(718): Drupal\Core\Entity\ContentEntityStorageBase->invokeFieldMethod('preSave', Object(Drupal\workspace\Entity\Replication))
#4 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/EntityStorageBase.php(435): Drupal\Core\Entity\ContentEntityStorageBase->invokeHook('presave', Object(Drupal\workspace\Entity\Replication))
#5 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(587): Drupal\Core\Entity\EntityStorageBase->doPreSave(Object(Drupal\workspace\Entity\Replication))
#6 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/EntityStorageBase.php(389): Drupal\Core\Entity\ContentEntityStorageBase->doPreSave(Object(Drupal\workspace\Entity\Replication))
#7 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php(820): Drupal\Core\Entity\EntityStorageBase->save(Object(Drupal\workspace\Entity\Replication))
#8 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/Entity.php(391): Drupal\Core\Entity\Sql\SqlContentEntityStorage->save(Object(Drupal\workspace\Entity\Replication))
#9 /Applications/MAMP/htdocs/myproject/web/modules/contrib/workspace/src/Plugin/QueueWorker/WorkspaceReplication.php(90): Drupal\Core\Entity\Entity->save()
#10 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/src/Drupal/Commands/core/QueueCommands.php(74): Drupal\workspace\Plugin\QueueWorker\WorkspaceReplication->processItem(Array)
#11 [internal function]: Drush\Drupal\Commands\core\QueueCommands->run('workspace_repli...', Array)
#12 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/CommandProcessor.php(235): call_user_func_array(Array, Array)
#13 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/CommandProcessor.php(181): Consolidation\AnnotatedCommand\CommandProcessor->runCommandCallback(Array, Object(Consolidation\AnnotatedCommand\CommandData))
#14 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/CommandProcessor.php(150): Consolidation\AnnotatedCommand\CommandProcessor->validateRunAndAlter(Array, Array, Object(Consolidation\AnnotatedCommand\CommandData))
#15 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(404): Consolidation\AnnotatedCommand\CommandProcessor->process(Object(Symfony\Component\Console\Output\ConsoleOutput), Array, Array, Object(Consolidation\AnnotatedCommand\CommandData))
#16 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Command/Command.php(251): Consolidation\AnnotatedCommand\AnnotatedCommand->execute(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Application.php(964): Symfony\Component\Console\Command\Command->run(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Application.php(248): Symfony\Component\Console\Application->doRunCommand(Object(Consolidation\AnnotatedCommand\AnnotatedCommand), Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/src/Runtime/Runtime.php(112): Symfony\Component\Console\Application->run(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#21 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/src/Runtime/Runtime.php(41): Drush\Runtime\Runtime->doRun(Array)
#22 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/drush.php(66): Drush\Runtime\Runtime->run(Array)
#23 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/drush(4): require('/Applications/M...')
#24 {main}.
Error: Call to a member function hasTranslation() on null in /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php on line 47 #0 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/FieldItemList.php(233): Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem->preSave()
#1 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/FieldItemList.php(191): Drupal\Core\Field\FieldItemList->delegateMethod('preSave')
#2 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(768): Drupal\Core\Field\FieldItemList->preSave()
#3 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(718): Drupal\Core\Entity\ContentEntityStorageBase->invokeFieldMethod('preSave', Object(Drupal\workspace\Entity\Replication))
#4 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/EntityStorageBase.php(435): Drupal\Core\Entity\ContentEntityStorageBase->invokeHook('presave', Object(Drupal\workspace\Entity\Replication))
#5 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php(587): Drupal\Core\Entity\EntityStorageBase->doPreSave(Object(Drupal\workspace\Entity\Replication))
#6 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/EntityStorageBase.php(389): Drupal\Core\Entity\ContentEntityStorageBase->doPreSave(Object(Drupal\workspace\Entity\Replication))
#7 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php(820): Drupal\Core\Entity\EntityStorageBase->save(Object(Drupal\workspace\Entity\Replication))
#8 /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Entity/Entity.php(391): Drupal\Core\Entity\Sql\SqlContentEntityStorage->save(Object(Drupal\workspace\Entity\Replication))
#9 /Applications/MAMP/htdocs/myproject/web/modules/contrib/workspace/src/Plugin/QueueWorker/WorkspaceReplication.php(90): Drupal\Core\Entity\Entity->save()
#10 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/src/Drupal/Commands/core/QueueCommands.php(74): Drupal\workspace\Plugin\QueueWorker\WorkspaceReplication->processItem(Array)
#11 [internal function]: Drush\Drupal\Commands\core\QueueCommands->run('workspace_repli...', Array)
#12 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/CommandProcessor.php(235): call_user_func_array(Array, Array)
#13 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/CommandProcessor.php(181): Consolidation\AnnotatedCommand\CommandProcessor->runCommandCallback(Array, Object(Consolidation\AnnotatedCommand\CommandData))
#14 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/CommandProcessor.php(150): Consolidation\AnnotatedCommand\CommandProcessor->validateRunAndAlter(Array, Array, Object(Consolidation\AnnotatedCommand\CommandData))
#15 /Applications/MAMP/htdocs/myproject/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(404): Consolidation\AnnotatedCommand\CommandProcessor->process(Object(Symfony\Component\Console\Output\ConsoleOutput), Array, Array, Object(Consolidation\AnnotatedCommand\CommandData))
#16 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Command/Command.php(251): Consolidation\AnnotatedCommand\AnnotatedCommand->execute(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Application.php(964): Symfony\Component\Console\Command\Command->run(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Application.php(248): Symfony\Component\Console\Application->doRunCommand(Object(Consolidation\AnnotatedCommand\AnnotatedCommand), Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 /Applications/MAMP/htdocs/myproject/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/src/Runtime/Runtime.php(112): Symfony\Component\Console\Application->run(Object(Drush\Symfony\DrushArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#21 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/src/Runtime/Runtime.php(41): Drush\Runtime\Runtime->doRun(Array)
#22 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/drush.php(66): Drush\Runtime\Runtime->run(Array)
#23 /Applications/MAMP/htdocs/myproject/vendor/drush/drush/drush(4): require('/Applications/M...')
#24 {main}
Error: Call to a member function hasTranslation() on null in Drupal\Core\Field\Plugin\Field\FieldType\ChangedItem->preSave() (line 47 of /Applications/MAMP/htdocs/myproject/web/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php).
 [error]  Drush command terminated abnormally due to an unrecoverable error.