{"record":{"id":"80d4414d91e38095","repo":"dotnet/orleans","slug":"data-too-large-to-write-to-dynamodb-table-size-d","errorCode":null,"errorMessage":"Data too large to write to DynamoDB table. Size={dataSize} MaxSize={MAX_DATA_SIZE}","messagePattern":"Data too large to write to DynamoDB table\\. Size=(.+?) MaxSize=(.+?)","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/AWS/Orleans.Persistence.DynamoDB/Provider/DynamoDBGrainStorage.cs","lineNumber":347,"sourceCode":"        }\n\n        internal void ConvertToStorageFormat(object? grainState, GrainStateRecord entity)\n        {\n            int dataSize;\n            // Convert to binary format\n            entity.State = this.options.GrainStorageSerializer.Serialize(grainState).ToArray();\n            dataSize = BINARY_STATE_PROPERTY_NAME.Length + entity.State.Length;\n\n            LogTraceWritingBinaryData(logger, dataSize, entity.GrainReference, entity.GrainType);\n\n            var pkSize = GRAIN_REFERENCE_PROPERTY_NAME.Length + entity.GrainReference.Length;\n            var rkSize = GRAIN_TYPE_PROPERTY_NAME.Length + entity.GrainType.Length;\n            var versionSize = ETAG_PROPERTY_NAME.Length + entity.ETag.ToString().Length;\n\n            if ((pkSize + rkSize + versionSize + dataSize) > MAX_DATA_SIZE)\n            {\n                var msg = $\"Data too large to write to DynamoDB table. Size={dataSize} MaxSize={MAX_DATA_SIZE}\";\n                throw new ArgumentOutOfRangeException(\"GrainState.Size\", msg);\n            }\n        }\n\n        private void ResetGrainState<T>(IGrainState<T> grainState)\n        {\n            grainState.RecordExists = false;\n            grainState.ETag = null;\n            grainState.State = CreateInstance<T>();\n        }\n\n        private T CreateInstance<T>() => _activatorProvider.GetActivator<T>().Create();\n\n        [LoggerMessage(\n            Level = LogLevel.Information,\n            Message = \"AWS DynamoDB Grain Storage {Name} is initializing: {InitMsg}\"\n        )]\n        private static partial void LogInformationInitializingDynamoDBGrainStorage(ILogger logger, string name, string initMsg);\n","sourceCodeStart":329,"sourceCodeEnd":365,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AWS/Orleans.Persistence.DynamoDB/Provider/DynamoDBGrainStorage.cs#L329-L365","documentation":"Thrown by DynamoDBGrainStorage.ConvertToStorageFormat when the serialized grain state plus the partition/sort/version key sizes exceed MAX_DATA_SIZE (400 * 1024 bytes). DynamoDB has a 400 KB item limit; Orleans reserves room for its own columns and rejects the write with ArgumentOutOfRangeException('GrainState.Size') before it hits the AWS API.","triggerScenarios":"A grain whose serialized state (after GrainStorageSerializer compression/encoding) plus the GrainReference, GrainType and ETag string lengths exceeds 400KB. The check sums pkSize + rkSize + versionSize + dataSize and compares against the constant.","commonSituations":"Storing large blobs, lists, or cached payloads in grain state; a state class that grew over time; switching to a less efficient storage serializer; embedding base64 data in state.","solutions":["Reduce the grain state size — offload large payloads to blob storage and keep only a reference/URL in grain state.","Configure a more compact GrainStorageSerializer (e.g. compression such as Gzip/Orleans's built-in compression) to shrink dataSize.","Split the grain so each activation holds less state, or shard the data across multiple grains."],"exampleFix":"// before: large payload stored inline in grain state\n[GenerateSerializer] public class MyState { [Id(0)] public byte[] Blob { get; set; } }\n\n// after: store the blob externally, keep a reference in state\n[GenerateSerializer] public class MyState { [Id(0)] public string BlobUri { get; set; } }","handlingStrategy":"validation","validationCode":"// Estimate serialized size before writing grain state\nvar size = GrainStorageSerializer.Serialize(state).ToArray().Length;\nif (size > 380 * 1024) // leave headroom under the 400KB limit\n    throw new InvalidOperationException(\"Grain state too large; offload payload to blob storage.\");","typeGuard":"null","tryCatchPattern":"try { await grain.WriteStateAsync(); }\ncatch (ArgumentOutOfRangeException ex) when (ex.ParamName == \"GrainState.Size\")\n{ /* offload large payload to blob, store reference in state */ }","preventionTips":["Keep grain state small; store large payloads externally and keep a reference.","Configure a compressing GrainStorageSerializer to reduce dataSize.","Shard large data across multiple grains rather than one oversized activation."],"tags":["dynamodb","persistence","size-limit","aws","storage"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}