{"record":{"id":"e43ef309a7f94eb2","repo":"dotnet/orleans","slug":"the-table-version-entry-must-have-a-membership-ver","errorCode":null,"errorMessage":"The table version entry must have a membership version.","messagePattern":"The table version entry must have a membership version\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Azure/Orleans.Clustering.AzureStorage/OrleansSiloInstanceManager.cs","lineNumber":99,"sourceCode":"                tableVersion.ToString(CultureInfo.InvariantCulture));\n        }\n\n        private SiloInstanceTableEntry CreateTableVersionEntry(string rowKey, string membershipVersion)\n        {\n            return new()\n            {\n                DeploymentId = DeploymentId,\n                PartitionKey = DeploymentId,\n                RowKey = rowKey,\n                MembershipVersion = membershipVersion\n            };\n        }\n\n        private (SiloInstanceTableEntry Min, SiloInstanceTableEntry Max) CreateBoundaryVersionEntries(\n            SiloInstanceTableEntry tableVersionEntry)\n        {\n            var membershipVersion = tableVersionEntry.MembershipVersion\n                ?? throw new ArgumentException(\"The table version entry must have a membership version.\", nameof(tableVersionEntry));\n            var min = CreateTableVersionEntry(SiloInstanceTableEntry.TABLE_VERSION_ROW_MIN, membershipVersion);\n            var max = CreateTableVersionEntry(SiloInstanceTableEntry.TABLE_VERSION_ROW_MAX, membershipVersion);\n\n            // Prevent older cleanup agents from treating boundary rows as defunct silo entries.\n            min.Status = INSTANCE_STATUS_ACTIVE;\n            max.Status = INSTANCE_STATUS_ACTIVE;\n            return (min, max);\n        }\n\n        public void RegisterSiloInstance(SiloInstanceTableEntry entry)\n        {\n            entry.Status = INSTANCE_STATUS_CREATED;\n            LogRegisterSiloInstance(entry);\n            Task.WaitAll(new Task[] { storage.UpsertTableEntryAsync(entry) });\n        }\n\n        public Task<string> UnregisterSiloInstance(SiloInstanceTableEntry entry)\n        {","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/Azure/Orleans.Clustering.AzureStorage/OrleansSiloInstanceManager.cs#L81-L117","documentation":"Thrown by OrleansSiloInstanceManager.CreateBoundaryVersionEntries when the passed SiloInstanceTableEntry has a null MembershipVersion. Boundary version rows (TABLE_VERSION_ROW_MIN / _MAX) fence membership snapshots and must carry a version; a null means the caller constructed the entry incorrectly. ArgumentException names 'tableVersionEntry'.","triggerScenarios":"Internal code path creating boundary entries from a tableVersionEntry whose MembershipVersion was not set. This is an Orleans-internal invariant; a throw here indicates a bug in version-row construction or a corrupt upstream read.","commonSituations":"Orleans version upgrade changing how version rows are built; a code path that constructs a version entry without setting MembershipVersion; partial deserialization of an entity missing the field.","solutions":["Ensure the tableVersionEntry passed in is built via CreateTableVersionEntry(int tableVersion), which sets MembershipVersion from a numeric version.","If invoking CreateBoundaryVersionEntries indirectly, confirm the upstream version row read populated MembershipVersion (see error 153).","Upgrade to a consistent Orleans version across the cluster so boundary-row construction agrees.","Report an Orleans issue if this fires from released code paths with valid inputs."],"exampleFix":"// before\nvar entry = new SiloInstanceTableEntry { RowKey = \"Version\" }; // MembershipVersion null\n\n// after\nvar entry = manager.CreateTableVersionEntry(currentVersion); // sets MembershipVersion","handlingStrategy":"validation","validationCode":"if (string.IsNullOrWhiteSpace(tableVersionEntry.MembershipVersion))\n    throw new InvalidOperationException(\"Version entry must carry MembershipVersion.\");","typeGuard":null,"tryCatchPattern":"try { var (min,max) = manager.CreateBoundaryVersionEntries(entry); }\ncatch (ArgumentException ex) when (ex.ParamName == nameof(tableVersionEntry))\n{ /* build entry via CreateTableVersionEntry instead */ }","preventionTips":["Build version entries via CreateTableVersionEntry(int) so MembershipVersion is always set.","Upgrade all silos to a consistent Orleans version.","Report an issue if this fires from released code with valid inputs."],"tags":["csharp","dotnet","orleans","azure-storage","membership","argument-validation"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}