diff --git a/.github/protected-classes.txt b/.github/protected-classes.txt
new file mode 100644
index 0000000000000..b6535e17b0c6d
--- /dev/null
+++ b/.github/protected-classes.txt
@@ -0,0 +1,409 @@
+# Auto-generated list of protected classes (Message/IgniteDataTransferObject hierarchy).
+# Changes to these classes require special review.
+# Regenerated automatically after merging PRs with 'protected-classes' label.
+org.apache.ignite.internal.ExchangeInfo
+org.apache.ignite.internal.ExecutorAwareMessage
+org.apache.ignite.internal.GridJobCancelRequest
+org.apache.ignite.internal.GridJobExecuteRequest
+org.apache.ignite.internal.GridJobExecuteResponse
+org.apache.ignite.internal.GridJobSiblingsRequest
+org.apache.ignite.internal.GridJobSiblingsResponse
+org.apache.ignite.internal.GridTaskCancelRequest
+org.apache.ignite.internal.GridTaskSessionRequest
+org.apache.ignite.internal.IgniteDiagnosticRequest
+org.apache.ignite.internal.IgniteDiagnosticRequest$DiagnosticBaseInfo
+org.apache.ignite.internal.IgniteDiagnosticResponse
+org.apache.ignite.internal.TxEntriesInfo
+org.apache.ignite.internal.TxInfo
+org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessage
+org.apache.ignite.internal.cache.query.index.IndexQueryResultMeta
+org.apache.ignite.internal.cache.query.index.sorted.DurableBackgroundCleanupIndexTreeTaskV2
+org.apache.ignite.internal.cache.query.index.sorted.IndexKeyDefinition
+org.apache.ignite.internal.cache.query.index.sorted.IndexKeyTypeSettings
+org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesResult
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionGroup
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionNode
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionPartition
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskResult
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskResult
+org.apache.ignite.internal.dto.IgniteDataTransferObject
+org.apache.ignite.internal.management.ChangeTagCommandArg
+org.apache.ignite.internal.management.ClusterChangeTagTaskResult
+org.apache.ignite.internal.management.DeactivateCommandArg
+org.apache.ignite.internal.management.SetStateCommandArg
+org.apache.ignite.internal.management.ShutdownPolicyCommandArg
+org.apache.ignite.internal.management.ShutdownPolicyTaskResult
+org.apache.ignite.internal.management.SystemViewCommandArg
+org.apache.ignite.internal.management.SystemViewTaskResult
+org.apache.ignite.internal.management.api.NoArg
+org.apache.ignite.internal.management.baseline.BaselineAddCommandArg
+org.apache.ignite.internal.management.baseline.BaselineAutoAdjustCommandArg
+org.apache.ignite.internal.management.baseline.BaselineAutoAdjustSettings
+org.apache.ignite.internal.management.baseline.BaselineCommand$BaselineTaskArg
+org.apache.ignite.internal.management.baseline.BaselineCommandArg
+org.apache.ignite.internal.management.baseline.BaselineNode
+org.apache.ignite.internal.management.baseline.BaselineNode$ResolvedAddresses
+org.apache.ignite.internal.management.baseline.BaselineRemoveCommandArg
+org.apache.ignite.internal.management.baseline.BaselineSetCommandArg
+org.apache.ignite.internal.management.baseline.BaselineTaskResult
+org.apache.ignite.internal.management.baseline.BaselineVersionCommandArg
+org.apache.ignite.internal.management.cache.CacheAffinityConfiguration
+org.apache.ignite.internal.management.cache.CacheClearCommandArg
+org.apache.ignite.internal.management.cache.CacheConfiguration
+org.apache.ignite.internal.management.cache.CacheConfigurationCollectorTaskArg
+org.apache.ignite.internal.management.cache.CacheContentionCommandArg
+org.apache.ignite.internal.management.cache.CacheCreateCommandArg
+org.apache.ignite.internal.management.cache.CacheDestroyCommandArg
+org.apache.ignite.internal.management.cache.CacheDistributionCommandArg
+org.apache.ignite.internal.management.cache.CacheEvictionConfiguration
+org.apache.ignite.internal.management.cache.CacheFindGarbageCommandArg
+org.apache.ignite.internal.management.cache.CacheIdleVerifyCommandArg
+org.apache.ignite.internal.management.cache.CacheIdleVerifyDumpCommandArg
+org.apache.ignite.internal.management.cache.CacheIndexesForceRebuildCommandArg
+org.apache.ignite.internal.management.cache.CacheIndexesListCommandArg
+org.apache.ignite.internal.management.cache.CacheIndexesRebuildStatusCommandArg
+org.apache.ignite.internal.management.cache.CacheInfo
+org.apache.ignite.internal.management.cache.CacheJdbcType
+org.apache.ignite.internal.management.cache.CacheJdbcTypeField
+org.apache.ignite.internal.management.cache.CacheListCommandArg
+org.apache.ignite.internal.management.cache.CacheMetricsCommandArg
+org.apache.ignite.internal.management.cache.CacheNearConfiguration
+org.apache.ignite.internal.management.cache.CacheRebalanceConfiguration
+org.apache.ignite.internal.management.cache.CacheResetLostPartitionsCommandArg
+org.apache.ignite.internal.management.cache.CacheScheduleIndexesRebuildCommandArg
+org.apache.ignite.internal.management.cache.CacheStoreConfiguration
+org.apache.ignite.internal.management.cache.CacheValidateIndexesCommandArg
+org.apache.ignite.internal.management.cache.ContentionJobResult
+org.apache.ignite.internal.management.cache.ContentionTaskResult
+org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceJobResult
+org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceTaskResult
+org.apache.ignite.internal.management.cache.IdleVerifyDumpResult
+org.apache.ignite.internal.management.cache.IdleVerifyResult
+org.apache.ignite.internal.management.cache.IndexForceRebuildTaskRes
+org.apache.ignite.internal.management.cache.IndexIntegrityCheckIssue
+org.apache.ignite.internal.management.cache.IndexListInfoContainer
+org.apache.ignite.internal.management.cache.IndexRebuildStatusInfoContainer
+org.apache.ignite.internal.management.cache.IndexValidationIssue
+org.apache.ignite.internal.management.cache.QueryConfiguration
+org.apache.ignite.internal.management.cache.QueryEntity
+org.apache.ignite.internal.management.cache.QueryIndex
+org.apache.ignite.internal.management.cache.QueryIndexField
+org.apache.ignite.internal.management.cache.ScheduleIndexRebuildJobRes
+org.apache.ignite.internal.management.cache.ScheduleIndexRebuildTaskRes
+org.apache.ignite.internal.management.cache.ValidateIndexesCheckSizeIssue
+org.apache.ignite.internal.management.cache.ValidateIndexesCheckSizeResult
+org.apache.ignite.internal.management.cache.ValidateIndexesJobResult
+org.apache.ignite.internal.management.cache.ValidateIndexesPartitionResult
+org.apache.ignite.internal.management.cache.ValidateIndexesTaskResult
+org.apache.ignite.internal.management.cache.ViewCacheTaskResult
+org.apache.ignite.internal.management.cache.scan.CacheScanCommandArg
+org.apache.ignite.internal.management.cache.scan.CacheScanTaskResult
+org.apache.ignite.internal.management.cdc.CdcDeleteLostSegmentLinksCommandArg
+org.apache.ignite.internal.management.cdc.CdcResendCommandArg
+org.apache.ignite.internal.management.checkpoint.CheckpointCommandArg
+org.apache.ignite.internal.management.consistency.ConsistencyRepairCommandArg
+org.apache.ignite.internal.management.consistency.ConsistencyTaskResult
+org.apache.ignite.internal.management.defragmentation.DefragmentationCommand$DefragmentationCancelCommandArg
+org.apache.ignite.internal.management.defragmentation.DefragmentationCommand$DefragmentationStatusCommandArg
+org.apache.ignite.internal.management.defragmentation.DefragmentationScheduleCommandArg
+org.apache.ignite.internal.management.defragmentation.DefragmentationTaskResult
+org.apache.ignite.internal.management.diagnostic.ConnectivityResult
+org.apache.ignite.internal.management.diagnostic.DiagnosticConnectivityCommandArg
+org.apache.ignite.internal.management.diagnostic.DiagnosticPagelocksCommandArg
+org.apache.ignite.internal.management.diagnostic.PageLocksResult
+org.apache.ignite.internal.management.encryption.CacheGroupEncryptionTaskResult
+org.apache.ignite.internal.management.encryption.EncryptionCacheGroupArg
+org.apache.ignite.internal.management.encryption.EncryptionChangeMasterKeyCommandArg
+org.apache.ignite.internal.management.encryption.EncryptionKeyIdsTask$EncryptionKeyIdsResult
+org.apache.ignite.internal.management.encryption.EncryptionReencryptionRateLimitCommandArg
+org.apache.ignite.internal.management.encryption.ReencryptionRateTask$ReencryptionRateJobResult
+org.apache.ignite.internal.management.encryption.ReencryptionStatusTask$ReencryptionStatusResult
+org.apache.ignite.internal.management.encryption.ReencryptionSuspendTask$ReencryptionSuspendResumeJobResult
+org.apache.ignite.internal.management.kill.KillClientCommandArg
+org.apache.ignite.internal.management.kill.KillComputeCommandArg
+org.apache.ignite.internal.management.kill.KillContinuousCommandArg
+org.apache.ignite.internal.management.kill.KillScanCommandArg
+org.apache.ignite.internal.management.kill.KillServiceCommandArg
+org.apache.ignite.internal.management.kill.KillSnapshotCommandArg
+org.apache.ignite.internal.management.kill.KillSqlCommandArg
+org.apache.ignite.internal.management.kill.KillTransactionCommandArg
+org.apache.ignite.internal.management.kill.SnapshotCancelTask$CancelSnapshotArg
+org.apache.ignite.internal.management.meta.MetaDetailsCommandArg
+org.apache.ignite.internal.management.meta.MetaRemoveCommandArg
+org.apache.ignite.internal.management.meta.MetaUpdateCommandArg
+org.apache.ignite.internal.management.meta.MetadataListResult
+org.apache.ignite.internal.management.meta.MetadataMarshalled
+org.apache.ignite.internal.management.metric.MetricCommandArg
+org.apache.ignite.internal.management.metric.MetricConfigureHistogramCommandArg
+org.apache.ignite.internal.management.metric.MetricConfigureHitrateCommandArg
+org.apache.ignite.internal.management.metric.MetricConfigureMaxValueCommandArg
+org.apache.ignite.internal.management.performancestatistics.PerformanceStatisticsCommand$PerformanceStatisticsRotateCommandArg
+org.apache.ignite.internal.management.performancestatistics.PerformanceStatisticsCommand$PerformanceStatisticsStartCommandArg
+org.apache.ignite.internal.management.performancestatistics.PerformanceStatisticsCommand$PerformanceStatisticsStatusCommandArg
+org.apache.ignite.internal.management.performancestatistics.PerformanceStatisticsCommand$PerformanceStatisticsStopCommandArg
+org.apache.ignite.internal.management.persistence.PersistenceBackupCachesTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCleanCachesTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCommand$PersistenceBackupAllTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCommand$PersistenceBackupCorruptedTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCommand$PersistenceCleanAllTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCommand$PersistenceCleanCorruptedTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCommand$PersistenceInfoTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceCommand$PersistenceTaskArg
+org.apache.ignite.internal.management.persistence.PersistenceTaskResult
+org.apache.ignite.internal.management.property.PropertiesListResult
+org.apache.ignite.internal.management.property.PropertyGetCommandArg
+org.apache.ignite.internal.management.property.PropertyListCommandArg
+org.apache.ignite.internal.management.property.PropertyOperationResult
+org.apache.ignite.internal.management.property.PropertySetCommandArg
+org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeEnableCommandArg
+org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeStatusNode
+org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeTaskResult
+org.apache.ignite.internal.management.snapshot.SnapshotCancelCommandArg
+org.apache.ignite.internal.management.snapshot.SnapshotCheckCommandArg
+org.apache.ignite.internal.management.snapshot.SnapshotCreateCommandArg
+org.apache.ignite.internal.management.snapshot.SnapshotRestoreCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationCommand$TracingConfigurationCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationCommand$TracingConfigurationResetAllCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationCommand$TracingConfigurationResetCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationGetAllCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationGetCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationItem
+org.apache.ignite.internal.management.tracing.TracingConfigurationSetCommandArg
+org.apache.ignite.internal.management.tracing.TracingConfigurationTaskResult
+org.apache.ignite.internal.management.tx.TxCommand$AbstractTxCommandArg
+org.apache.ignite.internal.management.tx.TxCommandArg
+org.apache.ignite.internal.management.tx.TxInfo
+org.apache.ignite.internal.management.tx.TxInfoCommandArg
+org.apache.ignite.internal.management.tx.TxTaskResult
+org.apache.ignite.internal.management.tx.TxVerboseInfo
+org.apache.ignite.internal.management.tx.TxVerboseKey
+org.apache.ignite.internal.management.wal.ClusterNode
+org.apache.ignite.internal.management.wal.WalDeleteCommandArg
+org.apache.ignite.internal.management.wal.WalDisableCommand$WalDisableCommandArg
+org.apache.ignite.internal.management.wal.WalEnableCommand$WalEnableCommandArg
+org.apache.ignite.internal.management.wal.WalPrintCommand$WalPrintCommandArg
+org.apache.ignite.internal.management.wal.WalSetStateTaskResult
+org.apache.ignite.internal.management.wal.WalStateCommandArg
+org.apache.ignite.internal.management.wal.WalTaskResult
+org.apache.ignite.internal.managers.checkpoint.GridCheckpointRequest
+org.apache.ignite.internal.managers.communication.CompressedMessage
+org.apache.ignite.internal.managers.communication.ErrorMessage
+org.apache.ignite.internal.managers.communication.GridIoMessage
+org.apache.ignite.internal.managers.communication.GridIoSecurityAwareMessage
+org.apache.ignite.internal.managers.communication.GridIoUserMessage
+org.apache.ignite.internal.managers.communication.IgniteIoTestMessage
+org.apache.ignite.internal.managers.communication.SessionChannelMessage
+org.apache.ignite.internal.managers.deployment.GridDeploymentInfoBean
+org.apache.ignite.internal.managers.deployment.GridDeploymentRequest
+org.apache.ignite.internal.managers.deployment.GridDeploymentResponse
+org.apache.ignite.internal.managers.discovery.SecurityAwareCustomMessageWrapper
+org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyRequest
+org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyResponse
+org.apache.ignite.internal.managers.eventstorage.GridEventStorageMessage
+org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentV2
+org.apache.ignite.internal.processors.authentication.UserAuthenticateRequestMessage
+org.apache.ignite.internal.processors.authentication.UserAuthenticateResponseMessage
+org.apache.ignite.internal.processors.authentication.UserManagementOperationFinishedMessage
+org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection
+org.apache.ignite.internal.processors.cache.CacheEntryPredicate
+org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapter
+org.apache.ignite.internal.processors.cache.CacheEvictionEntry
+org.apache.ignite.internal.processors.cache.CacheInvokeDirectResult
+org.apache.ignite.internal.processors.cache.CacheMetricsSnapshot
+org.apache.ignite.internal.processors.cache.CacheStatisticsModeChangeMessage
+org.apache.ignite.internal.processors.cache.ClearCachesTaskResult
+org.apache.ignite.internal.processors.cache.GridCacheEntryInfo
+org.apache.ignite.internal.processors.cache.GridCacheGroupIdMessage
+org.apache.ignite.internal.processors.cache.GridCacheIdMessage
+org.apache.ignite.internal.processors.cache.GridCacheMessage
+org.apache.ignite.internal.processors.cache.GridCacheReturn
+org.apache.ignite.internal.processors.cache.GridChangeGlobalStateMessageResponse
+org.apache.ignite.internal.processors.cache.TxTimeoutOnPartitionMapExchangeChangeMessage
+org.apache.ignite.internal.processors.cache.WalStateAbstractMessage
+org.apache.ignite.internal.processors.cache.WalStateAckMessage
+org.apache.ignite.internal.processors.cache.WalStateFinishMessage
+org.apache.ignite.internal.processors.cache.WalStateProposeMessage
+org.apache.ignite.internal.processors.cache.binary.BinaryMetadataVersionInfo
+org.apache.ignite.internal.processors.cache.binary.MetadataRemoveAcceptedMessage
+org.apache.ignite.internal.processors.cache.binary.MetadataRemoveProposedMessage
+org.apache.ignite.internal.processors.cache.binary.MetadataRequestMessage
+org.apache.ignite.internal.processors.cache.binary.MetadataResponseMessage
+org.apache.ignite.internal.processors.cache.binary.MetadataUpdateAcceptedMessage
+org.apache.ignite.internal.processors.cache.distributed.GridCacheTtlUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.GridCacheTxRecoveryRequest
+org.apache.ignite.internal.processors.cache.distributed.GridCacheTxRecoveryResponse
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedBaseMessage
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedLockRequest
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedLockResponse
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxFinishRequest
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxFinishResponse
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxPrepareRequest
+org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxPrepareResponse
+org.apache.ignite.internal.processors.cache.distributed.GridNearUnlockRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxOnePhaseCommitAckRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.AtomicApplicationAttributesAwareRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicDeferredUpdateResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicNearResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicSingleUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicCheckUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicFullUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFilterRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateInvokeRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.NearCacheUpdates
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.UpdateErrors
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CacheGroupAffinityMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionFullCountersMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionsToReloadMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemandMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionExchangeId
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsAbstractMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessage
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleRequest
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GroupPartitionIdPair
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteDhtDemandedPartitionsMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteDhtPartitionCountersMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteDhtPartitionHistorySuppliersMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteDhtPartitionsToReloadMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IntLongMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.PartitionReservationsMap
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.PartitionsToReload
+org.apache.ignite.internal.processors.cache.distributed.dht.preloader.latch.LatchAckMessage
+org.apache.ignite.internal.processors.cache.distributed.near.CacheVersionedValue
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetResponse
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockResponse
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetResponse
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishResponse
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareRequest
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareResponse
+org.apache.ignite.internal.processors.cache.persistence.checkpoint.EarliestCheckpointMapSnapshot
+org.apache.ignite.internal.processors.cache.persistence.checkpoint.EarliestCheckpointMapSnapshot$GroupStateSnapshot
+org.apache.ignite.internal.processors.cache.persistence.snapshot.IncrementalSnapshotAwareMessage
+org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotPartitionsVerifyResult
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryResponse
+org.apache.ignite.internal.processors.cache.query.GridCacheSqlQuery
+org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryBatchAck
+org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryEntry
+org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry
+org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey
+org.apache.ignite.internal.processors.cache.transactions.TxEntryValueHolder
+org.apache.ignite.internal.processors.cache.transactions.TxLock
+org.apache.ignite.internal.processors.cache.transactions.TxLockList
+org.apache.ignite.internal.processors.cache.transactions.TxLocksRequest
+org.apache.ignite.internal.processors.cache.transactions.TxLocksResponse
+org.apache.ignite.internal.processors.cache.verify.PartitionHashRecord
+org.apache.ignite.internal.processors.cache.verify.TransactionsHashRecord
+org.apache.ignite.internal.processors.cache.version.GridCacheRawVersionedEntry
+org.apache.ignite.internal.processors.cache.version.GridCacheVersion
+org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx
+org.apache.ignite.internal.processors.cluster.CacheMetricsMessage
+org.apache.ignite.internal.processors.cluster.ClusterMetricsUpdateMessage
+org.apache.ignite.internal.processors.cluster.NodeFullMetricsMessage
+org.apache.ignite.internal.processors.cluster.NodeMetricsMessage
+org.apache.ignite.internal.processors.continuous.ContinuousRoutineStartResultMessage
+org.apache.ignite.internal.processors.continuous.GridContinuousMessage
+org.apache.ignite.internal.processors.datastreamer.DataStreamerEntry
+org.apache.ignite.internal.processors.datastreamer.DataStreamerRequest
+org.apache.ignite.internal.processors.datastreamer.DataStreamerResponse
+org.apache.ignite.internal.processors.marshaller.MappingProposedMessage
+org.apache.ignite.internal.processors.marshaller.MissingMappingRequestMessage
+org.apache.ignite.internal.processors.marshaller.MissingMappingResponseMessage
+org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageVersion
+org.apache.ignite.internal.processors.odbc.ClientMessage
+org.apache.ignite.internal.processors.query.aware.IndexRebuildCacheInfo
+org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryCancelRequest
+org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryFailResponse
+org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageRequest
+org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageResponse
+org.apache.ignite.internal.processors.query.messages.GridQueryKillRequest
+org.apache.ignite.internal.processors.query.messages.GridQueryKillResponse
+org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage
+org.apache.ignite.internal.processors.query.schema.message.SchemaFinishDiscoveryMessage
+org.apache.ignite.internal.processors.query.schema.message.SchemaOperationStatusMessage
+org.apache.ignite.internal.processors.query.schema.message.SchemaProposeDiscoveryMessage
+org.apache.ignite.internal.processors.query.stat.messages.StatisticsColumnData
+org.apache.ignite.internal.processors.query.stat.messages.StatisticsDecimalMessage
+org.apache.ignite.internal.processors.query.stat.messages.StatisticsKeyMessage
+org.apache.ignite.internal.processors.query.stat.messages.StatisticsObjectData
+org.apache.ignite.internal.processors.query.stat.messages.StatisticsRequest
+org.apache.ignite.internal.processors.query.stat.messages.StatisticsResponse
+org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultRequest
+org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultResponse
+org.apache.ignite.internal.processors.service.ServiceDeploymentProcessId
+org.apache.ignite.internal.processors.service.ServiceSingleNodeDeploymentResult
+org.apache.ignite.internal.processors.service.ServiceSingleNodeDeploymentResultBatch
+org.apache.ignite.internal.util.GridByteArrayList
+org.apache.ignite.internal.util.GridPartitionStateMap
+org.apache.ignite.internal.util.UUIDCollectionMessage
+org.apache.ignite.internal.util.distributed.SingleNodeMessage
+org.apache.ignite.internal.visor.VisorTaskArgument
+org.apache.ignite.internal.visor.VisorTaskResult
+org.apache.ignite.internal.visor.compute.VisorComputeCancelSessionsTaskArg
+org.apache.ignite.internal.visor.misc.VisorIdAndTagViewTaskResult
+org.apache.ignite.plugin.extensions.communication.Message
+org.apache.ignite.spi.collision.jobstealing.JobStealingRequest
+org.apache.ignite.spi.communication.tcp.internal.TcpConnectionIndexAwareMessage
+org.apache.ignite.spi.communication.tcp.internal.TcpInverseConnectionResponseMessage
+org.apache.ignite.spi.communication.tcp.messages.HandshakeMessage
+org.apache.ignite.spi.communication.tcp.messages.HandshakeWaitMessage
+org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage
+org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage
+org.apache.ignite.spi.discovery.tcp.internal.DiscoveryDataPacket
+org.apache.ignite.spi.discovery.tcp.messages.InetAddressMessage
+org.apache.ignite.spi.discovery.tcp.messages.InetSocketAddressMessage
+org.apache.ignite.spi.discovery.tcp.messages.NodeSpecificData
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAuthFailedMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCacheMetricsMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCheckFailedMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientAckResponse
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientMetricsUpdateMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientNodesMetricsMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientPingRequest
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryClientPingResponse
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryConnectionCheckMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDiscardMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDuplicateIdMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHandshakeRequest
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryHandshakeResponse
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryJoinRequestMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryLoopbackProblemMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryMetricsUpdateMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddFinishedMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFailedMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFullMetricsMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeLeftMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeMetricsMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryPingRequest
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryPingResponse
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryRingLatencyCheckMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryServerOnlyCustomEventMessage
+org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessage
diff --git a/.github/workflows/check-protected-classes.yml b/.github/workflows/check-protected-classes.yml
new file mode 100644
index 0000000000000..f97a0dce99485
--- /dev/null
+++ b/.github/workflows/check-protected-classes.yml
@@ -0,0 +1,117 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: Check Protected Classes
+on:
+ pull_request:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
+ cancel-in-progress: true
+
+jobs:
+ check-protected-classes:
+ runs-on: ubuntu-latest
+ name: Check protected classes
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ fetch-depth: 0
+
+ - name: Check for protected class modifications
+ id: check
+ run: |
+ BASE_SHA=${{ github.event.pull_request.base.sha }}
+ HEAD_SHA=${{ github.event.pull_request.head.sha }}
+
+ CHANGED=$(git diff --name-only --diff-filter=ACMR "$BASE_SHA"..."$HEAD_SHA" -- '*.java')
+ [ -z "$CHANGED" ] && exit 0
+
+ HITS=""
+ while IFS= read -r file; do
+ FQN=$(echo "$file" | sed -n 's|.*/src/main/java/||p' | sed 's|/|.|g; s|\.java$||')
+ [ -z "$FQN" ] && continue
+ if grep -q "^${FQN}$" .github/protected-classes.txt 2>/dev/null; then
+ HITS="${HITS}${file}\n"
+ elif grep -qE '@Order\(|@Argument\(' "$file" 2>/dev/null; then
+ HITS="${HITS}${file} (new, not in registry)\n"
+ fi
+ done <<< "$CHANGED"
+
+ if [ -n "$HITS" ]; then
+ echo "affected=true" >> "$GITHUB_OUTPUT"
+ printf '%b' "$HITS" > /tmp/protected-hits.txt
+ fi
+
+ - name: Comment on PR
+ if: steps.check.outputs.affected == 'true'
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const fs = require('fs');
+ const hits = fs.readFileSync('/tmp/protected-hits.txt', 'utf8').trim();
+ const body = [
+ '## Protected Classes Review Required',
+ '',
+ 'This PR modifies protected classes (Message/IgniteDataTransferObject hierarchy).',
+ 'Changes to these classes can break rolling upgrade compatibility.',
+ '',
+ '**Affected files:**',
+ hits.split('\n').map(f => '- `' + f.trim() + '`').join('\n'),
+ '',
+ '**Checklist:**',
+ '- [ ] New fields added at the end (highest `@Order`)',
+ '- [ ] No existing fields removed or reordered',
+ '- [ ] `directType()` not changed',
+ '- [ ] Field types not changed in binary-incompatible way',
+ '- [ ] Rolling upgrade test covers this change',
+ ].join('\n');
+
+ const { data: comments } = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.issue.number,
+ });
+
+ const existing = comments.find(c => c.body.includes('Protected Classes Review Required'));
+
+ if (existing) {
+ await github.rest.issues.updateComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: existing.id,
+ body,
+ });
+ } else {
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.issue.number,
+ body,
+ });
+ }
+
+ - name: Add label
+ if: steps.check.outputs.affected == 'true'
+ uses: actions/github-script@v7
+ with:
+ script: |
+ await github.rest.issues.addLabels({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.issue.number,
+ labels: ['protected-classes'],
+ });
diff --git a/.github/workflows/update-protected-classes.yml b/.github/workflows/update-protected-classes.yml
new file mode 100644
index 0000000000000..db0703e179c30
--- /dev/null
+++ b/.github/workflows/update-protected-classes.yml
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: Update Protected Classes Registry
+on:
+ pull_request:
+ types: [closed]
+
+jobs:
+ update-registry:
+ if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'protected-classes')
+ runs-on: ubuntu-latest
+ name: Update protected classes registry
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.base.ref }}
+
+ - name: Setup java
+ uses: actions/setup-java@v4
+ with:
+ distribution: 'temurin'
+ java-version: '11'
+
+ - name: Build tools and dependencies
+ run: |
+ ./mvnw install -pl modules/tools -am -DskipTests -B -q
+
+ - name: Copy dependencies
+ run: |
+ ./mvnw dependency:copy-dependencies -pl modules/tools -B -q
+
+ - name: Generate protected-classes.txt
+ run: |
+ java -cp "modules/tools/target/classes:modules/tools/target/dependency/classgraph-*.jar:modules/core/target/classes:modules/core/target/dependency/*" \
+ org.apache.ignite.tools.protectedclasses.ProtectedClassesGenerator \
+ .github/protected-classes.txt
+
+ - name: Commit and push if changed
+ run: |
+ git diff --quiet .github/protected-classes.txt && exit 0
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ git add .github/protected-classes.txt
+ git commit -m "Update .github/protected-classes.txt after #${{ github.event.pull_request.number }}"
+ git push
diff --git a/modules/tools/pom.xml b/modules/tools/pom.xml
index a6225e3cc3ad8..35539210a9edc 100644
--- a/modules/tools/pom.xml
+++ b/modules/tools/pom.xml
@@ -199,5 +199,11 @@
+ * Usage: {@code java ProtectedClassesGenerator