[systemd-devel] Confusing hwdb matching behaviour

Peter Hutterer peter.hutterer at who-t.net
Wed Aug 31 04:37:37 UTC 2016


The hwdb behaviour is a bit hard to predict when multiple matches with globs
apply to a device so I'm wondering whether this is just an implementation
result or intended behaviour.

Example 1:
$> cat 99-test.hwdb
test:*
 match=generic

test:specific*
 match=specific

$> systemd-hwdb  query "test:specific_match" 
match=specific

This is what I would expect from the hwdb entries. But if we have a rule where
glob matches before specific, the generic one overwrites the specific one:

Example 2:
$> cat 99-test.hwdb
test:*
 match=generic

test:*specific*
 match=specific
 match2=yep

$> systemd-hwdb  query "test:specific_match" 
match=generic
match2=yep

Definitely not what I expected (note: the order of the entries
doesn't matter). This is actually a problem for libinput because it means we
can't overwrite generic matches with specific matches.
But it gets even weirder once we start stacking more:

Example 3:
$> cat 99-test.hwdb
test:*
 match=generic

test:*specific*
 match=specific
 match2=yep

test:*specific_match
 match=specific
 match2=nope
 match3=yep

$> sudo systemd-hwdb  query "test:specific_match"
match=generic
match2=nope
match3=yep

It picks the most generic one last but the more specific one over the less
specific one. This is confusing and hard to predict. But it gets worse:

Example 4:
$> cat 99-test.hwdb
test:*
 match=generic

test:*specific*
 match=specific
 match2=yep

test:*spe*match
 match=specific
 match2=nope
 match3=yep

test:*specific*match
 match=specific
 match2=oh
 match3=what
 match4=confused

$> sudo systemd-hwdb  query "test:specific_match"
match=generic
match2=yep
match3=what
match4=confused

And now I'm lost :)
As a homework, try predicting what this one produces:

Exercise:
test:*
 MATCH=generic

# changing this to test:specific gives different results
test:*specific*
 MATCH=specific
 MATCH2=yep

test:*spe*match
 MATCH=specific
 MATCH2=nope
 MATCH3=yep

test:*specific_*
 MATCH=specific
 MATCH2=oh
 MATCH3=crap
 MATCH4=what?

test:*specific*match
 MATCH=specific
 MATCH2=doh
 MATCH3=what
 MATCH4=confused
 MATCH5=boo


Solution: 
"generic, oh, crap, what?, boo" with the glob, without the glob it's
"specific, yep, crap, what?, boo" 

So the question is: is this the intended behaviour (if so, we should
document it and make it official) or is this a side-effect. If that, can we
change it or is it set in stone? I think no-one but me is currently eagerly
stacking hwdb snippets, so maybe there's room to move.

As for expected behaviour, I'd intuitively expect a more sequential matching,
with an entry in 99-test.hwd overwriting whatever entry was in 10-test.hwdb.

Cheers,
   Peter


More information about the systemd-devel mailing list