[Notes] [Git][BuildStream/buildstream][tristan/cas-cleanup-improve] 2 commits: utils.py: Added _tempnamedfile()



Title: GitLab

Tristan Van Berkom pushed to branch tristan/cas-cleanup-improve at BuildStream / buildstream

Commits:

2 changed files:

Changes:

  • buildstream/_cas/cascache.py
    ... ... @@ -22,7 +22,6 @@ import itertools
    22 22
     import os
    
    23 23
     import stat
    
    24 24
     import errno
    
    25
    -import tempfile
    
    26 25
     import uuid
    
    27 26
     import contextlib
    
    28 27
     
    
    ... ... @@ -130,7 +129,7 @@ class CASCache():
    130 129
                 else:
    
    131 130
                     return dest
    
    132 131
     
    
    133
    -        with tempfile.TemporaryDirectory(prefix='tmp', dir=self.tmpdir) as tmpdir:
    
    132
    +        with utils._tempdir(prefix='tmp', dir=self.tmpdir) as tmpdir:
    
    134 133
                 checkoutdir = os.path.join(tmpdir, ref)
    
    135 134
                 self._checkout(checkoutdir, tree)
    
    136 135
     
    
    ... ... @@ -375,7 +374,7 @@ class CASCache():
    375 374
                         for chunk in iter(lambda: tmp.read(4096), b""):
    
    376 375
                             h.update(chunk)
    
    377 376
                     else:
    
    378
    -                    tmp = stack.enter_context(tempfile.NamedTemporaryFile(dir=self.tmpdir))
    
    377
    +                    tmp = stack.enter_context(utils._tempnamedfile(dir=self.tmpdir))
    
    379 378
                         # Set mode bits to 0644
    
    380 379
                         os.chmod(tmp.name, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
    
    381 380
     
    
    ... ... @@ -843,7 +842,7 @@ class CASCache():
    843 842
                 # already in local repository
    
    844 843
                 return objpath
    
    845 844
     
    
    846
    -        with tempfile.NamedTemporaryFile(dir=self.tmpdir) as f:
    
    845
    +        with utils._tempnamedfile(dir=self.tmpdir) as f:
    
    847 846
                 remote._fetch_blob(digest, f)
    
    848 847
     
    
    849 848
                 added_digest = self.add_object(path=f.name, link_directly=True)
    
    ... ... @@ -853,7 +852,7 @@ class CASCache():
    853 852
     
    
    854 853
         def _batch_download_complete(self, batch):
    
    855 854
             for digest, data in batch.send():
    
    856
    -            with tempfile.NamedTemporaryFile(dir=self.tmpdir) as f:
    
    855
    +            with utils._tempnamedfile(dir=self.tmpdir) as f:
    
    857 856
                     f.write(data)
    
    858 857
                     f.flush()
    
    859 858
     
    
    ... ... @@ -950,7 +949,7 @@ class CASCache():
    950 949
     
    
    951 950
         def _fetch_tree(self, remote, digest):
    
    952 951
             # download but do not store the Tree object
    
    953
    -        with tempfile.NamedTemporaryFile(dir=self.tmpdir) as out:
    
    952
    +        with utils._tempnamedfile(dir=self.tmpdir) as out:
    
    954 953
                 remote._fetch_blob(digest, out)
    
    955 954
     
    
    956 955
                 tree = remote_execution_pb2.Tree()
    

  • buildstream/utils.py
    ... ... @@ -1032,6 +1032,36 @@ def _tempdir(suffix="", prefix="tmp", dir=None): # pylint: disable=redefined-bu
    1032 1032
             cleanup_tempdir()
    
    1033 1033
     
    
    1034 1034
     
    
    1035
    +# _tempnamedfile()
    
    1036
    +#
    
    1037
    +# A context manager for doing work on an open temporary file
    
    1038
    +# which is guaranteed to be named and have an entry in the filesystem.
    
    1039
    +#
    
    1040
    +# Args:
    
    1041
    +#    dir (str): A path to a parent directory for the temporary file
    
    1042
    +#    suffix (str): A suffix for the temproary file name
    
    1043
    +#    prefix (str): A prefix for the temporary file name
    
    1044
    +#
    
    1045
    +# Yields:
    
    1046
    +#    (str): The temporary file handle
    
    1047
    +#
    
    1048
    +# Do not use tempfile.NamedTemporaryFile() directly, as this will
    
    1049
    +# leak files on the filesystem when BuildStream exits a process
    
    1050
    +# on SIGTERM.
    
    1051
    +#
    
    1052
    +@contextmanager
    
    1053
    +def _tempnamedfile(suffix="", prefix="tmp", dir=None):  # pylint: disable=redefined-builtin
    
    1054
    +    temp = None
    
    1055
    +
    
    1056
    +    def close_tempfile():
    
    1057
    +        if temp is not None:
    
    1058
    +            temp.close()
    
    1059
    +
    
    1060
    +    with _signals.terminator(close_tempfile), \
    
    1061
    +        tempfile.NamedTemporaryFile(suffix=suffix, prefix=prefix, dir=dir) as temp:
    
    1062
    +        yield temp
    
    1063
    +
    
    1064
    +
    
    1035 1065
     # _kill_process_tree()
    
    1036 1066
     #
    
    1037 1067
     # Brutally murder a process and all of its children
    



  • [Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]