[ https://issues.apache.org/jira/browse/IGNITE-25043?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ivan Bessonov updated IGNITE-25043: ----------------------------------- Description: h3. Problem Sometimes we make a typo and want to fix it, or we simply want to rename a configuration by adding some suffix, like {{Bytes}} or {{{}Millis{}}}. We should be able to do that in a compatible way. h3. Solution, roughly There are two opposite things happening here: * When we read/parse configuration, we should make sure that *old* name is still parsed correctly, being recognized as a proper configuration key * When we save/show configuration, we should use *new* name. *Old* name should be deleted from the storage at the same time, if we're talking about saving configuration to the storage. These points affect both REST/CLI and configuration storages. I suggest introducing these changes under the umbrella of existing {{org.apache.ignite.configuration.annotation.PublicName}} annotation, just make the rules a bit more complicated. Now it's going to be: {code:java} public @interface PublicName { /** * Public configuration property name. This name, if present, is used to store this configuration in configuration storage and to render the configuration to the user. * Empty string means that public name matches the schema field name. */ String value() default ""; /** * An array of old deprecated names for the configuration. Any of these names should be accounted for when parsing configuration from any source, but avoided when * showing to the user or saving to the configuration storage. These names should also be deleted from the corresponding configuration storage upon encountering. */ String[] legacyNames() default {}; } {code} Javadocs in this example are not final and should be improved. When using a runtime-generated "construct" API, it should react to every legacy name as if it is the real name. But when it comes to "visit" API, it should only use a public name. We should also provide an API for resolving public name into an array of legacy names, this is needed for deleting them from configuration storage. {*}Everything should be covered with as many unit tests as possible{*}. The rename itself should be tested with two parallel hierarchies of schemas, that will work on top of a single configuration storage. We should emulate the configuration schema changes between component restarts, and there's only one way of achieving it. was: h3. Problem Sometimes we make a typo and want to fix it, or we simply want to rename a configuration by adding some suffix, like {{Bytes}} or {{{}Millis{}}}. We should be able to do that in a compatible way. h3. Solution, roughly There are two opposite things happening here: * When we read/parse configuration, we should make sure that *old* name is still parsed correctly, being recognized as a proper configuration key * When we save/show configuration, we should use *new* name. *Old* name should be deleted from the storage at the same time, if we're talking about saving configuration to the storage. These points affect both REST/CLI and configuration storages. I suggest introducing these changes under the umbrella of existing {{org.apache.ignite.configuration.annotation.PublicName}} annotation, just make the rules a bit more complicated. Now it's going to be: {code:java} public @interface PublicName { /** * Public configuration property name. This name, if present, is used to store this configuration in configuration storage and to render the configuration to the user. * Empty string means that public name matches the schema field name. */ String value() default ""; /** * An array of old deprecated names for the configuration. Any of these names should be accounted for when parsing configuration from any source, but avoided when * showing to the user or saving to the configuration storage. These names should also be deleted from the corresponding configuration storage upon encountering. */ String[] legacyNames() default {}; } {code} Javadocs in this example are not final and should be improved. When using a runtime-generated "construct" API, it should react to every legacy name as if it is the real name. But when it comes to "visit" API, it should only use a public name. We should also provide an API for resolving public name into an array of legacy names, this is needed for deleting them from configuration storage. {*}Everything should be covered with as many unit tests as possible{*}. The rename itself should be tested with two parallel hierarchies of schemas, that will work on top of a single configuration storage. We should emulate the configuration schema changes between component restarts, and there's only one way of achieving it. > Support configuration rename > ---------------------------- > > Key: IGNITE-25043 > URL: https://issues.apache.org/jira/browse/IGNITE-25043 > Project: Ignite > Issue Type: Improvement > Reporter: Ivan Bessonov > Priority: Major > Labels: ignite-3 > > h3. Problem > Sometimes we make a typo and want to fix it, or we simply want to rename a > configuration by adding some suffix, like {{Bytes}} or {{{}Millis{}}}. We > should be able to do that in a compatible way. > h3. Solution, roughly > There are two opposite things happening here: > * When we read/parse configuration, we should make sure that *old* name is > still parsed correctly, being recognized as a proper configuration key > * When we save/show configuration, we should use *new* name. *Old* name > should be deleted from the storage at the same time, if we're talking about > saving configuration to the storage. > These points affect both REST/CLI and configuration storages. > I suggest introducing these changes under the umbrella of existing > {{org.apache.ignite.configuration.annotation.PublicName}} annotation, just > make the rules a bit more complicated. Now it's going to be: > {code:java} > public @interface PublicName { > /** > * Public configuration property name. This name, if present, is used to > store this configuration in configuration storage and to render the > configuration to the user. > * Empty string means that public name matches the schema field name. > */ > String value() default ""; > /** > * An array of old deprecated names for the configuration. Any of these > names should be accounted for when parsing configuration from any source, but > avoided when > * showing to the user or saving to the configuration storage. These > names should also be deleted from the corresponding configuration storage > upon encountering. > */ > String[] legacyNames() default {}; > } {code} > Javadocs in this example are not final and should be improved. > When using a runtime-generated "construct" API, it should react to every > legacy name as if it is the real name. But when it comes to "visit" API, it > should only use a public name. We should also provide an API for resolving > public name into an array of legacy names, this is needed for deleting them > from configuration storage. > {*}Everything should be covered with as many unit tests as possible{*}. > The rename itself should be tested with two parallel hierarchies of schemas, > that will work on top of a single configuration storage. We should emulate > the configuration schema changes between component restarts, and there's only > one way of achieving it. -- This message was sent by Atlassian Jira (v8.20.10#820010)