tsfile icon indicating copy to clipboard operation
tsfile copied to clipboard

CPP. multi-flush error when data is minimal.

Open ColinLeeo opened this issue 1 year ago • 0 comments

When the amount of data written is minimal, multiple flush operations may lead to exceptions during the writing process to the file index.

pass:

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 < 2; 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 = 2; i < 10; 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);
    ASSERT_EQ(tsfile_writer_->close(), E_OK);
}

FAILED

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 < 2; 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 = 2; i < 3; 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);
    ASSERT_EQ(tsfile_writer_->close(), E_OK);
}

ColinLeeo avatar Jul 09 '24 11:07 ColinLeeo