jagrosh / MusicBot

🎶 A Discord music bot that's easy to set up and run yourself!
https://jmusicbot.com
Apache License 2.0
5.22k stars 2.5k forks source link

[Bug Report] JMusicBot fails to download native libraries if another user on the computer has already ran JMusicBot #196

Open alfonsojon opened 5 years ago

alfonsojon commented 5 years ago

Describe the bug If you are trying to run JMusicBot on a Linux server which already has another user running JMusicBot, it will crash with an error due to being unable to make a directory in /tmp for the native libraries.

To Reproduce Steps to reproduce the behavior:

  1. Create a user on a Linux server, download, and run JMusicBot
  2. Create a second user on the Linux server, download, and run JMusicBot
  3. Tell JMusicBot running under user #2 to play a song. It will crash with the error listed below:

Workaround As a user with permission, or with admin privileges, empty /tmp.

Crash Dump

[09:48:39] [INFO] [Config]: Loading config from /home/timothy/JMusicBot/bin/config.txt
[09:48:39] [INFO] [Startup]: Loaded config from /home/timothy/JMusicBot/bin/config.txt
[09:48:40] [INFO] [JDA]: Login Successful!
[09:48:40] [INFO] [WebSocketClient]: Connected to WebSocket
[09:48:40] [INFO] [JDA]: Finished Loading!
[09:48:49] [ERROR] [LocalAudioTrackExecutor]: Error in playback of L_jWHffIx5E
com.sedmelluq.discord.lavaplayer.tools.FriendlyException: Something broke when playing the track.
    at com.sedmelluq.discord.lavaplayer.tools.ExceptionTools.wrapUnfriendlyExceptions(ExceptionTools.java:43)
    at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:102)
    at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:349)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.LinkageError: Failed to load native library due to an exception.
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.load(NativeLibLoader.java:81)
    at com.sedmelluq.discord.lavaplayer.natives.ConnectorNativeLibLoader.loadConnectorLibrary(ConnectorNativeLibLoader.java:16)
    at com.sedmelluq.discord.lavaplayer.natives.opus.OpusDecoderLibrary.getInstance(OpusDecoderLibrary.java:14)
    at com.sedmelluq.discord.lavaplayer.natives.opus.OpusDecoder.<init>(OpusDecoder.java:21)
    at com.sedmelluq.discord.lavaplayer.container.common.OpusPacketRouter.initialiseDecoder(OpusPacketRouter.java:190)
    at com.sedmelluq.discord.lavaplayer.container.common.OpusPacketRouter.checkDecoderNecessity(OpusPacketRouter.java:174)
    at com.sedmelluq.discord.lavaplayer.container.common.OpusPacketRouter.process(OpusPacketRouter.java:91)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaOpusTrackConsumer.consume(MatroskaOpusTrackConsumer.java:47)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.processFrameInBlock(MatroskaStreamingFile.java:372)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseClusterSimpleBlock(MatroskaStreamingFile.java:336)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseNextCluster(MatroskaStreamingFile.java:321)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.provideFrames(MatroskaStreamingFile.java:297)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaAudioTrack.lambda$process$0(MatroskaAudioTrack.java:39)
    at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:257)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaAudioTrack.process(MatroskaAudioTrack.java:38)
    at com.sedmelluq.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:27)
    at com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack.processStatic(YoutubeAudioTrack.java:75)
    at com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack.process(YoutubeAudioTrack.java:67)
    at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:90)
    ... 4 common frames omitted
Caused by: java.io.IOException: Failed to create directory for unpacked native library.
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.extractLibrary(NativeLibLoader.java:104)
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.load(NativeLibLoader.java:77)
    ... 22 common frames omitted
Caused by: java.nio.file.AccessDeniedException: /tmp/lava-jni-natives/1544694529585
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
    at java.nio.file.Files.createDirectory(Files.java:674)
    at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
    at java.nio.file.Files.createDirectories(Files.java:767)
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.createDirectoriesWithFullPermissions(NativeLibLoader.java:123)
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.extractLibrary(NativeLibLoader.java:100)
    ... 23 common frames omitted
Exception in thread "lava-daemon-pool-playback-1-thread-1" java.lang.LinkageError: Failed to load native library due to an exception.
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.load(NativeLibLoader.java:81)
    at com.sedmelluq.discord.lavaplayer.natives.ConnectorNativeLibLoader.loadConnectorLibrary(ConnectorNativeLibLoader.java:16)
    at com.sedmelluq.discord.lavaplayer.natives.opus.OpusDecoderLibrary.getInstance(OpusDecoderLibrary.java:14)
    at com.sedmelluq.discord.lavaplayer.natives.opus.OpusDecoder.<init>(OpusDecoder.java:21)
    at com.sedmelluq.discord.lavaplayer.container.common.OpusPacketRouter.initialiseDecoder(OpusPacketRouter.java:190)
    at com.sedmelluq.discord.lavaplayer.container.common.OpusPacketRouter.checkDecoderNecessity(OpusPacketRouter.java:174)
    at com.sedmelluq.discord.lavaplayer.container.common.OpusPacketRouter.process(OpusPacketRouter.java:91)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaOpusTrackConsumer.consume(MatroskaOpusTrackConsumer.java:47)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.processFrameInBlock(MatroskaStreamingFile.java:372)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseClusterSimpleBlock(MatroskaStreamingFile.java:336)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.parseNextCluster(MatroskaStreamingFile.java:321)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaStreamingFile.provideFrames(MatroskaStreamingFile.java:297)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaAudioTrack.lambda$process$0(MatroskaAudioTrack.java:39)
    at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:257)
    at com.sedmelluq.discord.lavaplayer.container.matroska.MatroskaAudioTrack.process(MatroskaAudioTrack.java:38)
    at com.sedmelluq.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:27)
    at com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack.processStatic(YoutubeAudioTrack.java:75)
    at com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack.process(YoutubeAudioTrack.java:67)
    at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:90)
    at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:349)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Failed to create directory for unpacked native library.
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.extractLibrary(NativeLibLoader.java:104)
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.load(NativeLibLoader.java:77)
    ... 22 more
Caused by: java.nio.file.AccessDeniedException: /tmp/lava-jni-natives/1544694529585
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
    at java.nio.file.Files.createDirectory(Files.java:674)
    at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
    at java.nio.file.Files.createDirectories(Files.java:767)
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.createDirectoriesWithFullPermissions(NativeLibLoader.java:123)
    at com.sedmelluq.discord.lavaplayer.natives.NativeLibLoader.extractLibrary(NativeLibLoader.java:100)
    ... 23 more

Version Info (please complete the following information):

alfonsojon commented 5 years ago

I'm not comfortable with Java, but a suggested solution to this would be to append the current user's name to the directory in /tmp that way there are no permissions conflicts. For example instead of: /tmp/lava-jni-natives/ maybe try: /tmp/lava-jni-natives.timothy/

jagrosh commented 5 years ago

I would recommend bringing this issue up on the lavaplayer repository, as all the handling of natives is handled by lavaplayer.

Relevant line in lavaplayer (based on a quick search) is here

jagrosh commented 5 years ago

That being said, try running the bot with a flag -Djava.io.tmpdir=/custom/path/here/, as lavaplayer looks at the system properties for where the 'tmp' directory is.

alfonsojon commented 5 years ago

@jagrosh Thanks for pointing me to the line, I made a pull request on lavaplayer which should fix this.

strikerttd commented 5 years ago

Thanks @alfonsojon for documenting the issue and the pull request to lavaplayer.

Thanks @jagrosh for the alt tmp dir suggestion. Is it possible to add the "tmpdir" as a suggestion when running the bot?

/usr/bin/java -Dnogui=true -Djava.io.tmpdir=/home/$USER/JMusicBot/tmp -jar JMusicBot-0.2.2-Linux.jar

alfonsojon commented 5 years ago

@strikerttd I implemented that flag as a workaround in my script that runs the bot. It's still not an out-of-box solution but works well enough for my needs. Thank you!