Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Time is not returned until all requests have been resolved #109

Open
MarkVillacampa opened this issue Jan 24, 2019 · 2 comments
Open

Time is not returned until all requests have been resolved #109

MarkVillacampa opened this issue Jan 24, 2019 · 2 comments

Comments

@MarkVillacampa
Copy link

MarkVillacampa commented Jan 24, 2019

If the NTP server I'm using resolves to 4 IPs, then TrueTime will make 4 x 5 = 20 requests. If only one of those requests times out (30 seconds by default), even if all 19 other requests are successful, TrueTime will not calculate a time until after that request succeeds.

I am not sure if this is included in the NTP spec or it's a design decision in the TrueTime library, but would it make sense to include an option to accept a threshold of successful requests after which the time can be calculated, discarding the few failed requests? Say, if up to 10% of requests fail, still pick the best one of the ones that succeeded.

Example of one failed request holding back time calculation for 30 seconds:

2019-01-18 00:05:52.733 30803-31157/com.myapp I/MYAPP: ---- Running TrueTime init now
2019-01-18 00:05:52.733 30803-31134/com.myapp I/MYAPP: ---- TrueTime Syncer called
2019-01-18 00:05:52.772 30803-31157/com.myapp D/TrueTimeRx: ---- resolving ntpHost : time.google.com
2019-01-18 00:05:52.789 30803-31158/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.4
2019-01-18 00:05:52.789 30803-31160/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.4
2019-01-18 00:05:52.792 30803-31161/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.4
2019-01-18 00:05:52.796 30803-31164/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.0
2019-01-18 00:05:52.799 30803-31165/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.0
2019-01-18 00:05:52.804 30803-31166/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.0
2019-01-18 00:05:52.804 30803-31163/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.4
2019-01-18 00:05:52.805 30803-31162/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.4
2019-01-18 00:05:52.807 30803-31167/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.0
2019-01-18 00:05:52.809 30803-31168/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.0
2019-01-18 00:05:52.813 30803-31169/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.8
2019-01-18 00:05:52.816 30803-31170/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.8
2019-01-18 00:05:52.818 30803-31171/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.8
2019-01-18 00:05:52.820 30803-31172/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.8
2019-01-18 00:05:52.822 30803-31173/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.8
2019-01-18 00:05:52.823 30803-31174/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.12
2019-01-18 00:05:52.824 30803-31175/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.12
2019-01-18 00:05:52.825 30803-31176/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.12
2019-01-18 00:05:52.826 30803-31177/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.12
2019-01-18 00:05:52.827 30803-31178/com.myapp D/TrueTimeRx: ---- requestTime from: 216.239.35.12
2019-01-18 00:06:22.821 30803-31158/com.myapp D/SntpClient: ---- SNTP request failed for 216.239.35.4
2019-01-18 00:06:22.833 30803-31158/com.myapp E/TrueTimeRx: ---- Error requesting time
    java.net.SocketTimeoutException: Receive timed out
        at java.net.PlainDatagramSocketImpl.receive0(Native Method)
        at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:147)
        at java.net.DatagramSocket.receive(DatagramSocket.java:811)
        at com.instacart.library.truetime.SntpClient.requestTime(SntpClient.java:123)
        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.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)
2019-01-18 00:06:22.882 30803-31160/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.4
2019-01-18 00:06:22.943 30803-31161/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.4
2019-01-18 00:06:22.972 30803-31164/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.0
2019-01-18 00:06:23.003 30803-31165/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.0
2019-01-18 00:06:23.031 30803-31166/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.0
2019-01-18 00:06:23.092 30803-31163/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.4
2019-01-18 00:06:23.159 30803-31162/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.4
2019-01-18 00:06:23.187 30803-31167/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.0
2019-01-18 00:06:23.215 30803-31168/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.0
2019-01-18 00:06:23.243 30803-31169/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.8
2019-01-18 00:06:23.272 30803-31170/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.8
2019-01-18 00:06:23.303 30803-31171/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.8
2019-01-18 00:06:23.336 30803-31172/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.8
2019-01-18 00:06:23.379 30803-31173/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.8
2019-01-18 00:06:23.414 30803-31174/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.12
2019-01-18 00:06:23.449 30803-31175/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.12
2019-01-18 00:06:23.489 30803-31176/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.12
2019-01-18 00:06:23.524 30803-31177/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.12
2019-01-18 00:06:23.560 30803-31178/com.myapp I/SntpClient: ---- SNTP successful response from 216.239.35.12
@jemshit
Copy link

jemshit commented Feb 28, 2019

From my observation, even if it does not propagate result to onSuccess yet, you can call TrueTimeRx.now() to get intermediate best result.

@safa007
Copy link

safa007 commented Sep 25, 2019

I'd also like to request the ability to discard failed requests. For the purposes of what I need TrueTimeRx for, I just need the first successful request that comes in.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants