danny0405 commented on code in PR #19205:
URL: https://github.com/apache/hudi/pull/19205#discussion_r3746146966


##########
hudi-common/src/main/java/org/apache/hudi/common/table/HoodieTableMetaClient.java:
##########
@@ -1535,7 +1554,37 @@ public Properties build() {
           
tableConfig.setValue(HoodieTableConfig.CDC_SUPPLEMENTAL_LOGGING_MODE, 
cdcSupplementalLoggingMode);
         }
       }
-      if (null != populateMetaFields) {
+      // hoodie.meta.fields.mode is the source of truth, and hoodie.properties 
must never contradict
+      // it: a table written selectively that still recorded 
populate.meta.fields=true would be read
+      // as ALL by a pre-1.3.0 reader, which ignores the mode property 
entirely. For NONE that is
+      // actively unsafe — an older incremental reader would run against 
all-null commit times and
+      // silently return no rows.
+      //
+      // A caller that states both and disagrees is rejected rather than 
silently overridden. Half
+      // their request would otherwise be discarded without a word, and it 
would be inconsistent with
+      // BaseHoodieWriteClient#validateAgainstTableProperties, which already 
rejects an explicitly-set
+      // boolean that disagrees with the table. Only a genuine contradiction 
fails: ALL + true and
+      // NONE + false are coherent restatements and pass.
+      if (null != metaFieldsMode) {
+        boolean derivedPopulateMetaFields = 
metaFieldsMode.toLegacyPopulateMetaFields();
+        if (null != populateMetaFields && populateMetaFields != 
derivedPopulateMetaFields) {
+          throw new HoodieException(String.format(
+              "Conflicting meta-field settings at table creation: %s=%s 
implies %s=%s, but %s was "
+                  + "explicitly set to %s. %s is the source of truth and the 
boolean is only its "
+                  + "pre-1.3.0 fallback, so the two cannot be set to different 
things. Drop %s, or set "
+                  + "it to %s.",
+              HoodieTableConfig.META_FIELDS_MODE.key(), metaFieldsMode,
+              HoodieTableConfig.POPULATE_META_FIELDS.key(), 
derivedPopulateMetaFields,
+              HoodieTableConfig.POPULATE_META_FIELDS.key(), populateMetaFields,
+              HoodieTableConfig.META_FIELDS_MODE.key(),
+              HoodieTableConfig.POPULATE_META_FIELDS.key(), 
derivedPopulateMetaFields));
+        }
+        tableConfig.setValue(HoodieTableConfig.META_FIELDS_MODE, 
metaFieldsMode.name());
+        tableConfig.setValue(HoodieTableConfig.POPULATE_META_FIELDS,
+            Boolean.toString(derivedPopulateMetaFields));
+      } else if (null != populateMetaFields) {
+        // No explicit mode: preserve pre-1.3.0 behavior and record only the 
legacy boolean, which
+        // resolves to ALL / NONE on read.

Review Comment:
   we not set up the meta fields modes here?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to