hypfvieh / dbus-java

Improved version of java DBus library provided by freedesktop.org (https://dbus.freedesktop.org/doc/dbus-java/)
https://hypfvieh.github.io/dbus-java/
MIT License
185 stars 73 forks source link

Possibility to disable share dbus connection cache during connection creation #14

Closed lbeuster closed 6 years ago

lbeuster commented 6 years ago

Currently there are only static methods to get a dbus connection. These methods use a static map that return always the same connection instance for the same address. Especially in tests where you simulate server and client this is not a good idea. I would be nice to create independant dbus connections.

What do you think? If we have a decision I could create a pull request.

hypfvieh commented 6 years ago

I can remember exactly why, but allowing the outside world to create multiple DBusConnections in the same application does not work that well.

I came accross that problem while refactoring dbus-java for version 3.0. After cleaning up, I wanted to get rid of the static stuff and shared connections. But after removing this part and using the constructor directly, the connection did not work at all.

If I remember correctly it was an issue with the Unix-Socket stuff. If you try to connect to DBus using UnixSocket multiple times from the same application your connection will be refused.

So even if it would be possible to create multiple DBusConnections it would cause trouble later on, or does not behave like expected.

lbeuster commented 6 years ago

I'm not quite sure but I think this is no limitation of unix domain sockets. I guess it's somewhere in the code or used libs. Currently I use independant dbus connection object (calling the private constructor via reflection) and have no problems. I will check my tests if I really use connection in parallel.

And even if it doesn't work for parallel clients on domain sockets it still works for tcp-sockets or for domain sockets with only one active connection.

Do you have some code to reproduce this behavior. Or do you remember the usecase that caused your problems on 3.0 (1 client + 1 service or 2 clients + 1 service or ...)?

hypfvieh commented 6 years ago

Sorry, I don't know which setup it was, it's just too long ago...

I'm also sure that this is not a DBus problem. I guess it's more an issue of the UnixSocket library (libmatthew) and/or the integrated SASL stuff.

lbeuster commented 6 years ago

I will try a little bit to reproduce it...

lbeuster commented 6 years ago

I created a stress test with several services and several clients in the same JVM each using it's own DBusConnection. I could not produce any error on Mac and Ubuntu. That's the expected behavior. Maybe there was a mistake during your refactoring or perhaps something in my test is wrong. If you want to have a look on it...

https://github.com/lbeuster/dbus-java/tree/no_shared_connection

And please feel free to add it to dbus-java.

hypfvieh commented 6 years ago

I added your test and changes to 32442c1. Thanks for your contribution. I'll close this ticket now.