Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Binary Encoding - Analyze and Fix Existing Serialization Gaps on Newtonsoft Writer for Transactional Batch APIs #5021

Open
Tracked by #4718
kundadebdatta opened this issue Feb 14, 2025 · 0 comments
Assignees
Labels
BinaryEncoding binary encoding in .NET sdk bug Something isn't working

Comments

@kundadebdatta
Copy link
Member

Background:

Recently, the data-verse team enabled binary encoding in the .NET SDK, in their lower environment (test) and started seeing some failures specifically for the transactional batch APIs. They are using SDK version 3.47.0 and below are some of the exception stack captured from their failures.

Create Item Exceptions:

Exception Trace 1:

System.NotSupportedException: Can not write byte arrays
   at Microsoft.Azure.Cosmos.Json.Interop.CosmosDBToNewtonsoftWriter.WriteValue(Byte[] value)
   at Newtonsoft.Json.Linq.JValue.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Linq.JObject.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Linq.JObject.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Microsoft.Azure.Cosmos.CosmosJsonDotNetSerializer.ToStream[T](T input)
   at Microsoft.Azure.Cosmos.CosmosJsonSerializerWrapper.ToStream[T](T input)
   at Microsoft.Azure.Cosmos.ContainerCore.ExtractPartitionKeyAndProcessItemStreamAsync[T](Nullable`1 partitionKey, String itemId, T item, OperationType operationType, ItemRequestOptions requestOptions, ITrace trace, CancellationToken cancellationToken)
   at Microsoft.Azure.Cosmos.ContainerCore.CreateItemAsync[T](T item, ITrace trace, Nullable`1 partitionKey, ItemRequestOptions requestOptions, CancellationToken cancellationToken)
   at Microsoft.Azure.Cosmos.ClientContextCore.RunWithDiagnosticsHelperAsync[TResult](String containerName, String databaseName, OperationType operationType, ITrace trace, Func`2 task, Nullable`1 openTelemetry, RequestOptions requestOptions, Nullable`1 resourceType)
   at Microsoft.Azure.Cosmos.ClientContextCore.OperationHelperWithRootTraceAsync[TResult](String operationName, String containerName, String databaseName, OperationType operationType, RequestOptions requestOptions, Func`2 task, Nullable`1 openTelemetry, TraceComponent traceComponent, TraceLevel traceLevel, Nullable`1 resourceType)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBClient.CreateDocumentAsync[T](String databaseName, String containerName, T item, ItemRequestOptions itemRequestOptions)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass24_0`1.<<CreateAsync>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass24_0`1.<<CreateAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.ExecuteAsync[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 action, IEnumerable`1 additionalCustomProperties)

Exception Trace 2:

System.NotSupportedException: Can not write byte arrays
   at Microsoft.Azure.Cosmos.Json.Interop.CosmosDBToNewtonsoftWriter.WriteValue(Byte[] value)
   at Newtonsoft.Json.Linq.JValue.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Linq.JObject.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Linq.JObject.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Microsoft.Azure.Cosmos.CosmosJsonDotNetSerializer.ToStream[T](T input)
   at Microsoft.Azure.Cosmos.CosmosJsonSerializerWrapper.ToStream[T](T input)
   at Microsoft.Azure.Cosmos.ContainerCore.ExtractPartitionKeyAndProcessItemStreamAsync[T](Nullable`1 partitionKey, String itemId, T item, OperationType operationType, ItemRequestOptions requestOptions, ITrace trace, CancellationToken cancellationToken)
   at Microsoft.Azure.Cosmos.ContainerCore.CreateItemAsync[T](T item, ITrace trace, Nullable`1 partitionKey, ItemRequestOptions requestOptions, CancellationToken cancellationToken)
   at Microsoft.Azure.Cosmos.ClientContextCore.RunWithDiagnosticsHelperAsync[TResult](String containerName, String databaseName, OperationType operationType, ITrace trace, Func`2 task, Nullable`1 openTelemetry, RequestOptions requestOptions, Nullable`1 resourceType)
   at Microsoft.Azure.Cosmos.ClientContextCore.OperationHelperWithRootTraceAsync[TResult](String operationName, String containerName, String databaseName, OperationType operationType, RequestOptions requestOptions, Func`2 task, Nullable`1 openTelemetry, TraceComponent traceComponent, TraceLevel traceLevel, Nullable`1 resourceType)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBClient.CreateDocumentAsync[T](String databaseName, String containerName, T item, ItemRequestOptions itemRequestOptions)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass24_0`1.<<CreateAsync>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass24_0`1.<<CreateAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.ExecuteAsync[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 action, IEnumerable`1 additionalCustomProperties)

Exception Trace 3:

System.NotSupportedException: Can not write byte arrays
   at Microsoft.Azure.Cosmos.Json.Interop.CosmosDBToNewtonsoftWriter.WriteValue(Byte[] value)
   at Newtonsoft.Json.Linq.JValue.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Linq.JObject.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Linq.JObject.WriteTo(JsonWriter writer, JsonConverter[] converters)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Microsoft.Azure.Cosmos.CosmosJsonDotNetSerializer.ToStream[T](T input)
   at Microsoft.Azure.Cosmos.CosmosJsonSerializerWrapper.ToStream[T](T input)
   at Microsoft.Azure.Cosmos.ContainerCore.ExtractPartitionKeyAndProcessItemStreamAsync[T](Nullable`1 partitionKey, String itemId, T item, OperationType operationType, ItemRequestOptions requestOptions, ITrace trace, CancellationToken cancellationToken)
   at Microsoft.Azure.Cosmos.ContainerCore.CreateItemAsync[T](T item, ITrace trace, Nullable`1 partitionKey, ItemRequestOptions requestOptions, CancellationToken cancellationToken)
   at Microsoft.Azure.Cosmos.ClientContextCore.RunWithDiagnosticsHelperAsync[TResult](String containerName, String databaseName, OperationType operationType, ITrace trace, Func`2 task, Nullable`1 openTelemetry, RequestOptions requestOptions, Nullable`1 resourceType)
   at Microsoft.Azure.Cosmos.ClientContextCore.OperationHelperWithRootTraceAsync[TResult](String operationName, String containerName, String databaseName, OperationType operationType, RequestOptions requestOptions, Func`2 task, Nullable`1 openTelemetry, TraceComponent traceComponent, TraceLevel traceLevel, Nullable`1 resourceType)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBClient.CreateDocumentAsync[T](String databaseName, String containerName, T item, ItemRequestOptions itemRequestOptions)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass24_0`1.<<CreateAsync>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler)
   at Microsoft.CDS.NonRelational.Common.ExecuteWithRetry.RunAsync[T](ILogger logger, Func`1 action, Func`2 exceptionHandler, Int32 maximumRetries, Func`3 waitTimeoutHandler) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Common\ExecuteWithRetry.cs:line 333
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass24_0`1.<<CreateAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.ExecuteAsync[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 action, IEnumerable`1 additionalCustomProperties)

Bulk Item Exceptions:

Exception Trace 1:

[ExecuteBulkOperationWithRetry.cs:RetryWith:64] Error encountered in executing bulk operation
 
Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: �. Path '', line 0, position 0.
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)
   at Microsoft.Azure.Cosmos.CosmosJsonDotNetSerializer.FromStream[T](Stream stream)
   at Microsoft.Azure.Cosmos.CosmosJsonSerializerWrapper.FromStream[T](Stream stream)
   at Microsoft.Azure.Cosmos.TransactionalBatchResponse.GetOperationResultAtIndex[T](Int32 index)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBClient.ExecuteTransactionAsync[T](String databaseName, String containerName, ExecuteTransactionRequest`1 transactionRequest)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass27_0`1.<<ExecuteTransactionAsync>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 74
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext()

Exception Trace 2:

[ExecuteBulkOperationWithRetry.cs:RetryWith:64] Error encountered in executing bulk operation
 
Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: �. Path '', line 0, position 0.
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)
   at Microsoft.Azure.Cosmos.CosmosJsonDotNetSerializer.FromStream[T](Stream stream)
   at Microsoft.Azure.Cosmos.CosmosJsonSerializerWrapper.FromStream[T](Stream stream)
   at Microsoft.Azure.Cosmos.TransactionalBatchResponse.GetOperationResultAtIndex[T](Int32 index)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBClient.ExecuteTransactionAsync[T](String databaseName, String containerName, ExecuteTransactionRequest`1 transactionRequest) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\CosmosDB\CosmosDBClient.cs:line 391
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass27_0`1.<<ExecuteTransactionAsync>b__1>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\CosmosDB\CosmosDBStore.cs:line 430
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 60
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 74
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 60

Exception Trace 3:

[ExecuteBulkOperationWithRetry.cs:RetryWith:64] Error encountered in executing bulk operation
 
Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: �. Path '', line 0, position 0.
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)
   at Microsoft.Azure.Cosmos.CosmosJsonDotNetSerializer.FromStream[T](Stream stream)
   at Microsoft.Azure.Cosmos.CosmosJsonSerializerWrapper.FromStream[T](Stream stream)
   at Microsoft.Azure.Cosmos.TransactionalBatchResponse.GetOperationResultAtIndex[T](Int32 index)
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBClient.ExecuteTransactionAsync[T](String databaseName, String containerName, ExecuteTransactionRequest`1 transactionRequest) in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\CosmosDB\CosmosDBClient.cs:line 391
   at Microsoft.CDS.NonRelational.Store.Core.CosmosDBStore.<>c__DisplayClass27_0`1.<<ExecuteTransactionAsync>b__1>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\CosmosDB\CosmosDBStore.cs:line 430
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 60
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 74
--- End of stack trace from previous location ---
   at Microsoft.CDS.NonRelational.Store.Core.ExecuteBulkOperationWithRetry.<>c__DisplayClass0_0`1.<<RetryWith>b__0>d.MoveNext() in C:\__w\1\s\src\Microsoft.CDS.NonRelational.Store.Core\ExecuteBulkOperationWithRetry.cs:line 60

Acceptance Criteria:

Identify and fix these bugs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BinaryEncoding binary encoding in .NET sdk bug Something isn't working
Projects
Status: No status
Development

No branches or pull requests

1 participant