diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6675222..321957fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: - name: "setup go" uses: "actions/setup-go@v2" with: - go-version: "1.18" + go-version: "1.19" - name: "install python3-pytest" run: "sudo apt install -y python3-pytest" - name: "make install" diff --git a/Dockerfile b/Dockerfile index 0e41b0ce..dee737d2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## build ergo binary -FROM golang:1.18-alpine AS build-env +FROM golang:1.19-alpine AS build-env RUN apk add -U --force-refresh --no-cache --purge --clean-protected -l -u make git diff --git a/go.mod b/go.mod index 6eda8cb0..41199d05 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/ergochat/ergo -go 1.18 +go 1.19 require ( code.cloudfoundry.org/bytefmt v0.0.0-20200131002437-cf55d5288a48 diff --git a/irc/getters.go b/irc/getters.go index 6031659f..6e5718b6 100644 --- a/irc/getters.go +++ b/irc/getters.go @@ -16,7 +16,7 @@ import ( ) func (server *Server) Config() (config *Config) { - return server.config.Get() + return server.config.Load() } func (server *Server) ChannelRegistrationEnabled() bool { diff --git a/irc/server.go b/irc/server.go index b4bce531..95c20eda 100644 --- a/irc/server.go +++ b/irc/server.go @@ -15,6 +15,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "syscall" "time" @@ -66,7 +67,7 @@ type Server struct { channels ChannelManager channelRegistry ChannelRegistry clients ClientManager - config utils.ConfigStore[Config] + config atomic.Pointer[Config] configFilename string connectionLimiter connection_limits.Limiter ctime time.Time @@ -707,7 +708,7 @@ func (server *Server) applyConfig(config *Config) (err error) { config.Server.Cloaks.SetSecret(LoadCloakSecret(server.store)) // activate the new config - server.config.Set(config) + server.config.Store(config) // load [dk]-lines, registered users and channels, etc. if initial { diff --git a/irc/smtp/smtp.go b/irc/smtp/smtp.go index 2cdc64db..30f6cc83 100644 --- a/irc/smtp/smtp.go +++ b/irc/smtp/smtp.go @@ -4,15 +4,17 @@ // Package smtp implements the Simple Mail Transfer Protocol as defined in RFC 5321. // It also implements the following extensions: +// // 8BITMIME RFC 1652 // AUTH RFC 2554 // STARTTLS RFC 3207 +// // Additional extensions may be handled by clients. // // The smtp package is frozen and is not accepting new features. // Some external packages provide more functionality. See: // -// https://godoc.org/?q=smtp +// https://godoc.org/?q=smtp package smtp import ( diff --git a/irc/socket.go b/irc/socket.go index ce8eb008..3a55bf5f 100644 --- a/irc/socket.go +++ b/irc/socket.go @@ -105,12 +105,13 @@ func (socket *Socket) Write(data []byte) (err error) { } // BlockingWrite sends the given string out of Socket. Requirements: -// 1. MUST block until the message is sent -// 2. MUST bypass sendq (calls to BlockingWrite cannot, on their own, cause a sendq overflow) -// 3. MUST provide mutual exclusion for socket.conn.Write -// 4. MUST respect the same ordering guarantees as Write (i.e., if a call to Write that sends -// message m1 happens-before a call to BlockingWrite that sends message m2, -// m1 must be sent on the wire before m2 +// 1. MUST block until the message is sent +// 2. MUST bypass sendq (calls to BlockingWrite cannot, on their own, cause a sendq overflow) +// 3. MUST provide mutual exclusion for socket.conn.Write +// 4. MUST respect the same ordering guarantees as Write (i.e., if a call to Write that sends +// message m1 happens-before a call to BlockingWrite that sends message m2, +// m1 must be sent on the wire before m2 +// // Callers MUST be writing to the client's socket from the client's own goroutine; // other callers must use the nonblocking Write call instead. Otherwise, a client // with a slow/unreliable connection risks stalling the progress of the system as a whole. diff --git a/irc/utils/config.go b/irc/utils/config.go deleted file mode 100644 index 73fd7165..00000000 --- a/irc/utils/config.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2022 Shivaram Lingamneni -// released under the MIT license - -package utils - -import ( - "sync/atomic" - "unsafe" -) - -/* -This can be used to implement the following pattern: - -1. Prepare a config object (this can be arbitrarily expensive) -2. Take a pointer to the config object and use Set() to install it -3. Use Get() to access the config from any goroutine -4. To update the config, call Set() again with a new prepared config object -5. As long as any individual config object is not modified (by any goroutine) - after it is installed with Set(), this is free of data races, and Get() - is extremely cheap (on amd64 it compiles down to plain MOV instructions). -*/ - -type ConfigStore[Config any] struct { - ptr unsafe.Pointer -} - -func (c *ConfigStore[Config]) Get() *Config { - return (*Config)(atomic.LoadPointer(&c.ptr)) -} - -func (c *ConfigStore[Config]) Set(ptr *Config) { - atomic.StorePointer(&c.ptr, unsafe.Pointer(ptr)) -} diff --git a/irc/utils/proxy.go b/irc/utils/proxy.go index 22a48264..1cef6122 100644 --- a/irc/utils/proxy.go +++ b/irc/utils/proxy.go @@ -203,7 +203,7 @@ func parseProxyLineV2(line []byte) (ip net.IP, err error) { return ip, nil } -/// WrappedConn is a net.Conn with some additional data stapled to it; +// / WrappedConn is a net.Conn with some additional data stapled to it; // the proxied IP, if one was read via the PROXY protocol, and the listener // configuration. type WrappedConn struct { diff --git a/irc/utils/text.go b/irc/utils/text.go index d9104564..7a76b371 100644 --- a/irc/utils/text.go +++ b/irc/utils/text.go @@ -22,9 +22,12 @@ type MessagePair struct { // SplitMessage represents a message that's been split for sending. // Two possibilities: // (a) Standard message that can be relayed on a single 512-byte line -// (MessagePair contains the message, Split == nil) +// +// (MessagePair contains the message, Split == nil) +// // (b) multiline message that was split on the client side -// (Message == "", Split contains the split lines) +// +// (Message == "", Split contains the split lines) type SplitMessage struct { Message string Msgid string