fix(2meet-data-optimizer): drift checks only where native meta is authoritative
- In aeav_only flat is the source of truth and native meta is stale by design, so drift there means nothing: drift-check --fix refuses (it would overwrite current flat values with stale native ones), the daily sample skips such entities, and the router keeps routing a drifting group instead of falling back to stale native meta. - Found before PR-074 on hardening/2.2 (PR-071–073 not released; dev21 still runs aeav_only). - Verify: DriftCheckTest / PostQueryRouterDriftTest aeav_only cases (RED before); dev36 fix() in a simulated aeav_only refused. - PR: PR-073b
This commit is contained in:
@@ -103,13 +103,15 @@ final class TMDO_Drift_Check {
|
||||
}
|
||||
|
||||
/**
|
||||
* Daily check (wpdo_daily_health_check): sample every entity type whose
|
||||
* flat tables are written (mode dual_write or higher). The outcome replaces
|
||||
* the recorded status, so a group found drifting leaves the router at once.
|
||||
* Daily check (wpdo_daily_health_check): sample every entity type written
|
||||
* to both native and flat (dual_write, shadow_read). In aeav_only flat is
|
||||
* the source of truth and native is stale by design, so drift means nothing
|
||||
* there. The outcome replaces the recorded status, so a group found
|
||||
* drifting leaves the router at once.
|
||||
*/
|
||||
public static function cron_tick(): void {
|
||||
foreach ( TMDO_Entity_Registry::VALID_ENTITY_TYPES as $entity_type ) {
|
||||
if ( ! TMDO_Mode_Manager::writes_to_flat( $entity_type ) ) {
|
||||
if ( ! TMDO_Mode_Manager::writes_to_flat( $entity_type ) || ! TMDO_Mode_Manager::writes_to_eav( $entity_type ) ) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
@@ -132,11 +134,16 @@ final class TMDO_Drift_Check {
|
||||
* @param string $entity_type post | user | term | comment.
|
||||
* @param string $group One group, or '' for every backfillable group.
|
||||
* @return array{fixed:array{rebuilt:int, cleared:int, deleted_rows:int}, after:array<string, mixed>}
|
||||
* @throws InvalidArgumentException Unknown entity type or group.
|
||||
* @throws RuntimeException In aeav_only, where flat is the source of truth
|
||||
* (and InvalidArgumentException via resolve() for an
|
||||
* unknown entity type or group).
|
||||
*/
|
||||
public static function fix( string $entity_type, string $group = '' ): array {
|
||||
global $wpdb;
|
||||
list( $adapter, $groups ) = self::resolve( $entity_type, $group );
|
||||
if ( TMDO_Mode_Manager::MODE_AEAV_ONLY === TMDO_Mode_Manager::get( $entity_type ) ) {
|
||||
throw new RuntimeException( esc_html( $entity_type ) . ' is in aeav_only: flat is the source of truth and native meta is stale, so it cannot be rebuilt from native. Write flat back first (wp tmdo bridge-restore-native).' );
|
||||
}
|
||||
|
||||
$id = $adapter->get_entity_id_column();
|
||||
$fixed = array(
|
||||
|
||||
@@ -525,12 +525,16 @@ class TMDO_Post_Query_Router {
|
||||
|
||||
/**
|
||||
* The last `wp tmdo drift-check` found the group out of step with native
|
||||
* meta. A group never checked keeps routing.
|
||||
* meta. A group never checked keeps routing, and so does every group in
|
||||
* aeav_only, where native is stale by design and no fallback.
|
||||
*
|
||||
* @param string $group Entity group name.
|
||||
* @return bool
|
||||
*/
|
||||
private static function drifting( string $group ): bool {
|
||||
if ( TMDO_Mode_Manager::MODE_AEAV_ONLY === TMDO_Mode_Manager::get( 'post' ) ) {
|
||||
return false;
|
||||
}
|
||||
$status = get_option( TMDO_Drift_Check::OPTION, array() );
|
||||
$last = is_array( $status ) ? ( $status['post'][ $group ] ?? null ) : null;
|
||||
return is_array( $last ) && (int) ( $last['miss'] ?? 0 ) + (int) ( $last['diff'] ?? 0 ) + (int) ( $last['extra'] ?? 0 ) > 0;
|
||||
|
||||
Reference in New Issue
Block a user