Skip to content

Commit

Permalink
Update test
Browse files Browse the repository at this point in the history
  • Loading branch information
zanmato1984 committed Feb 27, 2024
1 parent aece9de commit d86c955
Showing 1 changed file with 27 additions and 49 deletions.
76 changes: 27 additions & 49 deletions cpp/src/arrow/scalar_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1985,56 +1985,34 @@ TEST_F(TestExtensionScalar, ValidateErrors) {
AssertValidationFails(scalar);
}

template <typename T>
struct TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits {
using DataType = T;
using ScalarType = typename TypeTraits<T>::ScalarType;

static std::shared_ptr<ScalarType> MakeScalar() {
std::string value = "test data";
return std::make_shared<ScalarType>(value);
TEST(TestScalarFillArraySpan, ParallelFill) {
for (auto scalar : {
ScalarFromJSON(utf8(), R"("test data")"),
// ScalarFromJSON(utf8_view(), R"("test data")"),
// ScalarFromJSON(list(int8()), "[1, 2, 3]"),
// ScalarFromJSON(list_view(int8()), "[1, 2, 3]"),
// TODO: more coming.
}) {
ARROW_SCOPED_TRACE("Scalar: ", scalar->ToString());

// Lambda to fill an ArraySpan with the scalar (and consequently fill the scratch
// space of the scalar), and use the ArraySpan a bit.
auto array_span_from_scalar = [&scalar]() {
ArraySpan span;
span.FillFromScalar(*scalar);
ASSERT_TRUE(span.type->Equals(scalar->type));
ASSERT_EQ(span.length, 1);
auto values = span.GetValues<int32_t>(1);
ASSERT_EQ(values[0], 0);
};

// Two concurrent calls to the lambda are just enough for TSAN to report a race
// condition.
auto fut1 = std::async(std::launch::async, array_span_from_scalar);
auto fut2 = std::async(std::launch::async, array_span_from_scalar);
fut1.get();
fut2.get();
}
};

using TestFillArraySpanBaseBinaryOrBinaryViewLikeTypes =
::testing::Types<TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits<BinaryType>,
TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits<LargeBinaryType>,
TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits<BinaryViewType>,
TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits<StringType>,
TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits<LargeStringType>,
TestFillArraySpanBaseBinaryOrBinaryViewLikeTraits<StringViewType>>;

template <typename T>
class TestFillArraySpan : public ::testing::Test {
public:
TestFillArraySpan() = default;
};

TYPED_TEST_SUITE(TestFillArraySpan, TestFillArraySpanBaseBinaryOrBinaryViewLikeTypes);

// GH-40069: race condition when filling the scratch space of a scalar in parallel.
TYPED_TEST(TestFillArraySpan, ParallelFill) {
using DataType = typename TypeParam::DataType;
// using ddScalarType = typename TypeParam::ScalarType;

auto scalar_val = TypeParam::MakeScalar();

// Lambda to fill an ArraySpan with the scalar (and consequently fill the scratch
// space of the scalar), and use the ArraySpan a bit.
auto array_span_from_scalar = [&]() {
auto expected_type = TypeTraits<DataType>::type_singleton();

ArraySpan span;
span.FillFromScalar(*scalar_val);
ASSERT_TRUE(span.type->Equals(*expected_type));
ASSERT_EQ(span.length, 1);
};
// Two concurrent calls to the lambda are just enough for TSAN to report a race
// condition.
auto fut1 = std::async(std::launch::async, array_span_from_scalar);
auto fut2 = std::async(std::launch::async, array_span_from_scalar);
fut1.wait();
fut2.wait();
}

} // namespace arrow

0 comments on commit d86c955

Please sign in to comment.