[ 
https://issues.apache.org/jira/browse/SOLR-5746?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14060685#comment-14060685
 ] 

Maciej Zasada edited comment on SOLR-5746 at 7/15/14 11:08 AM:
---------------------------------------------------------------

Hi [~hossman],

I've attached updated patch file:
* removed {{DOMUtil.readNamedChildrenAsNamedList}} method and used (slightly 
modified) existing API of {{DOMUtil}} instead.
* removed reading values from {{SolrParam}} - they are being read directly from 
the {{NamedList<>}}
* added reporting of duplicated config options ({{DEBUG}} level) per parent 
node, as well as exception message containing list of duplicated parameters, 
e.g.

{code}<solr>
<solrcloud>
<int name="int-param">1</int>
<str name="str-param">STRING-1</str>
…
<int name="int-param">2</int>
<str name="str-param">STRING-2</str>
</solrcloud>
</solr>
{code}
will cause an exception:
{code}
Duplicated 2 config parameter(s) in solr.xml file: [int-param, str-param]
{code}
However, if parameters with a same name are attached to different parent nodes 
everything will pass just fine, e.g.
{code}<solr>
<solrcloud>
<int name="int-param">1</int>
<str name="str-param">STRING-1</str>
…
</solrcloud>
<logging>
…
<int name="int-param">2</int>
<str name="str-param">STRING-2</str>
</logging>
</solr>
{code}
In this case no exception will be thrown. 

Some examples to sum it up:

|{{solr.xml}} file fragment|Expected type|Parsing result|
|{{<int name="hostPort">44</int>}}|{{Integer}}|(/)
|{{<str name="hostPort">44</str>}}|{{Integer}}|(/)
|{{<long name="hostPort">44</long>}}|{{Integer}}|(x)
|{{<bool name="hostPort">44</bool>}}|{{Integer}}|(x)
|{{<float name="hostPort">44</float>}}|{{Integer}}|(x)
|{{<double name="hostPort">44</double>}}|{{Integer}}|(x)
|{{<int name="enabled">true</int>}}|{{Boolean}}|(x)
|{{<str name="enabled">true</str>}}|{{Boolean}}|(/)
|{{<long name="enabled">true</long>}}|{{Boolean}}|(x)
|{{<bool name="enabled">true</bool>}}|{{Boolean}}|(/)
|{{<float name="enabled">true</float>}}|{{Boolean}}|(x)
|{{<double name="enabled">true</double>}}|{{Boolean}}|(x)

{{ant clean test}} shows that there's no regression.

[~jkrupan] this change clearly is not backward compatible with the existing 
{{solr.xml}} files. For instance - unknown config values won't be silently 
ignored - an exception will be thrown instead. However, I didn't realise that 
{{solr.xml}} files are versioned the same way as {{schema.xml}} files are. 
Should I bump the schema version to 1.6?

Cheers,
Maciej


was (Author: maciej.zasada):
Hi [~hossman],

I've attached updated patch file:
* removed {{DOMUtil.readNamedChildrenAsNamedList}} method and used (slightly 
modified) existing API of {{DOMUtil}} instead.
* removed reading values from {{SolrParam}} - they are being read directly from 
the {{NamedList<>}}
* added reporting of duplicated config options ({{DEBUG}} level) per parent 
node, as well as exception message containing list of duplicated parameters, 
e.g.

{code}<solr>
<solrcloud>
<int name="int-param">1</int>
<str name="str-param">STRING-1</str>
…
<int name="int-param">2</int>
<str name="str-param">STRING-2</str>
</solrcloud>
</solr>
{code}
will cause an exception:
{code}
Duplicated 2 config parameter(s) in solr.xml file: [int-param, str-param]
{code}
However, if parameters with a same name are attached to different parent nodes 
everything will pass just fine, e.g.
{code}<solr>
<solrcloud>
<int name="int-param">1</int>
<str name="str-param">STRING-1</str>
…
</solrcloud>
<logging>
…
<int name="int-param">2</int>
<str name="str-param">STRING-2</str>
</logging>
</solr>
{code}
In this case no exception will be thrown. 

Some examples to sum it up:

|{{solr.xml}} file fragment|Expected type|Parsing result|
|{{<int name="hostPort">44</int>}}|{{Integer}}|(/)
|{{<str name="hostPort">44</str>}}|{{Integer}}|(/)
|{{<long name="hostPort">44</long>}}|{{Integer}}|(/)
|{{<bool name="hostPort">44</bool>}}|{{Integer}}|(x)
|{{<float name="hostPort">44</float>}}|{{Integer}}|(x)
|{{<double name="hostPort">44</double>}}|{{Integer}}|(x)
|{{<int name="enabled">true</int>}}|{{Boolean}}|(x)
|{{<str name="enabled">true</str>}}|{{Boolean}}|(/)
|{{<long name="enabled">true</long>}}|{{Boolean}}|(x)
|{{<bool name="enabled">true</bool>}}|{{Boolean}}|(/)
|{{<float name="enabled">true</float>}}|{{Boolean}}|(x)
|{{<double name="enabled">true</double>}}|{{Boolean}}|(x)

{{ant clean test}} shows that there's no regression.

[~jkrupan] this change clearly is not backward compatible with the existing 
{{solr.xml}} files. For instance - unknown config values won't be silently 
ignored - an exception will be thrown instead. However, I didn't realise that 
{{solr.xml}} files are versioned the same way as {{schema.xml}} files are. 
Should I bump the schema version to 1.6?

Cheers,
Maciej

> solr.xml parsing of "str" vs "int" vs "bool" is brittle; fails silently; 
> expects odd type for "shareSchema"   
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-5746
>                 URL: https://issues.apache.org/jira/browse/SOLR-5746
>             Project: Solr
>          Issue Type: Bug
>    Affects Versions: 4.3, 4.4, 4.5, 4.6
>            Reporter: Hoss Man
>         Attachments: SOLR-5746.patch, SOLR-5746.patch, SOLR-5746.patch, 
> SOLR-5746.patch
>
>
> A comment in the ref guide got me looking at ConfigSolrXml.java and noticing 
> that the parsing of solr.xml options here is very brittle and confusing.  In 
> particular:
> * if a boolean option "foo" is expected along the lines of {{<bool 
> name="foo">true</bool>}} it will silently ignore {{<str 
> name="foo">true</str>}}
> * likewise for an int option {{<int name="bar">32</int>}} vs {{<str 
> name="bar">32</str>}}
> ... this is inconsistent with the way solrconfig.xml is parsed.  In 
> solrconfig.xml, the xml nodes are parsed into a NamedList, and the above 
> options will work in either form, but an invalid value such as {{<bool 
> name="foo">NOT A BOOLEAN</bool>}} will generate an error earlier (when 
> parsing config) then {{<str name="foo">NOT A BOOLEAN</str>}} (attempt to 
> parse the string as a bool the first time the config value is needed)
> In addition, i notice this really confusing line...
> {code}
>     propMap.put(CfgProp.SOLR_SHARESCHEMA, 
> doSub("solr/str[@name='shareSchema']"));
> {code}
> "shareSchema" is used internally as a boolean option, but as written the 
> parsing code will ignore it unless the user explicitly configures it as a 
> {{<str/>}}



--
This message was sent by Atlassian JIRA
(v6.2#6252)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to