This is an automated email from the ASF dual-hosted git repository. haonan pushed a commit to branch iotdb in repository https://gitbox.apache.org/repos/asf/tsfile.git
commit 6c1b3dd8b2571c927a8a5eeef7c9b39187f75483 Author: Colin Lee <[email protected]> AuthorDate: Fri Jul 12 09:30:04 2024 +0800 CPP.fix multi-flush SEGSEGV. (#170) --- cpp/src/cwrapper/TsFile-cwrapper.cc | 10 ++++++++-- cpp/src/writer/tsfile_writer.cc | 1 + cpp/test/writer/tsfile_writer_test.cc | 31 ++++++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/cpp/src/cwrapper/TsFile-cwrapper.cc b/cpp/src/cwrapper/TsFile-cwrapper.cc index df38ce72..d70c5199 100644 --- a/cpp/src/cwrapper/TsFile-cwrapper.cc +++ b/cpp/src/cwrapper/TsFile-cwrapper.cc @@ -157,7 +157,11 @@ CTsFileReader ts_reader_open(const char* pathname, ErrorCode* err_code) { CTsFileWriter ts_writer_open(const char* pathname, ErrorCode* err_code) { init_tsfile_config(); TsFileWriter* writer = new TsFileWriter(); - int ret = writer->open(pathname, O_CREAT | O_RDWR, 0644); + int flags = O_WRONLY | O_CREAT | O_TRUNC; +#ifdef _WIN32 + flags |= O_BINARY; +#endif + int ret = writer->open(pathname, flags, 0644); if (ret != E_OK) { delete writer; *err_code = ret; @@ -598,7 +602,9 @@ QueryDataRet ts_reader_query(CTsFileReader reader, const char* table_name, ret->data = qds; ret->column_names = (char**)malloc(column_num * sizeof(char*)); ret->column_num = column_num; - memcpy(ret->column_names, columns_name, column_num * sizeof(char*)); + for (int i = 0; i < column_num; i++) { + ret->column_names[i] = strdup(columns_name[i]); + } storage::QueryExpression::destory(query_expression); return ret; } diff --git a/cpp/src/writer/tsfile_writer.cc b/cpp/src/writer/tsfile_writer.cc index 7d5db9f0..2ec90a63 100644 --- a/cpp/src/writer/tsfile_writer.cc +++ b/cpp/src/writer/tsfile_writer.cc @@ -489,6 +489,7 @@ int TsFileWriter::flush_chunk_group(MeasurementSchemaGroup *chunk_group) { return ret; } else { chunk_writer->destroy(); + chunk_writer = nullptr; } } return ret; diff --git a/cpp/test/writer/tsfile_writer_test.cc b/cpp/test/writer/tsfile_writer_test.cc index a3004c8d..4f52e197 100644 --- a/cpp/test/writer/tsfile_writer_test.cc +++ b/cpp/test/writer/tsfile_writer_test.cc @@ -38,7 +38,7 @@ class TsFileWriterTest : public ::testing::Test { tsfile_writer_ = new TsFileWriter(); libtsfile_init(); file_name_ = std::string("tsfile_writer_test_") + - generate_random_string(10) + std::string(".dat"); + generate_random_string(10) + std::string(".tsfile"); remove(file_name_.c_str()); int flags = O_WRONLY | O_CREAT | O_TRUNC; #ifdef _WIN32 @@ -214,3 +214,32 @@ TEST_F(TsFileWriterTest, FlushWithoutWriteAfterRegisterTS) { ASSERT_EQ(writer.close(), E_OK); } */ + +TEST_F(TsFileWriterTest, MultiFlush) { + std::string device_path = "device1"; + std::string measurement_name = "temperature"; + common::TSDataType data_type = common::TSDataType::INT32; + common::TSEncoding encoding = common::TSEncoding::PLAIN; + common::CompressionType compression_type = + common::CompressionType::UNCOMPRESSED; + ASSERT_EQ(tsfile_writer_->register_timeseries(device_path, measurement_name, + data_type, encoding, + compression_type), + E_OK); + for (int i = 1; i < 2000; i++) { + TsRecord record(i, device_path); + DataPoint point(measurement_name, i); + record.append_data_point(point); + ASSERT_EQ(tsfile_writer_->write_record(record), E_OK); + } + ASSERT_EQ(tsfile_writer_->flush(), E_OK); + + for (int i = 2000; i < 4000; i++) { + TsRecord record(i, device_path); + DataPoint point(measurement_name, i); + record.append_data_point(point); + ASSERT_EQ(tsfile_writer_->write_record(record), E_OK); + } + ASSERT_EQ(tsfile_writer_->flush(), E_OK); + tsfile_writer_->close(); +}
