Skip to content

feat(cardav): support result truncation for addressbook federation #50092

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

hamza221
Copy link
Contributor

@hamza221 hamza221 commented Jan 8, 2025

  • Resolves: #

Summary

This Pr enables truncation for addressbook sync between federated instances

How to Test

what to look for:

  • if you're checking the request make sure that it respects the RFC Structure for truncated sync https://www.rfc-editor.org/rfc/rfc6578#section-3.6
  • Check the sync token in every iteration it should be 'init_currentToken_latestTokenAtTheStartOfSync''
  • at the end of initial sync it should be 'latestTokenAtTheStartOfSync'
  • Make sure that all the cards are synced at the end of the sync

Checklist

@hamza221 hamza221 self-assigned this Jan 8, 2025
@hamza221 hamza221 added 3. to review Waiting for reviews 2. developing Work in progress and removed 3. to review Waiting for reviews labels Jan 8, 2025
@AndyScherzinger AndyScherzinger added this to the Nextcloud 31 milestone Jan 8, 2025
@hamza221 hamza221 force-pushed the feat/sync-truncation branch from c7ee3ab to 1cb4891 Compare January 10, 2025 08:08
@hamza221 hamza221 marked this pull request as ready for review January 21, 2025 12:37
@hamza221 hamza221 added feature: carddav Related to CardDAV internals feature: federation labels Jan 21, 2025
Copy link
Member

@ChristophWurst ChristophWurst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How to test this? Does this also work with clients or is it limited strictly to server-to-server synchronization?

@hamza221
Copy link
Contributor Author

hamza221 commented Jan 21, 2025

How to test this?

The limit is set to 1 here. The ways to test this that I can think of

  • Intercept the requests and check the sync token changes ,+ results (make sure that all the cards are synched, with the correct number of steps and that the sync token always reflects the correct state)
  • Logs or breakpoints can also be used

PS: In case of federation both instances need to be patched.

Does this also work with clients or is it limited strictly to server-to-server synchronisation?

It should work for client sync too, But testing server to server is also needed to cover the whole PR

This was referenced Jan 21, 2025
@blizzz blizzz mentioned this pull request Jan 29, 2025
1 task
@blizzz blizzz modified the milestones: Nextcloud 31, Nextcloud 32 Jan 29, 2025
@AndyScherzinger AndyScherzinger force-pushed the feat/sync-truncation branch 2 times, most recently from 2e2983a to c10a8cd Compare February 11, 2025 21:39
@AndyScherzinger
Copy link
Member

/backport to stable31

@ChristophWurst
Copy link
Member

Failing CI needs to be addressed and won't be resolved with rebases

@hamza221 hamza221 force-pushed the feat/sync-truncation branch from ef45c01 to 9dc7d13 Compare March 27, 2025 12:56
@hamza221 hamza221 requested a review from a team as a code owner March 27, 2025 12:56
@hamza221 hamza221 requested review from Altahrim and removed request for a team March 27, 2025 12:56
@hamza221 hamza221 requested review from skjnldsv and yemkareems March 27, 2025 12:56
@skjnldsv
Copy link
Member

Please fill in description :)

@hamza221 hamza221 marked this pull request as draft March 27, 2025 13:04
Copy link
Member

@st3iny st3iny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested and works with my changes.

@hamza221 hamza221 force-pushed the feat/sync-truncation branch from f095a40 to 15c7f34 Compare June 5, 2025 16:15
@hamza221 hamza221 marked this pull request as ready for review June 10, 2025 12:00
@hamza221 hamza221 added 3. to review Waiting for reviews and removed 2. developing Work in progress labels Jun 10, 2025
Copy link
Member

@ChristophWurst ChristophWurst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@@ -850,6 +852,8 @@ public function deleteCard($addressBookId, $cardUri) {
* @return array
*/
public function getChangesForAddressBook($addressBookId, $syncToken, $syncLevel, $limit = null) {
$maxLimit = $this->config->getSystemValueInt('carddav_sync_request_truncation', 50000);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: why a system value and not app=dav?

@hamza221
Copy link
Contributor Author

hamza221 commented Jun 17, 2025

PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 28672 bytes) in /var/www/html/3rdparty/guzzlehttp/psr7/src/Utils.php on line 432
PHP Stack trace:
PHP   1. {main}() /var/www/html/occ:0
PHP   2. require_once() /var/www/html/occ:33
PHP   3. OC\Console\Application->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = *uninitialized*) /var/www/html/console.php:90
PHP   4. Symfony\Component\Console\Application->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = NULL) /var/www/html/lib/private/Console/Application.php:187
PHP   5. Symfony\Component\Console\Application->doRun($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Application.php:175
PHP   6. Symfony\Component\Console\Application->doRunCommand($command = class OCA\Federation\Command\SyncFederationAddressBooks { private ?Symfony\Component\Console\Application ${Symfony\Component\Console\Command\Command}application = class Symfony\Component\Console\Application { private array $commands = [...]; private bool $wantHelps = FALSE; private ?Symfony\Component\Console\Command\Command $runningCommand = ...; private string $name = 'Nextcloud'; private string $version = '32.0.0 dev'; private ?Symfony\Component\Console\CommandLoader\CommandLoaderInterface $commandLoader = NULL; private bool $catchExceptions = TRUE; private bool $catchErrors = FALSE; private bool $autoExit = FALSE; private Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { ... }; private Symfony\Component\Console\Helper\HelperSet $helperSet = class Symfony\Component\Console\Helper\HelperSet { ... }; private ?Symfony\Contracts\EventDispatcher\EventDispatcherInterface $dispatcher = NULL; private Symfony\Component\Console\Terminal $terminal = class Symfony\Component\Console\Terminal { ... }; private string $defaultCommand = 'list'; private bool $singleCommand = FALSE; private bool $initialized = TRUE; private ?Symfony\Component\Console\SignalRegistry\SignalRegistry $signalRegistry = class Symfony\Component\Console\SignalRegistry\SignalRegistry { ... }; private array $signalsToDispatchEvent = [...] }; private ?string ${Symfony\Component\Console\Command\Command}name = 'federation:sync-addressbooks'; private ?string ${Symfony\Component\Console\Command\Command}processTitle = NULL; private array ${Symfony\Component\Console\Command\Command}aliases = []; private Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 0; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; private bool ${Symfony\Component\Console\Command\Command}hidden = FALSE; private string ${Symfony\Component\Console\Command\Command}help = ''; private string ${Symfony\Component\Console\Command\Command}description = 'Synchronizes addressbooks of all federated clouds'; private ?Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}fullDefinition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; private bool ${Symfony\Component\Console\Command\Command}ignoreValidationErrors = FALSE; private ?Closure ${Symfony\Component\Console\Command\Command}code = NULL; private array ${Symfony\Component\Console\Command\Command}synopsis = []; private array ${Symfony\Component\Console\Command\Command}usages = []; private ?Symfony\Component\Console\Helper\HelperSet ${Symfony\Component\Console\Command\Command}helperSet = class Symfony\Component\Console\Helper\HelperSet { private array $helpers = [...] }; private OCA\Federation\SyncFederationAddressBooks $syncService = class OCA\Federation\SyncFederationAddressBooks { private OC\OCS\DiscoveryService $ocsDiscoveryService = class OC\OCS\DiscoveryService { ... }; protected OCA\Federation\DbHandler $dbHandler = class OCA\Federation\DbHandler { ... }; private OCA\DAV\CardDAV\SyncService $syncService = class OCA\DAV\CardDAV\SyncService { ... }; private Psr\Log\LoggerInterface $logger = class OC\AppFramework\ScopedPsrLogger { ... } } }, $input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Application.php:324
PHP   7. Symfony\Component\Console\Command\Command->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Application.php:1078
PHP   8. OCA\Federation\Command\SyncFederationAddressBooks->execute($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Command/Command.php:326
PHP   9. OCA\Federation\SyncFederationAddressBooks->syncThemAll($callback = class Closure { virtual $closure = "$this->OCA\Federation\Command\{closure}", public $static = ['progress' => class Symfony\Component\Console\Helper\ProgressBar { ... }, 'output' => class Symfony\Component\Console\Output\ConsoleOutput { ... }]; public $this = class OCA\Federation\Command\SyncFederationAddressBooks { private ?Symfony\Component\Console\Application ${Symfony\Component\Console\Command\Command}application = class Symfony\Component\Console\Application { ... }; private ?string ${Symfony\Component\Console\Command\Command}name = 'federation:sync-addressbooks'; private ?string ${Symfony\Component\Console\Command\Command}processTitle = NULL; private array ${Symfony\Component\Console\Command\Command}aliases = [...]; private Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}definition = class Symfony\Component\Console\Input\InputDefinition { ... }; private bool ${Symfony\Component\Console\Command\Command}hidden = FALSE; private string ${Symfony\Component\Console\Command\Command}help = ''; private string ${Symfony\Component\Console\Command\Command}description = 'Synchronizes addressbooks of all federated clouds'; private ?Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}fullDefinition = class Symfony\Component\Console\Input\InputDefinition { ... }; private bool ${Symfony\Component\Console\Command\Command}ignoreValidationErrors = FALSE; private ?Closure ${Symfony\Component\Console\Command\Command}code = NULL; private array ${Symfony\Component\Console\Command\Command}synopsis = [...]; private array ${Symfony\Component\Console\Command\Command}usages = [...]; private ?Symfony\Component\Console\Helper\HelperSet ${Symfony\Component\Console\Command\Command}helperSet = class Symfony\Component\Console\Helper\HelperSet { ... }; private OCA\Federation\SyncFederationAddressBooks $syncService = class OCA\Federation\SyncFederationAddressBooks { ... } }; public $parameter = ['$url' => '<required>', '$ex' => '<required>'] }) /var/www/html/apps/federation/lib/Command/SyncFederationAddressBooks.php:38
PHP  10. OCA\DAV\CardDAV\SyncService->syncRemoteAddressBook($url = 'http://stable31.local', $userName = 'system', $addressBookUrl = 'remote.php/dav/addressbooks/system/system/system', $sharedSecret = '8bNkv/PtyuIgupibqmmf7HJoqZQh0anZ', $syncToken = NULL, $targetBookHash = '9a653cfa806eb80756d707a610853e82664ac095', $targetPrincipal = 'principals/system/system', $targetProperties = ['{DAV:}displayname' => 'http://stable31.local']) /var/www/html/apps/federation/lib/SyncFederationAddressBooks.php:58
PHP  11. OCA\DAV\CardDAV\SyncService->download($url = 'http://stable31.local', $userName = 'system', $sharedSecret = '8bNkv/PtyuIgupibqmmf7HJoqZQh0anZ', $resourcePath = '/remote.php/dav/addressbooks/system/system/system/LDAP:AugustinBrautigam.vcf') /var/www/html/apps/dav/lib/CardDAV/SyncService.php:72
PHP  12. OC\Http\Client\Response->getBody() /var/www/html/apps/dav/lib/CardDAV/SyncService.php:199
PHP  13. GuzzleHttp\Psr7\Stream->getContents() /var/www/html/lib/private/Http/Client/Response.php:43
PHP  14. GuzzleHttp\Psr7\Utils::tryGetContents($stream = resource(39274) of type (stream)) /var/www/html/3rdparty/guzzlehttp/psr7/src/Stream.php:105
PHP  15. stream_get_contents($stream = resource(39274) of type (stream)) /var/www/html/3rdparty/guzzlehttp/psr7/src/Utils.php:432
PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in /var/www/html/lib/private/DB/BacktraceDebugStack.php on line 16
PHP Stack trace:
PHP   1. {main}() /var/www/html/occ:0
PHP   2. require_once() /var/www/html/occ:33
PHP   3. OC\Console\Application->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = *uninitialized*) /var/www/html/console.php:90
PHP   4. Symfony\Component\Console\Application->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = NULL) /var/www/html/lib/private/Console/Application.php:187
PHP   5. Symfony\Component\Console\Application->doRun($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Application.php:175
PHP   6. Symfony\Component\Console\Application->doRunCommand($command = class OCA\Federation\Command\SyncFederationAddressBooks { private ?Symfony\Component\Console\Application ${Symfony\Component\Console\Command\Command}application = class Symfony\Component\Console\Application { private array $commands = [...]; private bool $wantHelps = FALSE; private ?Symfony\Component\Console\Command\Command $runningCommand = ...; private string $name = 'Nextcloud'; private string $version = '32.0.0 dev'; private ?Symfony\Component\Console\CommandLoader\CommandLoaderInterface $commandLoader = NULL; private bool $catchExceptions = TRUE; private bool $catchErrors = FALSE; private bool $autoExit = FALSE; private Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { ... }; private Symfony\Component\Console\Helper\HelperSet $helperSet = class Symfony\Component\Console\Helper\HelperSet { ... }; private ?Symfony\Contracts\EventDispatcher\EventDispatcherInterface $dispatcher = NULL; private Symfony\Component\Console\Terminal $terminal = class Symfony\Component\Console\Terminal { ... }; private string $defaultCommand = 'list'; private bool $singleCommand = FALSE; private bool $initialized = TRUE; private ?Symfony\Component\Console\SignalRegistry\SignalRegistry $signalRegistry = class Symfony\Component\Console\SignalRegistry\SignalRegistry { ... }; private array $signalsToDispatchEvent = [...] }; private ?string ${Symfony\Component\Console\Command\Command}name = 'federation:sync-addressbooks'; private ?string ${Symfony\Component\Console\Command\Command}processTitle = NULL; private array ${Symfony\Component\Console\Command\Command}aliases = []; private Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 0; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; private bool ${Symfony\Component\Console\Command\Command}hidden = FALSE; private string ${Symfony\Component\Console\Command\Command}help = ''; private string ${Symfony\Component\Console\Command\Command}description = 'Synchronizes addressbooks of all federated clouds'; private ?Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}fullDefinition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; private bool ${Symfony\Component\Console\Command\Command}ignoreValidationErrors = FALSE; private ?Closure ${Symfony\Component\Console\Command\Command}code = NULL; private array ${Symfony\Component\Console\Command\Command}synopsis = []; private array ${Symfony\Component\Console\Command\Command}usages = []; private ?Symfony\Component\Console\Helper\HelperSet ${Symfony\Component\Console\Command\Command}helperSet = class Symfony\Component\Console\Helper\HelperSet { private array $helpers = [...] }; private OCA\Federation\SyncFederationAddressBooks $syncService = class OCA\Federation\SyncFederationAddressBooks { private OC\OCS\DiscoveryService $ocsDiscoveryService = class OC\OCS\DiscoveryService { ... }; protected OCA\Federation\DbHandler $dbHandler = class OCA\Federation\DbHandler { ... }; private OCA\DAV\CardDAV\SyncService $syncService = class OCA\DAV\CardDAV\SyncService { ... }; private Psr\Log\LoggerInterface $logger = class OC\AppFramework\ScopedPsrLogger { ... } } }, $input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Application.php:324
PHP   7. Symfony\Component\Console\Command\Command->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Application.php:1078
PHP   8. OCA\Federation\Command\SyncFederationAddressBooks->execute($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = ['command' => 'federation:sync-addressbooks']; protected $interactive = TRUE; private array $tokens = [0 => 'federation:sync-addressbooks']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /var/www/html/3rdparty/symfony/console/Command/Command.php:326
PHP   9. OCA\Federation\SyncFederationAddressBooks->syncThemAll($callback = class Closure { virtual $closure = "$this->OCA\Federation\Command\{closure}", public $static = ['progress' => class Symfony\Component\Console\Helper\ProgressBar { ... }, 'output' => class Symfony\Component\Console\Output\ConsoleOutput { ... }]; public $this = class OCA\Federation\Command\SyncFederationAddressBooks { private ?Symfony\Component\Console\Application ${Symfony\Component\Console\Command\Command}application = class Symfony\Component\Console\Application { ... }; private ?string ${Symfony\Component\Console\Command\Command}name = 'federation:sync-addressbooks'; private ?string ${Symfony\Component\Console\Command\Command}processTitle = NULL; private array ${Symfony\Component\Console\Command\Command}aliases = [...]; private Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}definition = class Symfony\Component\Console\Input\InputDefinition { ... }; private bool ${Symfony\Component\Console\Command\Command}hidden = FALSE; private string ${Symfony\Component\Console\Command\Command}help = ''; private string ${Symfony\Component\Console\Command\Command}description = 'Synchronizes addressbooks of all federated clouds'; private ?Symfony\Component\Console\Input\InputDefinition ${Symfony\Component\Console\Command\Command}fullDefinition = class Symfony\Component\Console\Input\InputDefinition { ... }; private bool ${Symfony\Component\Console\Command\Command}ignoreValidationErrors = FALSE; private ?Closure ${Symfony\Component\Console\Command\Command}code = NULL; private array ${Symfony\Component\Console\Command\Command}synopsis = [...]; private array ${Symfony\Component\Console\Command\Command}usages = [...]; private ?Symfony\Component\Console\Helper\HelperSet ${Symfony\Component\Console\Command\Command}helperSet = class Symfony\Component\Console\Helper\HelperSet { ... }; private OCA\Federation\SyncFederationAddressBooks $syncService = class OCA\Federation\SyncFederationAddressBooks { ... } }; public $parameter = ['$url' => '<required>', '$ex' => '<required>'] }) /var/www/html/apps/federation/lib/Command/SyncFederationAddressBooks.php:38
PHP  10. OCA\DAV\CardDAV\SyncService->syncRemoteAddressBook($url = 'http://stable31.local', $userName = 'system', $addressBookUrl = 'remote.php/dav/addressbooks/system/system/system', $sharedSecret = 'McbkbNgneppbH93RbuACfkfW3i1lN6y2', $syncToken = NULL, $targetBookHash = '9a653cfa806eb80756d707a610853e82664ac095', $targetPrincipal = 'principals/system/system', $targetProperties = ['{DAV:}displayname' => 'http://stable31.local']) /var/www/html/apps/federation/lib/SyncFederationAddressBooks.php:58
PHP  11. OCA\DAV\CardDAV\SyncService->atomic($fn = class Closure { virtual $closure = "$this->OCA\DAV\CardDAV\{closure}", public $static = ['addressBookId' => 3, 'cardUri' => 'LDAP:robotunit3-32.vcf', 'vCard' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'...]; public $this = class OCA\DAV\CardDAV\SyncService { private ?array $localSystemAddressBook = NULL; protected string $certPath = ''; private OCA\DAV\CardDAV\CardDavBackend $backend = class OCA\DAV\CardDAV\CardDavBackend { ... }; private OCP\IUserManager $userManager = class OC\User\Manager { ... }; private OCP\IDBConnection $dbConnection = class OC\DB\ConnectionAdapter { ... }; private Psr\Log\LoggerInterface $logger = class OC\AppFramework\ScopedPsrLogger { ... }; private OCA\DAV\CardDAV\Converter $converter = class OCA\DAV\CardDAV\Converter { ... }; private OCP\Http\Client\IClientService $clientService = class OC\Http\Client\ClientService { ... }; private OCP\IConfig $config = class OC\AllConfig { ... } } }, $db = class OC\DB\ConnectionAdapter { private $inner = class OC\DB\Connection { protected $_conn = class Doctrine\DBAL\Driver\PDO\Connection { ... }; protected $_config = class Doctrine\DBAL\Configuration { ... }; protected $_eventManager = class Doctrine\Common\EventManager { ... }; protected $_expr = class Doctrine\DBAL\Query\Expression\ExpressionBuilder { ... }; private bool ${Doctrine\DBAL\Connection}autoCommit = TRUE; private int ${Doctrine\DBAL\Connection}transactionNestingLevel = 2; private ${Doctrine\DBAL\Connection}transactionIsolationLevel = 2; private bool ${Doctrine\DBAL\Connection}nestTransactionsWithSavepoints = TRUE; private array ${Doctrine\DBAL\Connection}params = [...]; private ?Doctrine\DBAL\Platforms\AbstractPlatform ${Doctrine\DBAL\Connection}platform = class Doctrine\DBAL\Platforms\MariaDb1060Platform { ... }; private ?Doctrine\DBAL\Driver\API\ExceptionConverter ${Doctrine\DBAL\Connection}exceptionConverter = NULL; private ?Doctrine\DBAL\SQL\Parser ${Doctrine\DBAL\Connection}parser = class Doctrine\DBAL\SQL\Parser { ... }; protected $_schemaManager = NULL; protected $_driver = class Doctrine\DBAL\Driver\PDO\MySQL\Driver { ... }; private bool ${Doctrine\DBAL\Connection}isRollbackOnly = FALSE; private Doctrine\DBAL\Schema\SchemaManagerFactory ${Doctrine\DBAL\Connection}schemaManagerFactory = class Doctrine\DBAL\Schema\LegacySchemaManagerFactory { ... }; protected $connections = [...]; protected $keepReplica = FALSE; protected $tablePrefix = 'oc_'; protected $adapter = class OC\DB\AdapterMySQL { ... }; private $systemConfig = class OC\SystemConfig { ... }; private Psr\Clock\ClockInterface $clock = class OC\AppFramework\Utility\TimeFactory { ... }; private Psr\Log\LoggerInterface $logger = class OC\Log\PsrLoggerAdapter { ... }; protected $lockedTable = NULL; protected $queriesBuilt = 15945; protected $queriesExecuted = 24109; protected $dbDataCollector = class OC\DB\DbDataCollector { ... }; private array $lastConnectionCheck = [...]; protected ?float $transactionActiveSince = 1750172393.479665; protected $tableDirtyWrites = [...]; protected bool $logDbException = FALSE; private ?array $transactionBacktrace = [...]; protected bool $logRequestId = FALSE; protected string $requestId = '5xH8y25PGV4kaC8mUCPu'; protected array $partitions = [...]; protected array $shards = [...]; protected OC\DB\QueryBuilder\Sharded\ShardConnectionManager $shardConnectionManager = *uninitialized*; protected OC\DB\QueryBuilder\Sharded\AutoIncrementHandler $autoIncrementHandler = *uninitialized*; protected bool $isShardingEnabled = FALSE; private array $params = [...] } }) /var/www/html/apps/dav/lib/CardDAV/SyncService.php:80
PHP  12. OCA\DAV\CardDAV\SyncService->OCA\DAV\CardDAV\{closure:/var/www/html/apps/dav/lib/CardDAV/SyncService.php:73-80}() /var/www/html/lib/public/AppFramework/Db/TTransactional.php:45
PHP  13. OCA\DAV\CardDAV\CardDavBackend->createCard($addressBookId = 3, $cardUri = 'LDAP:robotunit3-32.vcf', $cardData = 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., $checkAlreadyExists = *uninitialized*) /var/www/html/apps/dav/lib/CardDAV/SyncService.php:76
PHP  14. OCA\DAV\CardDAV\CardDavBackend->atomic($fn = class Closure { virtual $closure = "$this->OCA\DAV\CardDAV\{closure}", public $static = ['addressBookId' => 3, 'cardUri' => 'LDAP:robotunit3-32.vcf', 'cardData' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'checkAlreadyExists' => TRUE, 'etag' => 'e741f4809a634e7b1a0c9b4160fee425', 'uid' => 'robotunit3-32']; public $this = class OCA\DAV\CardDAV\CardDavBackend { private string $dbCardsTable = 'cards'; private string $dbCardsPropertiesTable = 'cards_properties'; protected array $userDisplayNames = *uninitialized*; private array $etagCache = [...]; private OCP\IDBConnection $db = class OC\DB\ConnectionAdapter { ... }; private OCA\DAV\Connector\Sabre\Principal $principalBackend = class OCA\DAV\Connector\Sabre\Principal { ... }; private OCP\IUserManager $userManager = class OC\User\Manager { ... }; private OCP\EventDispatcher\IEventDispatcher $dispatcher = class OC\EventDispatcher\EventDispatcher { ... }; private OCA\DAV\CardDAV\Sharing\Backend $sharingBackend = class OCA\DAV\CardDAV\Sharing\Backend { ... }; private OCP\IConfig $config = class OC\AllConfig { ... } } }, $db = class OC\DB\ConnectionAdapter { private $inner = class OC\DB\Connection { protected $_conn = class Doctrine\DBAL\Driver\PDO\Connection { ... }; protected $_config = class Doctrine\DBAL\Configuration { ... }; protected $_eventManager = class Doctrine\Common\EventManager { ... }; protected $_expr = class Doctrine\DBAL\Query\Expression\ExpressionBuilder { ... }; private bool ${Doctrine\DBAL\Connection}autoCommit = TRUE; private int ${Doctrine\DBAL\Connection}transactionNestingLevel = 2; private ${Doctrine\DBAL\Connection}transactionIsolationLevel = 2; private bool ${Doctrine\DBAL\Connection}nestTransactionsWithSavepoints = TRUE; private array ${Doctrine\DBAL\Connection}params = [...]; private ?Doctrine\DBAL\Platforms\AbstractPlatform ${Doctrine\DBAL\Connection}platform = class Doctrine\DBAL\Platforms\MariaDb1060Platform { ... }; private ?Doctrine\DBAL\Driver\API\ExceptionConverter ${Doctrine\DBAL\Connection}exceptionConverter = NULL; private ?Doctrine\DBAL\SQL\Parser ${Doctrine\DBAL\Connection}parser = class Doctrine\DBAL\SQL\Parser { ... }; protected $_schemaManager = NULL; protected $_driver = class Doctrine\DBAL\Driver\PDO\MySQL\Driver { ... }; private bool ${Doctrine\DBAL\Connection}isRollbackOnly = FALSE; private Doctrine\DBAL\Schema\SchemaManagerFactory ${Doctrine\DBAL\Connection}schemaManagerFactory = class Doctrine\DBAL\Schema\LegacySchemaManagerFactory { ... }; protected $connections = [...]; protected $keepReplica = FALSE; protected $tablePrefix = 'oc_'; protected $adapter = class OC\DB\AdapterMySQL { ... }; private $systemConfig = class OC\SystemConfig { ... }; private Psr\Clock\ClockInterface $clock = class OC\AppFramework\Utility\TimeFactory { ... }; private Psr\Log\LoggerInterface $logger = class OC\Log\PsrLoggerAdapter { ... }; protected $lockedTable = NULL; protected $queriesBuilt = 15945; protected $queriesExecuted = 24109; protected $dbDataCollector = class OC\DB\DbDataCollector { ... }; private array $lastConnectionCheck = [...]; protected ?float $transactionActiveSince = 1750172393.479665; protected $tableDirtyWrites = [...]; protected bool $logDbException = FALSE; private ?array $transactionBacktrace = [...]; protected bool $logRequestId = FALSE; protected string $requestId = '5xH8y25PGV4kaC8mUCPu'; protected array $partitions = [...]; protected array $shards = [...]; protected OC\DB\QueryBuilder\Sharded\ShardConnectionManager $shardConnectionManager = *uninitialized*; protected OC\DB\QueryBuilder\Sharded\AutoIncrementHandler $autoIncrementHandler = *uninitialized*; protected bool $isShardingEnabled = FALSE; private array $params = [...] } }) /var/www/html/apps/dav/lib/CardDAV/CardDavBackend.php:653
PHP  15. OCA\DAV\CardDAV\CardDavBackend->OCA\DAV\CardDAV\{closure:/var/www/html/apps/dav/lib/CardDAV/CardDavBackend.php:612-653}() /var/www/html/lib/public/AppFramework/Db/TTransactional.php:45
PHP  16. OC\EventDispatcher\EventDispatcher->dispatchTyped($event = class OCA\DAV\Events\CardCreatedEvent { private ${OCP\EventDispatcher\Event}propagationStopped = FALSE; private int $addressBookId = 3; private array $addressBookData = ['id' => 3, 'uri' => '9a653cfa806eb80756d707a610853e82664ac095', 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'http://stable31.local', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => NULL, '{http://calendarserver.org/ns/}getctag' => 477, '{http://sabredav.org/ns}sync-token' => 477, '{http://nextcloud.com/ns}owner-displayname' => 'Accounts']; private array $shares = []; private array $cardData = ['id' => 848, 'uri' => 'LDAP:robotunit3-32.vcf', 'lastmodified' => 1750172393, 'etag' => '"e741f4809a634e7b1a0c9b4160fee425"', 'size' => 9272, 'carddata' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'uid' => 'robotunit3-32'] }) /var/www/html/apps/dav/lib/CardDAV/CardDavBackend.php:650
PHP  17. OC\EventDispatcher\EventDispatcher->dispatch($eventName = 'OCA\\DAV\\Events\\CardCreatedEvent', $event = class OCA\DAV\Events\CardCreatedEvent { private ${OCP\EventDispatcher\Event}propagationStopped = FALSE; private int $addressBookId = 3; private array $addressBookData = ['id' => 3, 'uri' => '9a653cfa806eb80756d707a610853e82664ac095', 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'http://stable31.local', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => NULL, '{http://calendarserver.org/ns/}getctag' => 477, '{http://sabredav.org/ns}sync-token' => 477, '{http://nextcloud.com/ns}owner-displayname' => 'Accounts']; private array $shares = []; private array $cardData = ['id' => 848, 'uri' => 'LDAP:robotunit3-32.vcf', 'lastmodified' => 1750172393, 'etag' => '"e741f4809a634e7b1a0c9b4160fee425"', 'size' => 9272, 'carddata' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'uid' => 'robotunit3-32'] }) /var/www/html/lib/private/EventDispatcher/EventDispatcher.php:79
PHP  18. Symfony\Component\EventDispatcher\EventDispatcher->dispatch($event = class OCA\DAV\Events\CardCreatedEvent { private ${OCP\EventDispatcher\Event}propagationStopped = FALSE; private int $addressBookId = 3; private array $addressBookData = ['id' => 3, 'uri' => '9a653cfa806eb80756d707a610853e82664ac095', 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'http://stable31.local', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => NULL, '{http://calendarserver.org/ns/}getctag' => 477, '{http://sabredav.org/ns}sync-token' => 477, '{http://nextcloud.com/ns}owner-displayname' => 'Accounts']; private array $shares = []; private array $cardData = ['id' => 848, 'uri' => 'LDAP:robotunit3-32.vcf', 'lastmodified' => 1750172393, 'etag' => '"e741f4809a634e7b1a0c9b4160fee425"', 'size' => 9272, 'carddata' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'uid' => 'robotunit3-32'] }, $eventName = 'OCA\\DAV\\Events\\CardCreatedEvent') /var/www/html/lib/private/EventDispatcher/EventDispatcher.php:67
PHP  19. Symfony\Component\EventDispatcher\EventDispatcher->callListeners($listeners = [0 => class Closure { virtual $closure = "$this->__invoke", public $this = class OC\EventDispatcher\ServiceEventListener { ... }; public $parameter = [...] }, 1 => class Closure { virtual $closure = "$this->__invoke", public $this = class OC\EventDispatcher\ServiceEventListener { ... }; public $parameter = [...] }], $eventName = 'OCA\\DAV\\Events\\CardCreatedEvent', $event = class OCA\DAV\Events\CardCreatedEvent { private ${OCP\EventDispatcher\Event}propagationStopped = FALSE; private int $addressBookId = 3; private array $addressBookData = ['id' => 3, 'uri' => '9a653cfa806eb80756d707a610853e82664ac095', 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'http://stable31.local', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => NULL, '{http://calendarserver.org/ns/}getctag' => 477, '{http://sabredav.org/ns}sync-token' => 477, '{http://nextcloud.com/ns}owner-displayname' => 'Accounts']; private array $shares = []; private array $cardData = ['id' => 848, 'uri' => 'LDAP:robotunit3-32.vcf', 'lastmodified' => 1750172393, 'etag' => '"e741f4809a634e7b1a0c9b4160fee425"', 'size' => 9272, 'carddata' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'uid' => 'robotunit3-32'] }) /var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php:56
PHP  20. OC\EventDispatcher\ServiceEventListener->__invoke($event = class OCA\DAV\Events\CardCreatedEvent { private ${OCP\EventDispatcher\Event}propagationStopped = FALSE; private int $addressBookId = 3; private array $addressBookData = ['id' => 3, 'uri' => '9a653cfa806eb80756d707a610853e82664ac095', 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'http://stable31.local', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => NULL, '{http://calendarserver.org/ns/}getctag' => 477, '{http://sabredav.org/ns}sync-token' => 477, '{http://nextcloud.com/ns}owner-displayname' => 'Accounts']; private array $shares = []; private array $cardData = ['id' => 848, 'uri' => 'LDAP:robotunit3-32.vcf', 'lastmodified' => 1750172393, 'etag' => '"e741f4809a634e7b1a0c9b4160fee425"', 'size' => 9272, 'carddata' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'uid' => 'robotunit3-32'] }, 'OCA\\DAV\\Events\\CardCreatedEvent', class Symfony\Component\EventDispatcher\EventDispatcher { private array $listeners = ['OC\\Authentication\\Events\\LoginFailed' => [...], 'OCP\\User\\Events\\PostLoginEvent' => [...], 'OCP\\User\\Events\\UserChangedEvent' => [...], 'OCP\\User\\Events\\BeforeUserDeletedEvent' => [...], 'OCP\\Files\\Events\\Node\\NodeWrittenEvent' => [...], 'OCP\\Files\\Cache\\CacheEntryRemovedEvent' => [...], 'OCP\\FilesMetadata\\Event\\MetadataLiveEvent' => [...], 'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => [...], 'OCA\\Files\\Event\\LoadSidebar' => [...], 'OCP\\Collaboration\\Reference\\RenderReferenceEvent' => [...], 'OCP\\Files\\Events\\Node\\BeforeNodeRenamedEvent' => [...], 'OCP\\Files\\Events\\Node\\BeforeNodeDeletedEvent' => [...], 'OCP\\Files\\Events\\Node\\BeforeNodeCopiedEvent' => [...], 'OCP\\Files\\Events\\Node\\NodeCopiedEvent' => [...], 'OCA\\Files\\Event\\LoadSearchPlugins' => [...], 'OCP\\Files\\Events\\NodeAddedToFavorite' => [...], 'OCP\\Files\\Events\\NodeRemovedFromFavorite' => [...], 'OCP\\User\\Events\\UserDeletedEvent' => [...], 'OCP\\Share\\Events\\ShareCreatedEvent' => [...], 'OCP\\Share\\Events\\BeforeShareDeletedEvent' => [...], 'OCP\\Share\\Events\\ShareDeletedFromSelfEvent' => [...], 'OCP\\User\\Events\\UserCreatedEvent' => [...], 'OCP\\Accounts\\UserUpdatedEvent' => [...], 'OCP\\Group\\Events\\GroupCreatedEvent' => [...], 'OCP\\Group\\Events\\GroupDeletedEvent' => [...], 'OCP\\Group\\Events\\UserAddedEvent' => [...], 'OCP\\Group\\Events\\UserRemovedEvent' => [...], 'OCA\\Circles\\Events\\PreparingCircleMemberEvent' => [...], 'OCA\\Circles\\Events\\AddingCircleMemberEvent' => [...], 'OCA\\Circles\\Events\\CircleMemberAddedEvent' => [...], 'OCA\\Circles\\Events\\Files\\PreparingFileShareEvent' => [...], 'OCA\\Circles\\Events\\Files\\CreatingFileShareEvent' => [...], 'OCA\\Circles\\Events\\Files\\FileShareCreatedEvent' => [...], 'OCA\\Circles\\Events\\RemovingCircleMemberEvent' => [...], 'OCA\\Circles\\Events\\RequestingCircleMemberEvent' => [...], 'OCA\\Circles\\Events\\DestroyingCircleEvent' => [...], 'OCA\\Files\\Event\\LoadAdditionalScriptsEvent' => [...], 'OCP\\Comments\\CommentsEntityEvent' => [...], 'OCP\\Comments\\CommentsEvent' => [...], 'OCP\\Contacts\\Events\\ContactInteractedWithEvent' => [...], 'OCP\\DB\\Events\\AddMissingIndicesEvent' => [...], 'OCA\\DAV\\Events\\CalendarCreatedEvent' => [...], 'OCA\\DAV\\Events\\CalendarDeletedEvent' => [...], 'OCA\\DAV\\Events\\CalendarMovedToTrashEvent' => [...], 'OCA\\DAV\\Events\\CalendarUpdatedEvent' => [...], 'OCA\\DAV\\Events\\CalendarRestoredEvent' => [...], 'OCP\\Calendar\\Events\\CalendarObjectCreatedEvent' => [...], 'OCP\\Calendar\\Events\\CalendarObjectUpdatedEvent' => [...], 'OCP\\Calendar\\Events\\CalendarObjectDeletedEvent' => [...], 'OCP\\Calendar\\Events\\CalendarObjectMovedEvent' => [...], 'OCP\\Calendar\\Events\\CalendarObjectMovedToTrashEvent' => [...], 'OCP\\Calendar\\Events\\CalendarObjectRestoredEvent' => [...], 'OCA\\DAV\\Events\\CalendarShareUpdatedEvent' => [...], 'OCA\\DAV\\Events\\CalendarPublishedEvent' => [...], 'OCA\\DAV\\Events\\CalendarUnpublishedEvent' => [...], 'OCA\\DAV\\Events\\SubscriptionCreatedEvent' => [...], 'OCA\\DAV\\Events\\SubscriptionDeletedEvent' => [...], 'OCA\\DAV\\Events\\AddressBookCreatedEvent' => [...], 'OCA\\DAV\\Events\\AddressBookDeletedEvent' => [...], 'OCA\\DAV\\Events\\AddressBookUpdatedEvent' => [...], 'OCA\\DAV\\Events\\AddressBookShareUpdatedEvent' => [...], 'OCA\\DAV\\Events\\CardCreatedEvent' => [...], 'OCA\\DAV\\Events\\CardDeletedEvent' => [...], 'OCA\\DAV\\Events\\CardUpdatedEvent' => [...], 'OCP\\Federation\\Events\\TrustedServerRemovedEvent' => [...], 'OCP\\Config\\BeforePreferenceDeletedEvent' => [...], 'OCP\\Config\\BeforePreferenceSetEvent' => [...], 'OCP\\User\\Events\\OutOfOfficeChangedEvent' => [...], 'OCP\\User\\Events\\OutOfOfficeClearedEvent' => [...], 'OCP\\User\\Events\\OutOfOfficeScheduledEvent' => [...], 'OCP\\User\\Events\\UserFirstTimeLoggedInEvent' => [...], 'OCP\\User\\Events\\UserIdAssignedEvent' => [...], 'OCP\\User\\Events\\BeforeUserIdUnassignedEvent' => [...], 'OCP\\User\\Events\\UserIdUnassignedEvent' => [...], 'OCP\\Settings\\Events\\DeclarativeSettingsGetValueEvent' => [...], 'OCP\\Settings\\Events\\DeclarativeSettingsSetValueEvent' => [...], 'OCA\\DAV\\Events\\SabrePluginAuthInitEvent' => [...], 'OCA\\Viewer\\Event\\LoadViewer' => [...], 'OCP\\AppFramework\\Http\\Events\\BeforeTemplateRenderedEvent' => [...], 'OCP\\Security\\CSP\\AddContentSecurityPolicyEvent' => [...], 'OCA\\DAV\\Events\\SabrePluginAddEvent' => [...], 'OCP\\Files\\Events\\Node\\NodeDeletedEvent' => [...], 'OCP\\Group\\Events\\GroupChangedEvent' => [...], 'OCP\\Files\\Events\\Node\\BeforeNodeReadEvent' => [...], 'OCP\\Files\\Events\\BeforeZipCreatedEvent' => [...], 'OCP\\Files\\Events\\BeforeDirectFileDownloadEvent' => [...], 'OCA\\Files_Sharing\\Event\\BeforeTemplateRenderedEvent' => [...], 'OCA\\Files_Trashbin\\Events\\BeforeNodeRestoredEvent' => [...], 'OCP\\Files\\Events\\BeforeFileSystemSetupEvent' => [...], 'OCP\\Files\\Events\\Node\\NodeRenamedEvent' => [...], 'OCP\\Files\\Events\\Node\\NodeCreatedEvent' => [...], 'OCP\\Files\\Events\\Node\\BeforeNodeTouchedEvent' => [...], 'OCP\\Files\\Events\\Node\\NodeTouchedEvent' => [...], 'OCP\\Files\\Events\\Node\\BeforeNodeWrittenEvent' => [...], 'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => [...], 'OCP\\App\\Events\\AppEnableEvent' => [...], 'OCP\\Log\\BeforeMessageLoggedEvent' => [...], 'OC\\Authentication\\Events\\AppPasswordCreatedEvent' => [...], 'OCP\\BeforeSabrePubliclyLoadedEvent' => [...], 'OCP\\DirectEditing\\RegisterDirectEditorEvent' => [...], 'OCA\\Text\\Event\\LoadEditor' => [...], 'OCA\\TpAssistant\\Event\\BeforeAssistantNotificationEvent' => [...], 'OCP\\Files\\Template\\RegisterTemplateCreatorEvent' => [...], 'OCP\\AppFramework\\Http\\Events\\BeforeLoginTemplateRenderedEvent' => [...], 'OCA\\TwoFactorBackupCodes\\Event\\CodesGenerated' => [...], 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorProviderForUserRegistered' => [...], 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorProviderForUserUnregistered' => [...], 'OCP\\App\\Events\\AppUpdateEvent' => [...], 'OCA\\UserOIDC\\Event\\ExchangedTokenRequestedEvent' => [...], 'OCA\\UserOIDC\\Event\\ExternalTokenRequestedEvent' => [...], 'OCA\\UserOIDC\\Event\\InternalTokenRequestedEvent' => [...], 'OCP\\User\\Events\\UserLiveStatusEvent' => [...], 'OCP\\User\\Events\\OutOfOfficeStartedEvent' => [...], 'OCP\\User\\Events\\OutOfOfficeEndedEvent' => [...], 'OCP\\WorkflowEngine\\Events\\LoadSettingsScriptsEvent' => [...], 'OCP\\Group\\Events\\BeforeGroupDeletedEvent' => [...], 'OCP\\Share\\Events\\ShareDeletedEvent' => [...], 'OCP\\DB\\Events\\AddMissingPrimaryKeyEvent' => [...], 'OC\\Authentication\\Events\\RemoteWipeStarted' => [...], 'OC\\Authentication\\Events\\RemoteWipeFinished' => [...], 'OCP\\Files\\Events\\InvalidateMountCacheEvent' => [...], 'OCA\\Circles\\Events\\CreatingCircleEvent' => [...], 'OCP\\Share\\Events\\BeforeShareCreatedEvent' => [...], 'OCP\\Collaboration\\Resources\\LoadAdditionalScriptsEvent' => [...], 'OCP\\IGroup::postAddUser' => [...], 'OCP\\SystemTag\\ISystemTagManager::createTag' => [...], 'OCP\\SystemTag\\ISystemTagManager::deleteTag' => [...], 'OCP\\SystemTag\\ISystemTagManager::updateTag' => [...], ...]; private array $sorted = []; private array $optimized = ['OCP\\Log\\BeforeMessageLoggedEvent' => [...], 'OCA\\DAV\\Events\\AddressBookCreatedEvent' => [...], 'OCA\\DAV\\Events\\CardCreatedEvent' => [...]] }) /var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php:220
PHP  21. OCA\DAV\Listener\BirthdayListener->handle($event = class OCA\DAV\Events\CardCreatedEvent { private ${OCP\EventDispatcher\Event}propagationStopped = FALSE; private int $addressBookId = 3; private array $addressBookData = ['id' => 3, 'uri' => '9a653cfa806eb80756d707a610853e82664ac095', 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'http://stable31.local', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => NULL, '{http://calendarserver.org/ns/}getctag' => 477, '{http://sabredav.org/ns}sync-token' => 477, '{http://nextcloud.com/ns}owner-displayname' => 'Accounts']; private array $shares = []; private array $cardData = ['id' => 848, 'uri' => 'LDAP:robotunit3-32.vcf', 'lastmodified' => 1750172393, 'etag' => '"e741f4809a634e7b1a0c9b4160fee425"', 'size' => 9272, 'carddata' => 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'..., 'uid' => 'robotunit3-32'] }) /var/www/html/lib/private/EventDispatcher/ServiceEventListener.php:68
PHP  22. OCA\DAV\CalDAV\BirthdayService->onCardChanged($addressBookId = 3, $cardUri = 'LDAP:robotunit3-32.vcf', $cardData = 'BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.5.6//EN\r\nUID:robotunit3-32\r\nFN;X-NC-SCOPE=v2-federated:robotunit3-32\r\nN;X-NC-SCOPE=v2-federated:robotunit3-32;;;;\r\nPHOTO;ENCODING=b;TYPE=image/png;0=v2-federated:iVBORw0KGgoAAAANSUhEUgAAAgAA\r\n AAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAYtklEQVR4nO3dWYyd933f4d/ZZu\r\n Hswxku4iqZoiBZtiLv+xbvdmJFLWA0AVKgDZDeFChaoDe97UXRyyIoWhTwTVEgiFW5tmLHipfY\r\n MVSn3pTIGymS4mJxHc4MZ1/O8vZCBoLEcWxJPP/3PfN/HkAQQEr4/nTBw48Oz1Lb3VouAgDISr\r\n 3sAwCA9AQAAGRIAABAhgQAAGRIAAB'...) /var/www/html/apps/dav/lib/Listener/BirthdayListener.php:29
PHP  23. OCA\DAV\CardDAV\CardDavBackend->getAddressBookById($addressBookId = 3) /var/www/html/apps/dav/lib/CalDAV/BirthdayService.php:56
PHP  24. OC\DB\QueryBuilder\QueryBuilder->executeQuery($connection = *uninitialized*) /var/www/html/apps/dav/lib/CardDAV/CardDavBackend.php:231
PHP  25. OC\DB\ConnectionAdapter->executeQuery($sql = 'SELECT `id`, `uri`, `displayname`, `principaluri`, `description`, `synctoken` FROM `*PREFIX*addressbooks` WHERE `id` = :dcValue1', $params = ['dcValue1' => 3], $types = ['dcValue1' => 1]) /var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php:292
PHP  26. OC\DB\Connection->executeQuery($sql = 'SELECT `id`, `uri`, `displayname`, `principaluri`, `description`, `synctoken` FROM `*PREFIX*addressbooks` WHERE `id` = :dcValue1', $params = ['dcValue1' => 3], $types = ['dcValue1' => 1], $qcp = *uninitialized*) /var/www/html/lib/private/DB/ConnectionAdapter.php:50
PHP  27. Doctrine\DBAL\Connection->executeQuery($sql = 'SELECT `id`, `uri`, `displayname`, `principaluri`, `description`, `synctoken` FROM `oc_addressbooks` WHERE `id` = :dcValue1', $params = ['dcValue1' => 3], $types = ['dcValue1' => 1], $qcp = NULL) /var/www/html/lib/private/DB/Connection.php:419
PHP  28. OC\DB\BacktraceDebugStack->startQuery($sql = 'SELECT `id`, `uri`, `displayname`, `principaluri`, `description`, `synctoken` FROM `oc_addressbooks` WHERE `id` = :dcValue1', $params = ['dcValue1' => 3], $types = ['dcValue1' => 1]) /var/www/html/3rdparty/doctrine/dbal/src/Connection.php:1086
PHP  29. debug_backtrace($options = 2) /var/www/html/lib/private/DB/BacktraceDebugStack.php:16

@hamza221 hamza221 added 2. developing Work in progress and removed 3. to review Waiting for reviews labels Jun 17, 2025
@ChristophWurst
Copy link
Member

Does it still run into OOM with the now lower limit?

@hamza221
Copy link
Contributor Author

hamza221 commented Jun 17, 2025

Does it still run into OOM with the now lower limit?

I have 224 contacts, setting it to 50 caused the OOM, I'm assuming memory is not being freed, I'm still looking into it.

Edit: Idk if it was obvious from my comment 😅 but setting it to > 224 solved the OOM exception

$result['added'] = [];
return $result;
}
$lastID = $values[array_key_last($values)]['id'];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$lastID = $values[array_key_last($values)]['id'];
$lastId = $values[array_key_last($values)]['id'];

}
$lastID = $values[array_key_last($values)]['id'];
if (count($values) >= $limit) {
$result['syncToken'] = 'init_' . $lastID . '_' . $currentToken;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$result['syncToken'] = 'init_' . $lastID . '_' . $currentToken;
$result['syncToken'] = 'init_' . $lastId . '_' . $currentToken;

@kesselb
Copy link
Contributor

kesselb commented Jun 17, 2025

Hi,

I did some more testing today and encountered a few minor issues. I'm not entirely sure if this is moving in the right direction, so I've pushed the changes to a different branch based on this one: #53551

  1. I believe the new logic returns the wrong sync token if a non-initial sync request was not truncated: 5ca43d6.

  2. We were paging through a truncated result only for initial syncs, not for regular syncs. Therefore, I added some code to expose the truncated state to the caller. This also fixes a small bug where we were triggering a deleteCard request for a card with the URI set to "system" (no such card exists, so nothing would be deleted). The reason was that the truncated state is signaled through a new response in the multistatus response, and our code was treating this new response as a vCard.

Please note that there have been some changes to config.sample.php in the meantime. If time allows, please rebase and resolve the conflicts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants