Skip to content

Commit

Permalink
Fixed memory leek when clickhouse raise error on data send.
Browse files Browse the repository at this point in the history
  • Loading branch information
pulina committed Dec 12, 2023
1 parent f088802 commit 5d1b6e6
Show file tree
Hide file tree
Showing 7 changed files with 1,129 additions and 478 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Changelog

## Unreleased
### Fixed
- Memory leak when clickhouse raise exception onBufferedSocketWriter.write_into_stream. Solves issue [#406](https://github.com/mymarilyn/clickhouse-driver/issues/406).

## [0.2.6] - 2023-05-02
### Added
Expand Down
295 changes: 187 additions & 108 deletions clickhouse_driver/bufferedreader.c

Large diffs are not rendered by default.

910 changes: 684 additions & 226 deletions clickhouse_driver/bufferedwriter.c

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions clickhouse_driver/bufferedwriter.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,10 @@ cdef class BufferedWriter(object):

memcpy(&items_buf[buf_pos], c_value, value_len)
buf_pos += length

self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size))

PyMem_Free(items_buf)
try:
self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size))
finally:
PyMem_Free(items_buf)

def write_fixed_strings(self, items, Py_ssize_t length, encoding=None):
if encoding is None:
Expand Down Expand Up @@ -110,10 +110,10 @@ cdef class BufferedWriter(object):

memcpy(&items_buf[buf_pos], c_value, value_len)
buf_pos += length

self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size))

PyMem_Free(items_buf)
try:
self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size))
finally:
PyMem_Free(items_buf)


cdef class BufferedSocketWriter(BufferedWriter):
Expand Down
2 changes: 1 addition & 1 deletion clickhouse_driver/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -592,8 +592,8 @@ def process_insert_query(self, query_without_data, data,
self.connection.send_query(query_without_data, query_id=query_id)
self.connection.send_external_tables(external_tables,
types_check=types_check)

sample_block = self.receive_sample_block()

if sample_block:
rv = self.send_data(sample_block, data,
types_check=types_check, columnar=columnar)
Expand Down
184 changes: 116 additions & 68 deletions clickhouse_driver/columns/largeint.c

Large diffs are not rendered by default.

198 changes: 131 additions & 67 deletions clickhouse_driver/varint.c

Large diffs are not rendered by default.

0 comments on commit 5d1b6e6

Please sign in to comment.