Suddenly fails to connect to coscine during upload
I uploaded about 200GB Data to the resource and suddenly got this error:
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
File /usr/lib/python3/dist-packages/urllib3/connectionpool.py:699, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
698 # Make the request on the httplib connection object.
--> 699 httplib_response = self._make_request(
700 conn,
701 method,
702 url,
703 timeout=timeout_obj,
704 body=body,
705 headers=headers,
706 chunked=chunked,
707 )
709 # If we're going to release the connection in ``finally:``, then
710 # the response doesn't need to know about the connection. Otherwise
711 # it will also try to release it and we'll have a double-release
712 # mess.
File /usr/lib/python3/dist-packages/urllib3/connectionpool.py:394, in HTTPConnectionPool._make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
393 else:
--> 394 conn.request(method, url, **httplib_request_kw)
396 # We are swallowing BrokenPipeError (errno.EPIPE) since the server is
397 # legitimately able to close the connection after sending a valid response.
398 # With this behaviour, the received response is still readable.
File /usr/lib/python3/dist-packages/urllib3/connection.py:234, in HTTPConnection.request(self, method, url, body, headers)
233 headers["User-Agent"] = _get_default_user_agent()
--> 234 super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File /usr/lib/python3.10/http/client.py:1282, in HTTPConnection.request(self, method, url, body, headers, encode_chunked)
1281 """Send a complete request to the server."""
-> 1282 self._send_request(method, url, body, headers, encode_chunked)
File /usr/lib/python3.10/http/client.py:1328, in HTTPConnection._send_request(self, method, url, body, headers, encode_chunked)
1327 body = _encode(body, 'body')
-> 1328 self.endheaders(body, encode_chunked=encode_chunked)
File /usr/lib/python3.10/http/client.py:1277, in HTTPConnection.endheaders(self, message_body, encode_chunked)
1276 raise CannotSendHeader()
-> 1277 self._send_output(message_body, encode_chunked=encode_chunked)
File /usr/lib/python3.10/http/client.py:1066, in HTTPConnection._send_output(self, message_body, encode_chunked)
1064 chunks = (message_body,)
-> 1066 for chunk in chunks:
1067 if not chunk:
File /usr/lib/python3.10/http/client.py:1021, in HTTPConnection._read_readable(self, readable)
1020 while True:
-> 1021 datablock = readable.read(self.blocksize)
1022 if not datablock:
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:401, in MultipartEncoderMonitor.read(self, size)
400 def read(self, size=-1):
--> 401 string = self.encoder.read(size)
402 self.bytes_read += len(string)
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:314, in MultipartEncoder.read(self, size)
312 bytes_to_load = self._calculate_load_amount(int(size))
--> 314 self._load(bytes_to_load)
315 return self._buffer.read(size)
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:203, in MultipartEncoder._load(self, amount)
201 break
--> 203 written += part.write_to(self._buffer, amount)
205 if amount != -1:
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:528, in Part.write_to(self, buffer, size)
527 amount_to_read = size - written
--> 528 written += buffer.append(self.body.read(amount_to_read))
530 return written
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:576, in FileWrapper.read(self, length)
575 def read(self, length=-1):
--> 576 return self.fd.read(length)
OSError: [Errno 5] Input/output error
During handling of the above exception, another exception occurred:
ProtocolError Traceback (most recent call last)
File ~/.local/lib/python3.10/site-packages/requests/adapters.py:486, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
485 try:
--> 486 resp = conn.urlopen(
487 method=request.method,
488 url=url,
489 body=request.body,
490 headers=request.headers,
491 redirect=False,
492 assert_same_host=False,
493 preload_content=False,
494 decode_content=False,
495 retries=self.max_retries,
496 timeout=timeout,
497 chunked=chunked,
498 )
500 except (ProtocolError, OSError) as err:
File /usr/lib/python3/dist-packages/urllib3/connectionpool.py:755, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
753 e = ProtocolError("Connection aborted.", e)
--> 755 retries = retries.increment(
756 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
757 )
758 retries.sleep()
File /usr/lib/python3/dist-packages/urllib3/util/retry.py:532, in Retry.increment(self, method, url, response, error, _pool, _stacktrace)
531 if read is False or not self._is_method_retryable(method):
--> 532 raise six.reraise(type(error), error, _stacktrace)
533 elif read is not None:
File /usr/lib/python3/dist-packages/six.py:718, in reraise(tp, value, tb)
717 if value.__traceback__ is not tb:
--> 718 raise value.with_traceback(tb)
719 raise value
File /usr/lib/python3/dist-packages/urllib3/connectionpool.py:699, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
698 # Make the request on the httplib connection object.
--> 699 httplib_response = self._make_request(
700 conn,
701 method,
702 url,
703 timeout=timeout_obj,
704 body=body,
705 headers=headers,
706 chunked=chunked,
707 )
709 # If we're going to release the connection in ``finally:``, then
710 # the response doesn't need to know about the connection. Otherwise
711 # it will also try to release it and we'll have a double-release
712 # mess.
File /usr/lib/python3/dist-packages/urllib3/connectionpool.py:394, in HTTPConnectionPool._make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
393 else:
--> 394 conn.request(method, url, **httplib_request_kw)
396 # We are swallowing BrokenPipeError (errno.EPIPE) since the server is
397 # legitimately able to close the connection after sending a valid response.
398 # With this behaviour, the received response is still readable.
File /usr/lib/python3/dist-packages/urllib3/connection.py:234, in HTTPConnection.request(self, method, url, body, headers)
233 headers["User-Agent"] = _get_default_user_agent()
--> 234 super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File /usr/lib/python3.10/http/client.py:1282, in HTTPConnection.request(self, method, url, body, headers, encode_chunked)
1281 """Send a complete request to the server."""
-> 1282 self._send_request(method, url, body, headers, encode_chunked)
File /usr/lib/python3.10/http/client.py:1328, in HTTPConnection._send_request(self, method, url, body, headers, encode_chunked)
1327 body = _encode(body, 'body')
-> 1328 self.endheaders(body, encode_chunked=encode_chunked)
File /usr/lib/python3.10/http/client.py:1277, in HTTPConnection.endheaders(self, message_body, encode_chunked)
1276 raise CannotSendHeader()
-> 1277 self._send_output(message_body, encode_chunked=encode_chunked)
File /usr/lib/python3.10/http/client.py:1066, in HTTPConnection._send_output(self, message_body, encode_chunked)
1064 chunks = (message_body,)
-> 1066 for chunk in chunks:
1067 if not chunk:
File /usr/lib/python3.10/http/client.py:1021, in HTTPConnection._read_readable(self, readable)
1020 while True:
-> 1021 datablock = readable.read(self.blocksize)
1022 if not datablock:
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:401, in MultipartEncoderMonitor.read(self, size)
400 def read(self, size=-1):
--> 401 string = self.encoder.read(size)
402 self.bytes_read += len(string)
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:314, in MultipartEncoder.read(self, size)
312 bytes_to_load = self._calculate_load_amount(int(size))
--> 314 self._load(bytes_to_load)
315 return self._buffer.read(size)
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:203, in MultipartEncoder._load(self, amount)
201 break
--> 203 written += part.write_to(self._buffer, amount)
205 if amount != -1:
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:528, in Part.write_to(self, buffer, size)
527 amount_to_read = size - written
--> 528 written += buffer.append(self.body.read(amount_to_read))
530 return written
File ~/.local/lib/python3.10/site-packages/requests_toolbelt/multipart/encoder.py:576, in FileWrapper.read(self, length)
575 def read(self, length=-1):
--> 576 return self.fd.read(length)
ProtocolError: ('Connection aborted.', OSError(5, 'Input/output error'))
During handling of the above exception, another exception occurred:
ConnectionError Traceback (most recent call last)
File ~/.local/lib/python3.10/site-packages/coscine/client.py:381, in Client._request(self, method, uri, **kwargs)
380 try: # performing the request and handle any resulting errors
--> 381 response = self.session.request(method, uri, **kwargs)
382 response.raise_for_status()
File ~/.local/lib/python3.10/site-packages/requests/sessions.py:589, in Session.request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
588 send_kwargs.update(settings)
--> 589 resp = self.send(prep, **send_kwargs)
591 return resp
File ~/.local/lib/python3.10/site-packages/requests/sessions.py:703, in Session.send(self, request, **kwargs)
702 # Send the request
--> 703 r = adapter.send(request, **kwargs)
705 # Total elapsed time of the request (approximately)
File ~/.local/lib/python3.10/site-packages/requests/adapters.py:501, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
500 except (ProtocolError, OSError) as err:
--> 501 raise ConnectionError(err, request=request)
503 except MaxRetryError as e:
ConnectionError: ('Connection aborted.', OSError(5, 'Input/output error'))
The above exception was the direct cause of the following exception:
ConnectionError Traceback (most recent call last)
Cell In[174], line 12, in upload_and_metadata(filePath, file, connection, filesUp)
11 print("uploading...")
---> 12 connection.resource.upload(fileUpload, os.fsdecode(filePath), form.generate())
14 print('uploaded: ', fileUpload)
File ~/.local/lib/python3.10/site-packages/coscine/resource.py:537, in Resource.upload(self, key, file, metadata, callback)
536 self._upload_file_metadata(key, metadata)
--> 537 self._upload_file_data(key, file_handle, callback)
538 else:
File ~/.local/lib/python3.10/site-packages/coscine/resource.py:571, in Resource._upload_file_data(self, key, file_handle, callback)
570 params = {"path": key}
--> 571 self.client.put(uri, data=monitor, headers=headers, params=params)
File ~/.local/lib/python3.10/site-packages/coscine/client.py:463, in Client.put(self, uri, **kwargs)
433 """
434 Performs a PUT request to the Coscine API.
435
(...)
460 The response of the Coscine server as a requests.Response object.
461 """
--> 463 return self._request("PUT", uri, **kwargs)
File ~/.local/lib/python3.10/site-packages/coscine/client.py:386, in Client._request(self, method, uri, **kwargs)
385 except requests.exceptions.ConnectionError as exc:
--> 386 raise ConnectionError("Failed to connect to Coscine!") from exc
387 except requests.exceptions.RequestException as exc:
ConnectionError: Failed to connect to Coscine!
It always occurs after 63% of the upload process.
Code:
import coscine
import os
TOKEN = 'token'
PROJECT = 'project'
RESOURCE = 'resource'
class Connection:
def __init__(self):
self.token = TOKEN
self.client = coscine.Client(self.token)
self.project = self.client.project(PROJECT)
self.resource = self.project.resource(RESOURCE)
connection = Connection()
filePath = os.fsencode('path/to/file')
file = os.fsencode('filename')
print("generating metadata...")
form = getMetadata(filePath, connection) #returns a valid metadata form
print(form)
if os.path.isdir(filePath):
fileUpload = os.fsdecode(file)+".zip"
print("zipping and uploading...")
connection.resource.upload(fileUpload, zip_folder(os.fsdecode(filePath)), form.generate())
else:
fileUpload = os.fsdecode(file)
print("uploading...")
connection.resource.upload(fileUpload, os.fsdecode(filePath), form.generate())
print('uploaded: ', fileUpload)