feat(cache): add updated_at columns and auth mapper operations for version-validated caching#10793
Draft
yuqi1129 wants to merge 5 commits intoapache:mainfrom
Draft
feat(cache): add updated_at columns and auth mapper operations for version-validated caching#10793yuqi1129 wants to merge 5 commits intoapache:mainfrom
yuqi1129 wants to merge 5 commits intoapache:mainfrom
Conversation
Closed
1 task
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces DB-side version sentinels (updated_at) and an append-only change log (entity_change_log) to support version-validated, strong-consistency authorization caching and targeted cross-node cache invalidation in HA deployments.
Changes:
- Adds a MySQL upgrade script to introduce
updated_atcolumns on auth metadata tables, new covering indexes, and the newentity_change_logtable. - Adds new MyBatis mapper/provider methods to update/read
updated_at, query owner changes, and insert/select/prune entity change log rows. - Adds new
po/authrecord types to represent lightweight auth/cache query results.
Reviewed changes
Copilot reviewed 23 out of 23 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/mysql/upgrade-1.2.0-to-1.3.0-mysql.sql | MySQL schema upgrade: add updated_at columns, indexes, backfill, and entity_change_log table. |
| core/src/main/java/org/apache/gravitino/storage/relational/po/auth/UserAuthInfo.java | Record for user id + staleness sentinel. |
| core/src/main/java/org/apache/gravitino/storage/relational/po/auth/GroupAuthInfo.java | Record for group id + staleness sentinel. |
| core/src/main/java/org/apache/gravitino/storage/relational/po/auth/OwnerInfo.java | Record for owner identity result. |
| core/src/main/java/org/apache/gravitino/storage/relational/po/auth/RoleUpdatedAt.java | Record for role id + updated_at batch query results. |
| core/src/main/java/org/apache/gravitino/storage/relational/po/auth/ChangedOwnerInfo.java | Record for owner change poller results. |
| core/src/main/java/org/apache/gravitino/storage/relational/po/auth/EntityChangeRecord.java | Record for entity change poller results. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/UserMetaBaseSQLProvider.java | Adds SQL for touching user updated_at and fetching UserAuthInfo. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/RoleMetaBaseSQLProvider.java | Adds SQL for touching role updated_at and batch-getting role updated_at. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/GroupMetaBaseSQLProvider.java | Adds SQL for touching group updated_at and fetching group auth info for a user. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/OwnerMetaBaseSQLProvider.java | Adds SQL for selecting owner by object id and scanning changed owners. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/EntityChangeLogBaseSQLProvider.java | Base SQL for selecting/inserting/pruning entity change log entries. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/DefaultMapperPackageProvider.java | Registers the new EntityChangeLogMapper. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/UserMetaSQLProviderFactory.java | Exposes new user SQL provider methods. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/UserMetaMapper.java | Adds mapper methods for touching user updated_at and selecting UserAuthInfo. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/RoleMetaSQLProviderFactory.java | Exposes new role SQL provider methods. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/RoleMetaMapper.java | Adds mapper methods for touching role updated_at and batch-getting RoleUpdatedAt. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/GroupMetaSQLProviderFactory.java | Exposes new group SQL provider methods. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/GroupMetaMapper.java | Adds mapper methods for touching group updated_at and selecting GroupAuthInfo. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/OwnerMetaSQLProviderFactory.java | Exposes new owner SQL provider methods. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/OwnerMetaMapper.java | Adds mapper methods returning OwnerInfo and ChangedOwnerInfo. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/EntityChangeLogSQLProviderFactory.java | Provider factory for entity change log operations across backends. |
| core/src/main/java/org/apache/gravitino/storage/relational/mapper/EntityChangeLogMapper.java | New MyBatis mapper for entity_change_log. |
Comment on lines
+246
to
+250
| public String selectChangedOwners(@Param("updatedAtAfter") long updatedAtAfter) { | ||
| return "SELECT metadata_object_id as metadataObjectId, updated_at as updatedAt" | ||
| + " FROM " | ||
| + OWNER_TABLE_NAME | ||
| + " WHERE updated_at > #{updatedAtAfter} ORDER BY updated_at"; |
Comment on lines
+39
to
+56
| @SelectProvider( | ||
| type = EntityChangeLogSQLProviderFactory.class, | ||
| method = "selectEntityChanges") | ||
| List<EntityChangeRecord> selectChanges( | ||
| @Param("createdAtAfter") long createdAtAfter, @Param("maxRows") int maxRows); | ||
|
|
||
| @InsertProvider(type = EntityChangeLogSQLProviderFactory.class, method = "insertEntityChange") | ||
| void insertChange( | ||
| @Param("metalakeName") String metalakeName, | ||
| @Param("entityType") String entityType, | ||
| @Param("fullName") String fullName, | ||
| @Param("operateType") String operateType, | ||
| @Param("createdAt") long createdAt); | ||
|
|
||
| @DeleteProvider( | ||
| type = EntityChangeLogSQLProviderFactory.class, | ||
| method = "pruneOldEntityChanges") | ||
| void pruneOldEntries(@Param("before") long before); |
Comment on lines
+30
to
+35
| private static final Map<JDBCBackendType, EntityChangeLogBaseSQLProvider> | ||
| ENTITY_CHANGE_LOG_SQL_PROVIDER_MAP = | ||
| ImmutableMap.of( | ||
| JDBCBackendType.MYSQL, new EntityChangeLogMySQLProvider(), | ||
| JDBCBackendType.H2, new EntityChangeLogH2Provider(), | ||
| JDBCBackendType.POSTGRESQL, new EntityChangeLogPostgreSQLProvider()); |
| + " FROM " | ||
| + GROUP_TABLE_NAME | ||
| + " gm" | ||
| + " JOIN group_user_rel gu ON gm.group_id = gu.group_id AND gu.deleted_at = 0" |
Comment on lines
+240
to
+243
| public String selectOwnerByMetadataObjectId(@Param("metadataObjectId") long metadataObjectId) { | ||
| return "SELECT owner_id as ownerId, owner_type as ownerType FROM " | ||
| + OWNER_TABLE_NAME | ||
| + " WHERE metadata_object_id = #{metadataObjectId} AND deleted_at = 0"; |
| public String pruneOldEntityChanges(@Param("before") long before) { | ||
| return "DELETE FROM " | ||
| + ENTITY_CHANGE_LOG_TABLE_NAME | ||
| + " WHERE created_at < #{before} LIMIT 1000"; |
| CREATE INDEX idx_role_meta_del_upd | ||
| ON role_meta (role_id, deleted_at, updated_at); | ||
| CREATE INDEX idx_owner_meta_obj_del_upd | ||
| ON owner_meta (metadata_object_id, deleted_at, updated_at); |
…er operations - Add updated_at BIGINT NOT NULL DEFAULT 0 to role_meta, user_meta, group_meta, owner_meta - Create entity_change_log table for HA cross-node targeted metadataIdCache invalidation - Add covering indexes for auth read-path version checks - Add new mapper methods: touchUpdatedAt/batchGetUpdatedAt (RoleMetaMapper), touchUpdatedAt/getUserInfo (UserMetaMapper), touchUpdatedAt/getGroupInfoByUserId (GroupMetaMapper), selectOwnerByMetadataObjectId/selectChangedOwners (OwnerMetaMapper) - Create EntityChangeLogMapper with selectChanges/insertChange/pruneOldEntries - Add result types UserAuthInfo, GroupAuthInfo, OwnerInfo, RoleUpdatedAt, ChangedOwnerInfo, EntityChangeRecord (plain Java classes, Java 11 compatible) - Add schema-1.3.0 and upgrade-1.2.0-to-1.3.0 scripts for MySQL, H2, PostgreSQL - Add unit tests TestAuthMappers covering all new mapper methods Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
75bd9f5 to
dd6c855
Compare
…ervice write paths - RoleMetaService: touchUpdatedAt on privilege grant/revoke (same transaction) - UserMetaService: touchUpdatedAt on role assign/revoke (same transaction) - GroupMetaService: touchUpdatedAt on role assign/revoke (same transaction) - OwnerRelPO: add updatedAt field; insertOwnerRel SQL includes updated_at column - POConverters: set updatedAt=currentTimeMillis in initializeOwnerRelPOsWithVersion - CatalogMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - SchemaMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - TableMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - FilesetMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - TopicMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - ViewMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - ModelMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - MetalakeMetaService: INSERT entity_change_log on rename (ALTER) and drop (DROP) - All entity_change_log INSERTs are in the same DB transaction as the data change Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…hange_log pruning PostgreSQL does not support DELETE ... LIMIT syntax. Override pruneOldEntityChanges in EntityChangeLogPostgreSQLProvider to use DELETE ... WHERE id IN (SELECT id ... LIMIT 1000) instead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Code Coverage Report
Files |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes were proposed in this pull request?
updated_at BIGINT NOT NULL DEFAULT 0torole_meta,user_meta,group_meta,owner_metatables for version-validated strong consistencyentity_change_logtable for HA cross-node targeted invalidation of name→id cachetouchUpdatedAt/batchGetUpdatedAtonRoleMetaMappertouchUpdatedAt/getUserInfoonUserMetaMappertouchUpdatedAt/getGroupInfoByUserIdonGroupMetaMapperselectOwnerByMetadataObjectId/selectChangedOwnersonOwnerMetaMapperEntityChangeLogMapperfor entity structural change tracking (insert/select/prune)po/auth:UserAuthInfo,GroupAuthInfo,OwnerInfo,RoleUpdatedAt,ChangedOwnerInfo,EntityChangeRecordupgrade-1.2.0-to-1.3.0-mysql.sqlPart of the Gravitino auth cache improvement design: Phase 1.2 + Phase 2 DB schema work.
Why are the changes needed?
The current JcasbinAuthorizer reloads all role policies on every request when the cache misses. The
updated_atversion sentinels enable strong-consistency version checks so that only stale entries are reloaded, and theentity_change_logtable enables targeted cross-node cache invalidation in HA deployments without full cache flushes.Does this PR introduce any user-facing changes?
No. All changes are internal DB schema and mapper additions; no public API changes.
How was this patch tested?
./gradlew :core:test -PskipITs🤖 Generated with Claude Code