Prevent concurrent read and writes to the API config

Review Request #9834 — Created March 26, 2018 and submitted — Latest diff uploaded

Information

rb-gateway
master
3ff0120...

Reviewers

Previously it was possible for the API's configuration to be modified
while it was serving a request, resulting in data races and undefined
behaviour if we read the repository map part-way through a modification.

Now, we wrap all modification to the configuration with a RWMutex. It
normal operation, we only acquire the mutex for reading once -- done by
api.Serve() (which is now the replacement for creating an
http.Server and managing it), which will be released when we finish
serving. Setting the configuration now requires write-access to the lock
(so that we cannot concurrently be serving a request and update the
configuration).

Since we want to maintain these guarantees in unit tests without running
an actual HTTP server, api.ServeHTTP() now acquires the read portion
of the lock before serving a request. However, this function is now only
used in unit tests -- api.Serve() uses the router as the handler
instead of itself so that it doesn't constantly acquire and release
locks while serving requests.

Ran unit tests.
Made HTTP requests against rb-gateway and saw correct responses.