Skip to content

Commit

Permalink
fix RAM leak in upload session
Browse files Browse the repository at this point in the history
use file context manager to ensure file is closed
iterate using partial: https://docs.python.org/3/library/functions.html#iter
  • Loading branch information
Maksim Beliaev committed Jul 9, 2021
1 parent 0b8786d commit 4d264f4
Showing 1 changed file with 17 additions and 15 deletions.
32 changes: 17 additions & 15 deletions office365/sharepoint/actions/upload_session.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import uuid
from functools import partial

from office365.runtime.client_result import ClientResult
from office365.runtime.queries.service_operation_query import ServiceOperationQuery
Expand Down Expand Up @@ -68,21 +69,22 @@ def _build_upload_session_query(self, response):
st = os.stat(self._source_path)
# upload a file in chunks
f_pos = 0
fh = open(self._source_path, 'rb')
for piece in read_in_chunks(fh, size=self._chunk_size):
if f_pos == 0:
upload_result = self.file.start_upload(self._upload_id, piece)
self._upload_results.append(upload_result)
elif f_pos + len(piece) < st.st_size:
upload_result = self.file.continue_upload(self._upload_id, f_pos, piece)
self._upload_results.append(upload_result)
else:
self._return_type = self.file.finish_upload(self._upload_id, f_pos, piece)
f_pos += len(piece)
fh.close()

if callable(self._chunk_uploaded):
self.context.after_execute(self._process_chunk_upload)
with open(self._source_path, 'rb') as fh:
for piece in iter(partial(fh.read, self._chunk_size), b''):
if f_pos == 0:
upload_result = self.file.start_upload(self._upload_id, piece)
self._upload_results.append(upload_result)
elif f_pos + len(piece) < st.st_size:
upload_result = self.file.continue_upload(self._upload_id, f_pos, piece)
self._upload_results.append(upload_result)
else:
self._return_type = self.file.finish_upload(self._upload_id, f_pos, piece)
f_pos += len(piece)

if callable(self._chunk_uploaded):
self.context.after_execute(self._process_chunk_upload)

self.context.execute_query()

def _process_chunk_upload(self, resp):
"""
Expand Down

0 comments on commit 4d264f4

Please sign in to comment.