ooni-probe-cli/pkg/oonimkall
Simone Basso c4eb682606
[forwardport] fix(oonimkall): don't close channel to signal end of task (#619) (#620)
This diff forward ports 90bf0629b957c912a5a6f3bb6c98ad3abb5a2ff6 to `master`.

If we close the channel to signal the end of a task we may panic
when some background goroutine tries to post on the channel.

This bug is rare but may happen.

See for example https://github.com/ooni/probe/issues/1438.

How can we improve?

First, let us add a timeout when sending to the channel. Given that
the channel is buffered and we have a generous timeout (1/4 of a
second), it's unlikely we will really block. But, in the event in
which a late message appears, we'll eventually _unblock_ when
sending with a timeout. So, now we don't have to worry anymore
about leaking forever a goroutine.

Then, let us change the protocol with which we signal that a task
is done. We used to close the channel. Now, instead we just
synchronously post a nil on the channel when done.

In turn, we interpret this nil to mean that the task is done when
we receive messages.

The _main_ different with respect to before is that now we are
asking the consumer of our API to drain the channel. Because
before we had a blocking channel, it seems to me we were already
requiring the consumer of the API to do that. Which means, I think
in practical terms it did not change much.

Finally, acknowledge that we don't need a specific state variable
to tell us we're done and simplify a little bit the API by
just making isRunning private and using the "we're done" signal
to determine whether we've stopped running the task.

All these changes should be enough to close https://github.com/ooni/probe/issues/1438.
2021-11-26 22:18:45 +01:00
..
.gitignore refactor: we don't wanna export pkg/oonimkall/tasks (#216) 2021-02-03 19:48:23 +01:00
chanlogger.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
event.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
eventemitter_test.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
eventemitter.go [forwardport] fix(oonimkall): don't close channel to signal end of task (#619) (#620) 2021-11-26 22:18:45 +01:00
experiment_test.go refactor: flatten and separate (#353) 2021-06-04 10:34:18 +02:00
experiment.go oonimkall: mobile api for running WebConnectivity (#223) 2021-03-18 08:44:58 +01:00
README.md refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
runner_integration_test.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
runner_internal_test.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
runner.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
session_integration_test.go fix: skip two integration tests in short mode (#451) 2021-09-05 11:58:02 +02:00
session_test.go refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
session.go refactor: flatten and separate (#353) 2021-06-04 10:34:18 +02:00
sessioncontext_test.go refactor: flatten and separate (#353) 2021-06-04 10:34:18 +02:00
sessioncontext.go refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
sessionlogger_test.go refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
sessionlogger.go refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
settings.go [forwardport] refactor(oonimkall): merge internal/task into oonimkall (#617) (#618) 2021-11-26 20:21:42 +01:00
task_integration_test.go [forwardport] fix(oonimkall): don't close channel to signal end of task (#619) (#620) 2021-11-26 22:18:45 +01:00
task.go [forwardport] fix(oonimkall): don't close channel to signal end of task (#619) (#620) 2021-11-26 22:18:45 +01:00
uuid_test.go refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
uuid.go refactor: start building an Android package (#205) 2021-02-03 10:51:14 +01:00
webconnectivity_integration_test.go oonimkall: mobile api for running WebConnectivity (#223) 2021-03-18 08:44:58 +01:00
webconnectivity_test.go refactor: flatten and separate (#353) 2021-06-04 10:34:18 +02:00
webconnectivity.go refactor: flatten and separate (#353) 2021-06-04 10:34:18 +02:00

Package github.com/ooni/probe-cli/pkg/oonimkall

Package oonimkall implements APIs used by OONI mobile apps. We expose these APIs to mobile apps using gomobile.

We expose two APIs: the task API, which is derived from the API originally exposed by Measurement Kit, and the session API, which is a Go API that mobile apps can use via gomobile.

This package is named oonimkall because it contains a partial reimplementation of the mkall API implemented by Measurement Kit in, e.g., mkall-ios.

The basic tenet of the task API is that you define an experiment task you wanna run using a JSON, then you start a task for it, and you receive events as serialized JSONs. In addition to this functionality, we also include extra APIs used by OONI mobile.

The basic tenet of the session API is that you create an instance of Session and use it to perform the operations you need.