
Because of issues with glibc, using the `os/user` package can cause when calling `user.Current()`. Neither the Go maintainers or glibc developers could be bothered to fix it, so we have to work around it by calling the uid and gid functions directly. This is probably better because we don't actually use much of the data provided in the `user.User` struct. This required some refactoring to have better control over when the uid and gid are resolved. Rather than checking the current user on every connection, we now resolve it once at initialization. To test that this provided an improvement in performance, a benchmark was added. Unfortunately, this exposed a regression in the performance of unix sockets in Go when `(*UnixConn).File` is called. The underlying culprit of this performance regression is still at large. The following open issues describe the underlying problem in more detail: https://github.com/golang/go/issues/13470 https://sourceware.org/bugzilla/show_bug.cgi?id=19341 In better news, I now have an entire herd of shaved yaks. Signed-off-by: Stephen J Day <stephen.day@docker.com>
35 lines
1.1 KiB
Go
35 lines
1.1 KiB
Go
package ttrpc
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
)
|
|
|
|
// Handshaker defines the interface for connection handshakes performed on the
|
|
// server or client when first connecting.
|
|
type Handshaker interface {
|
|
// Handshake should confirm or decorate a connection that may be incoming
|
|
// to a server or outgoing from a client.
|
|
//
|
|
// If this returns without an error, the caller should use the connection
|
|
// in place of the original connection.
|
|
//
|
|
// The second return value can contain credential specific data, such as
|
|
// unix socket credentials or TLS information.
|
|
//
|
|
// While we currently only have implementations on the server-side, this
|
|
// interface should be sufficient to implement similar handshakes on the
|
|
// client-side.
|
|
Handshake(ctx context.Context, conn net.Conn) (net.Conn, interface{}, error)
|
|
}
|
|
|
|
type handshakerFunc func(ctx context.Context, conn net.Conn) (net.Conn, interface{}, error)
|
|
|
|
func (fn handshakerFunc) Handshake(ctx context.Context, conn net.Conn) (net.Conn, interface{}, error) {
|
|
return fn(ctx, conn)
|
|
}
|
|
|
|
func noopHandshake(ctx context.Context, conn net.Conn) (net.Conn, interface{}, error) {
|
|
return conn, nil, nil
|
|
}
|