4040
4141namespace OC \Files \Cache ;
4242
43+ use Doctrine \DBAL \Exception \RetryableException ;
4344use Doctrine \DBAL \Exception \UniqueConstraintViolationException ;
4445use OC \Files \Search \SearchComparison ;
4546use OC \Files \Search \SearchQuery ;
@@ -692,7 +693,6 @@ public function moveFromCache(ICache $sourceCache, $sourcePath, $targetPath) {
692693 throw new \Exception ('Invalid target storage id: ' . $ targetStorageId );
693694 }
694695
695- $ this ->connection ->beginTransaction ();
696696 if ($ sourceData ['mimetype ' ] === 'httpd/unix-directory ' ) {
697697 //update all child entries
698698 $ sourceLength = mb_strlen ($ sourcePath );
@@ -715,11 +715,23 @@ public function moveFromCache(ICache $sourceCache, $sourcePath, $targetPath) {
715715 $ query ->set ('encrypted ' , $ query ->createNamedParameter (0 , IQueryBuilder::PARAM_INT ));
716716 }
717717
718- try {
719- $ query ->execute ();
720- } catch (\OC \DatabaseException $ e ) {
721- $ this ->connection ->rollBack ();
722- throw $ e ;
718+ // Retry transaction in case of deadlock.
719+ foreach ([1 , 2 , 3 ] as $ i ) {
720+ try {
721+ $ this ->connection ->beginTransaction ();
722+ $ query ->execute ();
723+ break ;
724+ } catch (\OC \DatabaseException $ e ) {
725+ $ this ->connection ->rollBack ();
726+ throw $ e ;
727+ } catch (RetryableException $ e ) {
728+ // Throw if we already retried 3 times.
729+ if ($ i === 3 ) {
730+ throw $ e ;
731+ } else {
732+ $ this ->connection ->rollBack ();
733+ }
734+ }
723735 }
724736 }
725737
0 commit comments