[
https://issues.apache.org/jira/browse/IGNITE-25360?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Pavel Tupitsyn updated IGNITE-25360:
------------------------------------
Description:
If I provide an empty IgniteTuple in the keySelector (which is a user error),
IndexOutOfRangeException is thrown:
{code}
IndexOutOfRangeException
at
Apache.Ignite.Internal.Table.Serialization.ByteSpanExtensions.SetBit(Span`1
span, Int32 index) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/ByteSpanExtensions.cs:line
32
at
Apache.Ignite.Internal.Table.Serialization.BinaryTupleBuilderExtensions.AppendNoValue(BinaryTupleBuilder&
builder, Span`1 noValueSet) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/BinaryTupleBuilderExtensions.cs:line
35
at
Apache.Ignite.Internal.Table.Serialization.TupleSerializerHandler.Write(BinaryTupleBuilder&
tupleBuilder, IIgniteTuple record, Schema schema, Boolean keyOnly, Span`1
noValueSet) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/TupleSerializerHandler.cs:line
108
at
Apache.Ignite.Internal.Table.Serialization.IRecordSerializerHandler`1.GetKeyColocationHash(Schema
schema, T key) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/IRecordSerializerHandler.cs:line
88
at
Apache.Ignite.Internal.Table.DataStreamerWithReceiver.<>c__DisplayClass0_0`5.<StreamDataAsync>g__Add|0(TSource
item) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
204
at
Apache.Ignite.Internal.Table.DataStreamerWithReceiver.StreamDataAsync[TSource,TKey,TPayload,TArg,TResult](IAsyncEnumerable`1
data, Table table, Func`2 keySelector, Func`2 payloadSelector,
IRecordSerializerHandler`1 keyWriter, DataStreamerOptions options, Channel`1
resultChannel, IEnumerable`1 units, String receiverClassName,
ReceiverExecutionOptions receiverExecutionOptions, TArg receiverArg,
CancellationToken cancellationToken) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
133
at
Apache.Ignite.Internal.Table.DataStreamerWithReceiver.StreamDataAsync[TSource,TKey,TPayload,TArg,TResult](IAsyncEnumerable`1
data, Table table, Func`2 keySelector, Func`2 payloadSelector,
IRecordSerializerHandler`1 keyWriter, DataStreamerOptions options, Channel`1
resultChannel, IEnumerable`1 units, String receiverClassName,
ReceiverExecutionOptions receiverExecutionOptions, TArg receiverArg,
CancellationToken cancellationToken) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
119
{code}
Reproducer:
{code}
var res = await TupleView.StreamDataAsync(
data: ids.ToAsyncEnumerable(),
keySelector: _ => new IgniteTuple(),
payloadSelector: id => id,
receiver: DotNetReceivers.CreateTableAndInsert,
receiverArg: tableName,
options: new DataStreamerOptions { PageSize = 33 }).ToListAsync();
{code}
We should throw a sensible exception explaining that the key can't be empty.
was:
If I provide an empty IgniteTuple in the keySelector (which is a user error),
IndexOutOfRangeException is thrown:
{code}
IndexOutOfRangeException
at
Apache.Ignite.Internal.Table.Serialization.ByteSpanExtensions.SetBit(Span`1
span, Int32 index) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/ByteSpanExtensions.cs:line
32
at
Apache.Ignite.Internal.Table.Serialization.BinaryTupleBuilderExtensions.AppendNoValue(BinaryTupleBuilder&
builder, Span`1 noValueSet) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/BinaryTupleBuilderExtensions.cs:line
35
at
Apache.Ignite.Internal.Table.Serialization.TupleSerializerHandler.Write(BinaryTupleBuilder&
tupleBuilder, IIgniteTuple record, Schema schema, Boolean keyOnly, Span`1
noValueSet) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/TupleSerializerHandler.cs:line
108
at
Apache.Ignite.Internal.Table.Serialization.IRecordSerializerHandler`1.GetKeyColocationHash(Schema
schema, T key) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/IRecordSerializerHandler.cs:line
88
at
Apache.Ignite.Internal.Table.DataStreamerWithReceiver.<>c__DisplayClass0_0`5.<StreamDataAsync>g__Add|0(TSource
item) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
204
at
Apache.Ignite.Internal.Table.DataStreamerWithReceiver.StreamDataAsync[TSource,TKey,TPayload,TArg,TResult](IAsyncEnumerable`1
data, Table table, Func`2 keySelector, Func`2 payloadSelector,
IRecordSerializerHandler`1 keyWriter, DataStreamerOptions options, Channel`1
resultChannel, IEnumerable`1 units, String receiverClassName,
ReceiverExecutionOptions receiverExecutionOptions, TArg receiverArg,
CancellationToken cancellationToken) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
133
at
Apache.Ignite.Internal.Table.DataStreamerWithReceiver.StreamDataAsync[TSource,TKey,TPayload,TArg,TResult](IAsyncEnumerable`1
data, Table table, Func`2 keySelector, Func`2 payloadSelector,
IRecordSerializerHandler`1 keyWriter, DataStreamerOptions options, Channel`1
resultChannel, IEnumerable`1 units, String receiverClassName,
ReceiverExecutionOptions receiverExecutionOptions, TArg receiverArg,
CancellationToken cancellationToken) in
/home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
119
{code}
Reproducer:
{code}
var res = await TupleView.StreamDataAsync(
data: ids.ToAsyncEnumerable(),
keySelector: _ => new IgniteTuple(),
payloadSelector: id => id,
receiver: DotNetReceivers.CreateTableAndInsert,
receiverArg: tableName,
options: new DataStreamerOptions { PageSize = 33 }).ToListAsync();
{code}
> .NET: IndexOutOfRangeException in data streamer with receiver on empty key
> --------------------------------------------------------------------------
>
> Key: IGNITE-25360
> URL: https://issues.apache.org/jira/browse/IGNITE-25360
> Project: Ignite
> Issue Type: Bug
> Components: data streamer ai3, platforms ai3, thin clients ai3
> Reporter: Pavel Tupitsyn
> Assignee: Pavel Tupitsyn
> Priority: Major
> Labels: ignite-3
> Fix For: 3.1
>
>
> If I provide an empty IgniteTuple in the keySelector (which is a user error),
> IndexOutOfRangeException is thrown:
> {code}
> IndexOutOfRangeException
> at
> Apache.Ignite.Internal.Table.Serialization.ByteSpanExtensions.SetBit(Span`1
> span, Int32 index) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/ByteSpanExtensions.cs:line
> 32
> at
> Apache.Ignite.Internal.Table.Serialization.BinaryTupleBuilderExtensions.AppendNoValue(BinaryTupleBuilder&
> builder, Span`1 noValueSet) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/BinaryTupleBuilderExtensions.cs:line
> 35
> at
> Apache.Ignite.Internal.Table.Serialization.TupleSerializerHandler.Write(BinaryTupleBuilder&
> tupleBuilder, IIgniteTuple record, Schema schema, Boolean keyOnly, Span`1
> noValueSet) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/TupleSerializerHandler.cs:line
> 108
> at
> Apache.Ignite.Internal.Table.Serialization.IRecordSerializerHandler`1.GetKeyColocationHash(Schema
> schema, T key) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Serialization/IRecordSerializerHandler.cs:line
> 88
> at
> Apache.Ignite.Internal.Table.DataStreamerWithReceiver.<>c__DisplayClass0_0`5.<StreamDataAsync>g__Add|0(TSource
> item) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
> 204
> at
> Apache.Ignite.Internal.Table.DataStreamerWithReceiver.StreamDataAsync[TSource,TKey,TPayload,TArg,TResult](IAsyncEnumerable`1
> data, Table table, Func`2 keySelector, Func`2 payloadSelector,
> IRecordSerializerHandler`1 keyWriter, DataStreamerOptions options, Channel`1
> resultChannel, IEnumerable`1 units, String receiverClassName,
> ReceiverExecutionOptions receiverExecutionOptions, TArg receiverArg,
> CancellationToken cancellationToken) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
> 133
> at
> Apache.Ignite.Internal.Table.DataStreamerWithReceiver.StreamDataAsync[TSource,TKey,TPayload,TArg,TResult](IAsyncEnumerable`1
> data, Table table, Func`2 keySelector, Func`2 payloadSelector,
> IRecordSerializerHandler`1 keyWriter, DataStreamerOptions options, Channel`1
> resultChannel, IEnumerable`1 units, String receiverClassName,
> ReceiverExecutionOptions receiverExecutionOptions, TArg receiverArg,
> CancellationToken cancellationToken) in
> /home/pavel/w/ignite-3/modules/platforms/dotnet/Apache.Ignite/Internal/Table/DataStreamerWithReceiver.cs:line
> 119
> {code}
> Reproducer:
> {code}
> var res = await TupleView.StreamDataAsync(
> data: ids.ToAsyncEnumerable(),
> keySelector: _ => new IgniteTuple(),
> payloadSelector: id => id,
> receiver: DotNetReceivers.CreateTableAndInsert,
> receiverArg: tableName,
> options: new DataStreamerOptions { PageSize = 33 }).ToListAsync();
> {code}
> We should throw a sensible exception explaining that the key can't be empty.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)