{"record":{"id":"bf0abc08575c0696","repo":"dotnet/orleans","slug":"message-contains-no-events","errorCode":null,"errorMessage":"Message contains no events","messagePattern":"Message contains no events","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/AWS/Orleans.Streaming.SQS/Streams/SQSBatchContainer.cs","lineNumber":57,"sourceCode":"        public StreamSequenceToken SequenceToken\n        {\n            get { return sequenceToken; }\n        }\n\n        [JsonConstructor]\n        private SQSBatchContainer(\n            StreamId streamId,\n            List<object> events,\n            Dictionary<string, object>? requestContext,\n            EventSequenceTokenV2 sequenceToken)\n            : this(streamId, events, requestContext)\n        {\n            this.sequenceToken = sequenceToken;\n        }\n\n        private SQSBatchContainer(StreamId streamId, List<object> events, Dictionary<string, object>? requestContext)\n        {\n            if (events == null) throw new ArgumentNullException(nameof(events), \"Message contains no events\");\n\n            StreamId = streamId;\n            this.events = events;\n            this.requestContext = requestContext;\n        }\n\n        public IEnumerable<Tuple<T, StreamSequenceToken>> GetEvents<T>()\n        {\n            return events.OfType<T>().Select((e, i) => Tuple.Create<T, StreamSequenceToken>(e, sequenceToken.CreateSequenceTokenForEvent(i)));\n        }\n\n        internal static SendMessageRequest ToSQSMessage<T>(\n            Serializer<SQSBatchContainer> serializer,\n            StreamId streamId,\n            IEnumerable<T> events,\n            Dictionary<string, object>? requestContext)\n        {\n            var sqsBatchMessage = new SQSBatchContainer(streamId, events.Cast<object>().ToList(), requestContext);","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AWS/Orleans.Streaming.SQS/Streams/SQSBatchContainer.cs#L39-L75","documentation":"Thrown by the SQSBatchContainer private constructor when the events list is null. A batch container must carry at least the events payload for the stream; a null list would break GetEvents<T>() and downstream serialization, so the constructor fails fast.","triggerScenarios":"Constructing an SQSBatchContainer (directly or via ToSQSMessage) with a null events argument, e.g., forwarding a null enumerable from a producer that emitted no events and was not filtered out.","commonSituations":"Producer paths that pass through empty/null event collections; custom batch builders that forget to initialize the list; serialization round-trips that yield null on missing payloads.","solutions":["Pass a non-null list; use an empty list (or short-circuit) when there are genuinely no events.","Filter null/empty event collections before calling ToSQSMessage.","Initialize events = new List<object>() in builders to avoid accidental nulls.","Add a precondition check at the producer boundary."],"exampleFix":"// before\nvar msg = SQSBatchContainer.ToSQSMessage(serializer, streamId, null, ctx); // throws\n\n// after\nvar events = producedEvents ?? new List<object>();\nif (events.Count == 0) return; // nothing to send\nvar msg = SQSBatchContainer.ToSQSMessage(serializer, streamId, events, ctx);","handlingStrategy":"validation","validationCode":"var toSend = events?.ToList() ?? new List<object>();\nif (toSend.Count == 0) { logger.LogDebug(\"No events to send; skipping batch.\"); return; }\nvar msg = SQSBatchContainer.ToSQSMessage(serializer, streamId, toSend, ctx);","typeGuard":"static bool HasEvents<T>(IEnumerable<T>? e) => e is not null && e.Any();","tryCatchPattern":"try { /* build batch container */ }\ncatch (ArgumentNullException ex) when (ex.Message.Contains(\"no events\"))\n{\n    logger.LogWarning(\"Batch container built with null events; dropping batch.\");\n}","preventionTips":["Never forward null event lists; pass an empty list or skip.","Filter empty collections at the producer boundary.","Initialize new List<object>() in custom batch builders."],"tags":["aws","sqs","streaming","argument-validation","orleans"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}