instacart / truetime-android

Android NTP time library. Get the true current time impervious to device clock time changes
https://tech.instacart.com/truetime/
Apache License 2.0
1.41k stars 194 forks source link

java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable) #69

Closed elirangoshen closed 6 years ago

elirangoshen commented 6 years ago

I'm getting crashes due to this exceptions.

this is the full stacktrace :

Fatal Exception: io.reactivex.exceptions.UndeliverableException: java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable) at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349) at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:604) at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:665) at io.reactivex.internal.operators.flowable.FlowableRetryPredicate$RepeatSubscriber.onError(FlowableRetryPredicate.java:81) at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onError(FlowableDoOnEach.java:110) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.onError(FlowableSubscribeOn.java:102) at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.onError(FlowableCreate.java:268) at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.drain(FlowableCreate.java:510) at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.onError(FlowableCreate.java:461) at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:201) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72) at io.reactivex.Flowable.subscribe(Flowable.java:12986) at io.reactivex.Flowable.subscribe(Flowable.java:12932) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542) at libcore.io.IoBridge.sendto(IoBridge.java:511) at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184) at java.net.DatagramSocket.send(DatagramSocket.java:305) at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:114) at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:122) at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:197) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72) at io.reactivex.Flowable.subscribe(Flowable.java:12986) at io.reactivex.Flowable.subscribe(Flowable.java:12932) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by android.system.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.Posix.sendtoBytes(Posix.java) at libcore.io.Posix.sendto(Posix.java:211) at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278) at libcore.io.IoBridge.sendto(IoBridge.java:509) at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184) at java.net.DatagramSocket.send(DatagramSocket.java:305) at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:114) at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:122) at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:197) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72) at io.reactivex.Flowable.subscribe(Flowable.java:12986) at io.reactivex.Flowable.subscribe(Flowable.java:12932) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)

why is it happening ?

kaushikgopal commented 6 years ago
  1. you shouldn't be getting "crashes" because of this. if yes, probably need to implement onError callback in Rx
  2. Network is unreachable -> makes me think there's potentially some network related problem here. do you have the network permissions on? can you reach the internet from the app/device you're testing from?
elirangoshen commented 6 years ago

i got few crashes and non fatal exceptions from it. there is network permission and its working in most of devices. but i got some errors and i want to be sure its not related to the library i'm checking also if its related to network issues.

rajeefmk commented 6 years ago

@kaushikgopal If it helps, this is the stacktrace from fabric - http://crashes.to/s/0a4e6816d6c .

Quick qn, how do we conclude this is a non-fatal error ? I haven't been able to reproduce this so far, but apparently a lot of devices seems to be reporting this error as can be seen from the Crashlytics report. (No user has also come back to us reporting any peculiar crashes yet).

ghost commented 6 years ago

@kaushikgopal I'm seeing the same error in a live deployment on ~17% of devices but I have not been able to replicate. Are there any code changes that I can make so that the True Time library passes the error to my code instead of it being thrown as a Fatal Exception?

My code:

TrueTimeRx.build()
  .withSharedPreferences(applicationContext)
  .initializeRx("time.google.com")
  .subscribeOn(Schedulers.io())
  .subscribe(new Consumer() {
    @Override
    public void accept(@NonNull Date date) {
      long timeTaken = System.currentTimeMillis() - startTime;
      ColoLogger.logIfDebugging(LogLevel.INFO, TagStrings.TIMER.toString(), "TrueTime was initialized and we have a time: " + date + ". It took: " + timeTaken + "ms");
      initialised = true;
      timeOfLastCheck = date.getTime();
    }
  }, new Consumer() {
    @Override
    public void accept(@NonNull Throwable throwable) {
      ColoLogger.logIfDebugging(LogLevel.INFO, TagStrings.TIMER.toString(), "TrueTime failed");
    }
  });

Error:

Fatal Exception: io.reactivex.exceptions.UndeliverableException: java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
       at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349)
       at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:604)
       at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:665)
       at io.reactivex.internal.operators.flowable.FlowableRetryPredicate$RepeatSubscriber.onError(FlowableRetryPredicate.java:81)
       at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onError(FlowableDoOnEach.java:110)
       at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.onError(FlowableSubscribeOn.java:102)
       at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.onError(FlowableCreate.java:268)
       at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.drain(FlowableCreate.java:510)
       at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.onError(FlowableCreate.java:461)
       at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:201)
       at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
       at io.reactivex.Flowable.subscribe(Flowable.java:12986)
       at io.reactivex.Flowable.subscribe(Flowable.java:12932)
       at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)
Caused by java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
       at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542)
       at libcore.io.IoBridge.sendto(IoBridge.java:511)
       at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184)
       at java.net.DatagramSocket.send(DatagramSocket.java:305)
       at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:114)
       at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:122)
       at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:197)
       at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
       at io.reactivex.Flowable.subscribe(Flowable.java:12986)
       at io.reactivex.Flowable.subscribe(Flowable.java:12932)
       at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)
Caused by android.system.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
       at libcore.io.Posix.sendtoBytes(Posix.java)
       at libcore.io.Posix.sendto(Posix.java:211)
       at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
       at libcore.io.IoBridge.sendto(IoBridge.java:509)
       at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184)
       at java.net.DatagramSocket.send(DatagramSocket.java:305)
       at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:114)
       at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:122)
       at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:197)
       at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
       at io.reactivex.Flowable.subscribe(Flowable.java:12986)
       at io.reactivex.Flowable.subscribe(Flowable.java:12932)
       at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)
MyNameIsAnti commented 6 years ago

I'm getting the same exception when I am not connected to a wifi network (of course). But my problem is that I cannot stop the app from crashing when it happens, even when I catch the onError.

kaushikgopal commented 6 years ago

sorry for being AWOL on this. I've carved some more time for myself to maintain TT better.

@ccsam278 : I guess the part i don't completely understand is that the onError should most definitely be caught in your subscriber code i.e. the FatalException should be seen in your onError.

Are you saying this is not currently happening? If it's not, then that's most definitely something i should/can fix (though i'll need more guidance on reproducing the issue).

An easy way to try this would be with the sample app attached in this library.

@MyNameIsAnti - are you seeing this behavior with the sample app in the repository as well? i.e. when not connected to a network, is the app crashing? i don't see this behavior which makes me think maybe it has to do with the way you're calling TrueTime. If you can paste a snippet of how you're calling TrueTime.init and potentially trying it out with the sample app, that'll help resolve the issue faster.

ghost commented 6 years ago

@kaushikgopal I am saying that the Fatal Exception is not seen in my onError

I haven't been able to replicate the issue on a test device. There have been hundreds of reports from Crashlytics on multiple apps though.

I have also seen a second error (that I can't replicate) which might aid in you finding the issue:

Fatal Exception: io.reactivex.exceptions.UndeliverableException: java.io.IOException: Operation not permitted
       at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349)
       at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.onError(FlowableCreate.java:264)
       at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.drain(FlowableCreate.java:510)
       at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.onError(FlowableCreate.java:461)
       at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:201)
       at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
       at io.reactivex.Flowable.subscribe(Flowable.java:12986)
       at io.reactivex.Flowable.subscribe(Flowable.java:12932)
       at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:762)
kaushikgopal commented 6 years ago

@ccsam278 so that last exception you posted could very well be fixed with #70. More detailed discussion on that here.

Can you try upgrading to implementation/compile com.github.instacart.truetime-android:library-extension-rx:09087b6a6e and giving this a shot again? i think a whole host of issues should be resolved with that.

kaushikgopal commented 6 years ago

tl;dr - UndeliverableException is happening here because of a race condition, where the exception is being surfaced after the subscription has just been disposed. that comment i linked to, in turn points to a useful thread from the Rx repo and why the api tryOnError was added.

ghost commented 6 years ago

I can't replicate the issue so I can't be sure that the update will fix the it. Previously the issue was only seen when released to a large group of app users. I started using the basic version of TrueTime to avoid the issue a while ago. Thanks for your help @kaushikgopal

kaushikgopal commented 6 years ago

👍 i'm about 90% confident this should now be taken care of with the latest changes. closing this out now. feel free to reopen if you're seeing this again (with the latest update)

tsella commented 5 years ago

I'm getting this exception in 3.4:

FATAL EXCEPTION: RxCachedThreadScheduler-18 Process: co.playftw.outoftune.dev, PID: 18559 io.reactivex.exceptions.UndeliverableException: java.io.IOException: sendto failed: ENETUNREACH (Network is unreachable) at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367) at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:607) at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:668) at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onError(BasicFuseableSubscriber.java:101) at io.reactivex.internal.operators.flowable.FlowableToList$ToListSubscriber.onError(FlowableToList.java:81) at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.checkTerminate(FlowableFlatMap.java:566) at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drainLoop(FlowableFlatMap.java:374) at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drain(FlowableFlatMap.java:366) at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:605) at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:668) at io.reactivex.internal.operators.flowable.FlowableRetryPredicate$RetrySubscriber.onError(FlowableRetryPredicate.java:83) at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onError(FlowableDoOnEach.java:111) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.onError(FlowableSubscribeOn.java:102) at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.error(FlowableCreate.java:293) at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.drain(FlowableCreate.java:541) at io.reactivex.internal.operators.flowable.FlowableCreate$BufferAsyncEmitter.tryOnError(FlowableCreate.java:491) at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:214) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72) at io.reactivex.Flowable.subscribe(Flowable.java:14409) at io.reactivex.Flowable.subscribe(Flowable.java:14356) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) Caused by: java.io.IOException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:576) at libcore.io.IoBridge.sendto(IoBridge.java:544) at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:125) at java.net.DatagramSocket.send(DatagramSocket.java:721) at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:116) at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:133) at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:211) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)  at io.reactivex.Flowable.subscribe(Flowable.java:14409)  at io.reactivex.Flowable.subscribe(Flowable.java:14356)  at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)  at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)  at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:764)  Caused by: android.system.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.Linux.sendtoBytes(Native Method) at libcore.io.Linux.sendto(Linux.java:227) at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:307) at libcore.io.IoBridge.sendto(IoBridge.java:542) at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:125)  at java.net.DatagramSocket.send(DatagramSocket.java:721)  at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:116)  at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:133)  at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:211)  at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)  at io.reactivex.Flowable.subscribe(Flowable.java:14409)  at io.reactivex.Flowable.subscribe(Flowable.java:14356)  at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)  at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)  at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:764) 

I using a list of NTP hosts:

TrueTimeRx.build() .withRetryCount(10) .withLoggingEnabled(false) .withSharedPreferencesCache(OutOfTuneApplication.getAppContext()) .initializeNtp(listOf("time.apple.com", "time.google.com", "europe.pool.ntp.org", "north-america.pool.ntp.org").map { host -> getByName(host) }) .subscribeOn(Schedulers.io()) .subscribe({ date -> logger.debug("TrueTime initialized: $date") }, { throwable -> logger.error("Something went wrong when trying to initialize TrueTime. ${throwable.printStackTrace()}") })

hoanglm4 commented 5 years ago

I got the same issue in version 3.4

Caused by java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542) at libcore.io.IoBridge.sendto(IoBridge.java:511) at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184) at java.net.DatagramSocket.send(DatagramSocket.java:305) at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:116) at com.instacart.library.truetime.TrueTime.requestTime(TrueTime.java:133) at com.instacart.library.truetime.TrueTimeRx$4$1$2.subscribe(TrueTimeRx.java:211) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72) at io.reactivex.Flowable.subscribe(Flowable.java:14409) at io.reactivex.Flowable.subscribe(Flowable.java:14356) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)

mhenhoeffer commented 4 years ago

Got the same crash running on version 3.4 also.

topnax commented 10 months ago

I would suggest that anyone facing this issue on 3.4/3.5 uses RxJavaPlugins.setErrorHandler(wiki reference) to mitigate any runtime crashes until a fix is available.