----- Original Message -----

> Hi All,
Hi Kanagaraj, 

> The are some issues arising in configurations whenever we move up on the
> versions(3.3 => 3.4), because of the way we store and interpret them.

> Whenever there is a new cluster level, you will need to add a new entry for
> all(most) of the configuration. Mostly a copy paste if you see from 3.2 to
> 3.3, except some CPU/PM type related configurations.
> Better option would be to have the defaul config value in ConfigValues.java
> and the overrides will go to config.sql. In this approach you don't need a
> new entries to config.sql when there is a new cluster level.

> Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1
> onwards,

> If you look at config.sql, you will see following entries
> select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
> select fn_db_add_config_value('SupportForceCreateVG','true','3.1');
> select fn_db_add_config_value('SupportForceCreateVG','true','3.2');
> select fn_db_add_config_value('SupportForceCreateVG','true','3.3');

> And in ConfigValues.java

> @TypeConverterAttribute(Boolean.class)
> @DefaultValueAttribute("false")
> SupportForceCreateVG,

> Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i
> feel is redundant.

> Instead we can make

> @TypeConverterAttribute(Boolean.class)
> @DefaultValueAttribute("true")
> SupportForceCreateVG,

> and have only the following in config.sql
> select fn_db_add_config_value('SupportForceCreateVG','false','3.0');

> if a particular value(for a specific cluster level) is not found in
> Config.sql, the fallback is to use the value available in ConfigValues.java.
This has already been implemented, there are many "feature supported" 
configurations working like this (for example GlusterSupport). 

I think a more interesting approach would be to move these out of the DB since 
these values don't really hav e a reson to be there. 
Since the entire thing is abstracted by "Gluster/FeatureSupported" classes then 
we can easily change mechanism (of course whatever code is not using it can be 
easily converted to use the mechanism) 

For example a simple enum could do the trick: 
------------------------------------- EXAMPLE 
------------------------------------- 
/** 
* Convenience class to check if a gluster feature is supported or not in any 
given version.<br> 
* Methods should be named by feature and accept version to check against. 
*/ 
public class GlusterFeatureSupported { 
/** 
* @param version 
* Compatibility version to check for. 
* @return <code>true</code> if gluster support is enabled, <code>false</code> 
if it's not. 
*/ 
public static boolean gluster(Version version) { 
return SupportedFeatures.GLUSTER.isSupportedOn(version); 
} 

/** 
* @param version 
* Compatibility version to check for. 
* @return <code>true</code> if gluster heavyweight refresh is enabled, 
<code>false</code> if it's not. 
*/ 
public static boolean refreshHeavyWeight(Version version) { 
return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); 
} 

/* More methods... */ 

enum SupportedFeatures { 
GLUSTER(Version.v3_0), 
REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), 
/* More members */; 

private Set<Version> unsupportedVersions = new HashSet<Version>(); 

private SupportedFeatures(Version... versions) { 
unsupportedVersions.addAll(Arrays.asList(versions)); 
} 

public boolean isSupportedOn(Version version) { 
return !unsupportedVersions.contains(version); 
} 
} 
------------------------------------- END EXAMPLE 
------------------------------------- 

Thoughts? 

Regards, 
Mike 

> Please share your thoughts on this.

> Thanks,
> Kanagaraj
_______________________________________________
Engine-devel mailing list
Engine-devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-devel

Reply via email to