| 2124 | return not final |
| 2125 | |
| 2126 | def commit(self) -> None: |
| 2127 | if self.tell() == 0: |
| 2128 | if self.buffer is not None: |
| 2129 | self.discard() |
| 2130 | self.fs.touch(self.path, **self.s3_additional_kwargs) |
| 2131 | elif not self.multipart_upload_parts: |
| 2132 | if self.buffer is not None: |
| 2133 | # Upload files smaller than block size. |
| 2134 | self.buffer.seek(0) |
| 2135 | data = self.buffer.read() |
| 2136 | self.fs._put_object( |
| 2137 | bucket=self.bucket, |
| 2138 | key=self.key, |
| 2139 | body=data, |
| 2140 | **self.s3_additional_kwargs, |
| 2141 | ) |
| 2142 | else: |
| 2143 | if not self.multipart_upload: |
| 2144 | raise RuntimeError("Multipart upload is not initialized.") |
| 2145 | |
| 2146 | try: |
| 2147 | self.fs._finish_multipart_upload( |
| 2148 | bucket=self.bucket, |
| 2149 | key=self.key, |
| 2150 | upload_id=cast(str, self.multipart_upload.upload_id), |
| 2151 | futures=self.multipart_upload_parts, |
| 2152 | ) |
| 2153 | except Exception: |
| 2154 | # The multipart upload has been aborted by the helper; |
| 2155 | # prevent discard() from aborting it again. |
| 2156 | self.multipart_upload = None |
| 2157 | self.multipart_upload_parts = [] |
| 2158 | raise |
| 2159 | |
| 2160 | self.fs.invalidate_cache(self.path) |
| 2161 | |
| 2162 | def discard(self) -> None: |
| 2163 | if self.multipart_upload: |