11from __future__ import unicode_literals
2+
3+ import errno
4+
25from dvc .utils .compat import basestring , FileNotFoundError , str , urlparse
36
47import itertools
@@ -516,6 +519,16 @@ def _save(self, path_info, checksum):
516519 return
517520 self ._save_file (path_info , checksum )
518521
522+ def _handle_transfer_exception (
523+ self , from_info , to_info , exception , operation
524+ ):
525+ if isinstance (exception , OSError ) and exception .errno == errno .EMFILE :
526+ raise exception
527+
528+ msg = "failed to {} '{}' to '{}'" .format (operation , from_info , to_info )
529+ logger .exception (msg )
530+ return 1
531+
519532 def upload (self , from_info , to_info , name = None , no_progress_bar = False ):
520533 if not hasattr (self , "_upload" ):
521534 raise RemoteActionNotImplemented ("upload" , self .scheme )
@@ -537,10 +550,10 @@ def upload(self, from_info, to_info, name=None, no_progress_bar=False):
537550 name = name ,
538551 no_progress_bar = no_progress_bar ,
539552 )
540- except Exception :
541- msg = "failed to upload '{}' to '{}'"
542- logger . exception ( msg . format ( from_info , to_info ))
543- return 1 # 1 fail
553+ except Exception as e :
554+ return self . _handle_transfer_exception (
555+ from_info , to_info , e , "upload"
556+ )
544557
545558 return 0
546559
@@ -614,10 +627,10 @@ def _download_file(
614627 self ._download (
615628 from_info , tmp_file , name = name , no_progress_bar = no_progress_bar
616629 )
617- except Exception :
618- msg = "failed to download '{}' to '{}'"
619- logger . exception ( msg . format ( from_info , to_info ))
620- return 1 # 1 fail
630+ except Exception as e :
631+ return self . _handle_transfer_exception (
632+ from_info , to_info , e , "download"
633+ )
621634
622635 move (tmp_file , to_info , mode = file_mode )
623636
0 commit comments