treewide: errors variables should be prefixed with Err

Change-Id: Ic277f98ebcd03356500ce7daba199738e701e81c
Reviewed-on: https://review.monogon.dev/c/monogon/+/3025
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
Vouch-Run-CI: Tim Windelschmidt <tim@monogon.tech>
diff --git a/metropolis/cli/metroctl/cmd_certs.go b/metropolis/cli/metroctl/cmd_certs.go
index 075a0d0..d914c83 100644
--- a/metropolis/cli/metroctl/cmd_certs.go
+++ b/metropolis/cli/metroctl/cmd_certs.go
@@ -29,7 +29,7 @@
 	Example: "metroctl cert export",
 	Run: func(cmd *cobra.Command, args []string) {
 		ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
-		if errors.Is(err, core.NoCredentialsError) {
+		if errors.Is(err, core.ErrNoCredentials) {
 			log.Fatalf("You have to take ownership of the cluster first: %v", err)
 		}
 
diff --git a/metropolis/cli/metroctl/cmd_k8scredplugin.go b/metropolis/cli/metroctl/cmd_k8scredplugin.go
index adc3fe8..0d1f318 100644
--- a/metropolis/cli/metroctl/cmd_k8scredplugin.go
+++ b/metropolis/cli/metroctl/cmd_k8scredplugin.go
@@ -28,7 +28,7 @@
 
 func doK8sCredPlugin(cmd *cobra.Command, args []string) {
 	cert, key, err := core.GetOwnerCredentials(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatal("No credentials found on your machine")
 	}
 	if err != nil {
diff --git a/metropolis/cli/metroctl/cmd_takeownership.go b/metropolis/cli/metroctl/cmd_takeownership.go
index adad3cf..5161dc9 100644
--- a/metropolis/cli/metroctl/cmd_takeownership.go
+++ b/metropolis/cli/metroctl/cmd_takeownership.go
@@ -47,7 +47,7 @@
 	// Retrieve the cluster owner's private key, and use it to construct
 	// ephemeral credentials. Then, dial the cluster.
 	opk, err := core.GetOwnerKey(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatalf("Owner key does not exist. takeownership needs to be executed on the same system that has previously installed the cluster using metroctl install.")
 	}
 	if err != nil {
diff --git a/metropolis/cli/metroctl/core/ca_tofu.go b/metropolis/cli/metroctl/core/ca_tofu.go
index 9df9957..b578aa6 100644
--- a/metropolis/cli/metroctl/core/ca_tofu.go
+++ b/metropolis/cli/metroctl/core/ca_tofu.go
@@ -114,7 +114,7 @@
 	if err == nil {
 		return ca, nil
 	}
-	if !errors.Is(err, NoCACertificateError) {
+	if !errors.Is(err, ErrNoCACertificate) {
 		return nil, err
 	}
 
@@ -128,7 +128,7 @@
 	// against it, and don't ask the user.
 	var ocert *x509.Certificate
 	if err != nil {
-		if errors.Is(err, NoCredentialsError) {
+		if errors.Is(err, ErrNoCredentials) {
 			okey, err := GetOwnerKey(c.ConfigPath)
 			if err != nil {
 				return nil, err
diff --git a/metropolis/cli/metroctl/core/config.go b/metropolis/cli/metroctl/core/config.go
index f3ca8b3..d119883 100644
--- a/metropolis/cli/metroctl/core/config.go
+++ b/metropolis/cli/metroctl/core/config.go
@@ -35,11 +35,13 @@
 	CACertificateFileName = "ca.pem"
 )
 
-// NoCredentialsError indicates that the requested datum (eg. owner key or owner
-// certificate) is not present in the requested directory.
-var NoCredentialsError = errors.New("owner certificate or key does not exist")
+var (
+	// ErrNoCredentials indicates that the requested datum (eg. owner key or owner
+	// certificate) is not present in the requested directory.
+	ErrNoCredentials = errors.New("owner certificate or key does not exist")
 
-var NoCACertificateError = errors.New("no cluster CA certificate while secure connection was requested")
+	ErrNoCACertificate = errors.New("no cluster CA certificate while secure connection was requested")
+)
 
 // A PEM block type for a Metropolis initial owner private key
 const ownerKeyType = "METROPOLIS INITIAL OWNER PRIVATE KEY"
@@ -51,7 +53,7 @@
 	switch {
 	case err == nil:
 		return existing, nil
-	case errors.Is(err, NoCredentialsError):
+	case errors.Is(err, ErrNoCredentials):
 	default:
 		return nil, err
 	}
@@ -88,11 +90,11 @@
 
 // GetOwnerKey loads and returns a raw ED25519 private key from the saved owner
 // key in a given metroctl configuration directory path. If the owner key doesn't
-// exist, NoCredentialsError will be returned.
+// exist, ErrNoCredentials will be returned.
 func GetOwnerKey(path string) (ed25519.PrivateKey, error) {
 	ownerPrivateKeyPEM, err := os.ReadFile(filepath.Join(path, OwnerKeyFileName))
 	if os.IsNotExist(err) {
-		return nil, NoCredentialsError
+		return nil, ErrNoCredentials
 	} else if err != nil {
 		return nil, fmt.Errorf("failed to load owner private key: %w", err)
 	}
@@ -125,7 +127,7 @@
 // GetOwnerCredentials loads and returns a raw ED25519 private key alongside a
 // DER-encoded X509 certificate from the saved owner key and certificate in a
 // given metroctl configuration directory path. If either the key or certificate
-// doesn't exist, NoCredentialsError will be returned.
+// doesn't exist, ErrNoCredentials will be returned.
 func GetOwnerCredentials(path string) (cert *x509.Certificate, key ed25519.PrivateKey, err error) {
 	key, err = GetOwnerKey(path)
 	if err != nil {
@@ -134,7 +136,7 @@
 
 	ownerCertPEM, err := os.ReadFile(filepath.Join(path, OwnerCertificateFileName))
 	if os.IsNotExist(err) {
-		return nil, nil, NoCredentialsError
+		return nil, nil, ErrNoCredentials
 	} else if err != nil {
 		return nil, nil, fmt.Errorf("failed to load owner certificate: %w", err)
 	}
@@ -171,7 +173,7 @@
 func GetClusterCA(path string) (cert *x509.Certificate, err error) {
 	caCertPEM, err := os.ReadFile(filepath.Join(path, CACertificateFileName))
 	if os.IsNotExist(err) {
-		return nil, NoCACertificateError
+		return nil, ErrNoCACertificate
 	} else if err != nil {
 		return nil, fmt.Errorf("failed to load CA certificate: %w", err)
 	}
diff --git a/metropolis/cli/metroctl/rpc.go b/metropolis/cli/metroctl/rpc.go
index 06008e3..cab6d4f 100644
--- a/metropolis/cli/metroctl/rpc.go
+++ b/metropolis/cli/metroctl/rpc.go
@@ -18,7 +18,7 @@
 	// Collect credentials, validate command parameters, and try dialing the
 	// cluster.
 	ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatalf("You have to take ownership of the cluster first: %v", err)
 	}
 	if len(flags.clusterEndpoints) == 0 {
@@ -52,7 +52,7 @@
 	// Collect credentials, validate command parameters, and try dialing the
 	// cluster.
 	ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatalf("You have to take ownership of the cluster first: %v", err)
 	}
 	cc, err := core.DialNode(ctx, opkey, ocert, cacert, flags.proxyAddr, id, address)
diff --git a/metropolis/node/core/consensus/client/unimplemented.go b/metropolis/node/core/consensus/client/unimplemented.go
index 047e8ee..9b146eb 100644
--- a/metropolis/node/core/consensus/client/unimplemented.go
+++ b/metropolis/node/core/consensus/client/unimplemented.go
@@ -9,10 +9,10 @@
 )
 
 var (
-	// UnimplementedInNamespaced will be raised by panic() any time a method
+	// ErrUnimplementedInNamespaced will be raised by panic() any time a method
 	// from the Cluster, Auth and Maintenance APIs gets called on a
 	// clientv3.Client returned by ThinClient or Namespaced.ThinClient.
-	UnimplementedInNamespaced = errors.New("interface not implemented in Namespaced etcd client")
+	ErrUnimplementedInNamespaced = errors.New("interface not implemented in Namespaced etcd client")
 )
 
 // unimplementedCluster implements clientv3.Cluster, but panics on any call.
@@ -20,27 +20,27 @@
 }
 
 func (c *unimplementedCluster) MemberList(_ context.Context) (*clientv3.MemberListResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberAdd(_ context.Context, _ []string) (*clientv3.MemberAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberAddAsLearner(_ context.Context, _ []string) (*clientv3.MemberAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberRemove(_ context.Context, _ uint64) (*clientv3.MemberRemoveResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberUpdate(_ context.Context, _ uint64, _ []string) (*clientv3.MemberUpdateResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberPromote(_ context.Context, _ uint64) (*clientv3.MemberPromoteResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 // unimplementedAuth implements clientv3.Auth but panics on any call.
@@ -48,75 +48,75 @@
 }
 
 func (c *unimplementedAuth) Authenticate(ctx context.Context, name string, password string) (*clientv3.AuthenticateResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) AuthEnable(ctx context.Context) (*clientv3.AuthEnableResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) AuthDisable(ctx context.Context) (*clientv3.AuthDisableResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) AuthStatus(ctx context.Context) (*clientv3.AuthStatusResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserAdd(ctx context.Context, name string, password string) (*clientv3.AuthUserAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserAddWithOptions(ctx context.Context, name string, password string, opt *clientv3.UserAddOptions) (*clientv3.AuthUserAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserDelete(ctx context.Context, name string) (*clientv3.AuthUserDeleteResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserChangePassword(ctx context.Context, name string, password string) (*clientv3.AuthUserChangePasswordResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserGrantRole(ctx context.Context, user string, role string) (*clientv3.AuthUserGrantRoleResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserGet(ctx context.Context, name string) (*clientv3.AuthUserGetResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserList(ctx context.Context) (*clientv3.AuthUserListResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserRevokeRole(ctx context.Context, name string, role string) (*clientv3.AuthUserRevokeRoleResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleAdd(ctx context.Context, name string) (*clientv3.AuthRoleAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleGrantPermission(ctx context.Context, name string, key, rangeEnd string, permType clientv3.PermissionType) (*clientv3.AuthRoleGrantPermissionResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleGet(ctx context.Context, role string) (*clientv3.AuthRoleGetResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleList(ctx context.Context) (*clientv3.AuthRoleListResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleRevokePermission(ctx context.Context, role string, key, rangeEnd string) (*clientv3.AuthRoleRevokePermissionResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleDelete(ctx context.Context, role string) (*clientv3.AuthRoleDeleteResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 // unimplementedMaintenance implements clientv3.Maintenance but panics on any call.
@@ -124,29 +124,29 @@
 }
 
 func (c *unimplementedMaintenance) AlarmList(ctx context.Context) (*clientv3.AlarmResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) AlarmDisarm(ctx context.Context, m *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) Defragment(ctx context.Context, endpoint string) (*clientv3.DefragmentResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) Status(ctx context.Context, endpoint string) (*clientv3.StatusResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) HashKV(ctx context.Context, endpoint string, rev int64) (*clientv3.HashKVResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) MoveLeader(ctx context.Context, transfereeID uint64) (*clientv3.MoveLeaderResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
diff --git a/metropolis/node/core/curator/impl_leader.go b/metropolis/node/core/curator/impl_leader.go
index d7c6222..ad557fc 100644
--- a/metropolis/node/core/curator/impl_leader.go
+++ b/metropolis/node/core/curator/impl_leader.go
@@ -73,13 +73,13 @@
 }
 
 var (
-	// lostLeadership is returned by txnAsLeader if the transaction got canceled
+	// errLostLeadership is returned by txnAsLeader if the transaction got canceled
 	// because leadership was lost.
-	lostLeadership = errors.New("lost leadership")
+	errLostLeadership = errors.New("lost leadership")
 )
 
 // txnAsLeader performs an etcd transaction guarded by continued leadership.
-// lostLeadership will be returned as an error in case the leadership is lost.
+// errLostLeadership will be returned as an error in case the leadership is lost.
 func (l *leadership) txnAsLeader(ctx context.Context, ops ...clientv3.Op) (*clientv3.TxnResponse, error) {
 	var opsStr []string
 	for _, op := range ops {
@@ -118,7 +118,7 @@
 			}
 		}
 		rpc.Trace(ctx).Printf("txnAsLeader(...): rejected (lost leadership (key %s should've been at rev %d, is at rev %s)", l.lockKey, l.lockRev, lockRev)
-		return nil, lostLeadership
+		return nil, errLostLeadership
 	}
 	rpc.Trace(ctx).Printf("txnAsLeader(...): ok")
 	return resp, nil
@@ -128,7 +128,7 @@
 // directly exposed to RPC clients. If false is returned, the error was not
 // converted and is returned verbatim.
 func rpcError(err error) (error, bool) {
-	if errors.Is(err, lostLeadership) {
+	if errors.Is(err, errLostLeadership) {
 		return status.Error(codes.Unavailable, "lost leadership"), true
 	}
 	if errors.Is(err, context.DeadlineExceeded) {
diff --git a/metropolis/node/core/curator/impl_leader_cluster_networking.go b/metropolis/node/core/curator/impl_leader_cluster_networking.go
index 4bd729d..6bfe82d 100644
--- a/metropolis/node/core/curator/impl_leader_cluster_networking.go
+++ b/metropolis/node/core/curator/impl_leader_cluster_networking.go
@@ -33,7 +33,7 @@
 	defer w.Close()
 	for {
 		nodeKV, err := w.Get(ctx, event.BacklogOnly[*nodeAtID]())
-		if errors.Is(err, event.BacklogDone) {
+		if errors.Is(err, event.ErrBacklogDone) {
 			break
 		}
 		if err != nil {
diff --git a/metropolis/node/core/curator/impl_leader_curator.go b/metropolis/node/core/curator/impl_leader_curator.go
index d45fc79..9833410 100644
--- a/metropolis/node/core/curator/impl_leader_curator.go
+++ b/metropolis/node/core/curator/impl_leader_curator.go
@@ -109,7 +109,7 @@
 	nodes := make(map[string]*Node)
 	for {
 		nodeKV, err := w.Get(ctx, event.BacklogOnly[*nodeAtID]())
-		if errors.Is(err, event.BacklogDone) {
+		if errors.Is(err, event.ErrBacklogDone) {
 			break
 		}
 		if err != nil {
diff --git a/metropolis/node/core/network/dhcp4c/dhcpc.go b/metropolis/node/core/network/dhcp4c/dhcpc.go
index bfb2676..4aeeb3d 100644
--- a/metropolis/node/core/network/dhcp4c/dhcpc.go
+++ b/metropolis/node/core/network/dhcp4c/dhcpc.go
@@ -482,13 +482,13 @@
 		err = s.handleMessage(offer, sentTime)
 		if err == nil {
 			return nil
-		} else if !errors.Is(err, InvalidMsgErr) {
+		} else if !errors.Is(err, ErrInvalidMsg) {
 			return err
 		}
 	}
 }
 
-var InvalidMsgErr = errors.New("invalid message")
+var ErrInvalidMsg = errors.New("invalid message")
 
 func (c *Client) runState(ctx context.Context) error {
 	switch c.state {
@@ -516,7 +516,7 @@
 						return c.transitionToBound(offer, sentTime)
 					}
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 		})
 	case stateRequesting:
@@ -541,7 +541,7 @@
 					c.requestingToDiscovering()
 					return nil
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 			stateDeadlineExceeded: func() error {
 				c.requestingToDiscovering()
@@ -578,7 +578,7 @@
 				case dhcpv4.MessageTypeNak:
 					return c.leaseToDiscovering()
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 			stateDeadlineExceeded: func() error {
 				c.state = stateRebinding
@@ -609,7 +609,7 @@
 				case dhcpv4.MessageTypeNak:
 					return c.leaseToDiscovering()
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 			stateDeadlineExceeded: func() error {
 				return c.leaseToDiscovering()
diff --git a/metropolis/node/core/rpc/resolver/watcher.go b/metropolis/node/core/rpc/resolver/watcher.go
index d2715b6..c9fe47e 100644
--- a/metropolis/node/core/rpc/resolver/watcher.go
+++ b/metropolis/node/core/rpc/resolver/watcher.go
@@ -17,9 +17,9 @@
 }
 
 var (
-	// ResolverClosed will be returned by the resolver to gRPC machinery whenever a
+	// ErrResolverClosed will be returned by the resolver to gRPC machinery whenever a
 	// resolver cannot be used anymore because it was Closed.
-	ResolverClosed = errors.New("cluster resolver closed")
+	ErrResolverClosed = errors.New("cluster resolver closed")
 )
 
 // Build is called by gRPC on each Dial call. It spawns a new clientWatcher,
@@ -45,7 +45,7 @@
 
 	select {
 	case <-r.ctx.Done():
-		return nil, ResolverClosed
+		return nil, ErrResolverClosed
 	case r.reqC <- &request{
 		ds: &requestDialOptionsSet{
 			options: options,
@@ -61,7 +61,7 @@
 	}
 	select {
 	case <-r.ctx.Done():
-		return nil, ResolverClosed
+		return nil, ErrResolverClosed
 	case r.reqC <- req:
 	}
 	// This receive is uninterruptible by contract - as it's also uninterruptible on
@@ -94,7 +94,7 @@
 		if update == nil {
 			// A nil result means the channel is closed, which means this watcher has either
 			// closed or the resolver has been canceled. Abort loop.
-			w.clientConn.ReportError(ResolverClosed)
+			w.clientConn.ReportError(ErrResolverClosed)
 			break
 		}
 		w.clientConn.UpdateState(resolver.State{
diff --git a/metropolis/pkg/event/etcd/etcd.go b/metropolis/pkg/event/etcd/etcd.go
index 14dfd99..71e8056 100644
--- a/metropolis/pkg/event/etcd/etcd.go
+++ b/metropolis/pkg/event/etcd/etcd.go
@@ -402,7 +402,7 @@
 	}
 
 	if backlogOnly && len(w.backlogged) == 0 {
-		return empty, event.BacklogDone
+		return empty, event.ErrBacklogDone
 	}
 
 	// Update backlog from etcd if needed.
diff --git a/metropolis/pkg/event/etcd/etcd_test.go b/metropolis/pkg/event/etcd/etcd_test.go
index 45b5f98..f1eb5ed 100644
--- a/metropolis/pkg/event/etcd/etcd_test.go
+++ b/metropolis/pkg/event/etcd/etcd_test.go
@@ -776,15 +776,15 @@
 	// As expected, next call to Get with BacklogOnly fails - there truly is no new
 	// updates to emit.
 	_, err = watcher.Get(ctx, event.BacklogOnly[StringAt]())
-	if want, got := event.BacklogDone, err; !errors.Is(got, want) {
+	if want, got := event.ErrBacklogDone, err; !errors.Is(got, want) {
 		t.Fatalf("Second Get: wanted %v, got %v", want, got)
 	}
 
 	// Implementation detail: even though there is a new value ('second'),
-	// BacklogOnly will still return BacklogDone.
+	// BacklogOnly will still return ErrBacklogDone.
 	tc.put(t, k, "second")
 	_, err = watcher.Get(ctx, event.BacklogOnly[StringAt]())
-	if want, got := event.BacklogDone, err; !errors.Is(got, want) {
+	if want, got := event.ErrBacklogDone, err; !errors.Is(got, want) {
 		t.Fatalf("Third Get: wanted %v, got %v", want, got)
 	}
 
@@ -836,11 +836,11 @@
 	tc.put(t, ks+"a", "val-100")
 	tc.put(t, ks+"b", "val-101")
 
-	// Retrieve the rest of the backlog until BacklogDone is returned.
+	// Retrieve the rest of the backlog until ErrBacklogDone is returned.
 	nUpdates := 1
 	for {
 		g, err := w.Get(ctx, event.BacklogOnly[StringAt]())
-		if errors.Is(err, event.BacklogDone) {
+		if errors.Is(err, event.ErrBacklogDone) {
 			break
 		}
 		if err != nil {
diff --git a/metropolis/pkg/event/event.go b/metropolis/pkg/event/event.go
index e38c427..a8b3526 100644
--- a/metropolis/pkg/event/event.go
+++ b/metropolis/pkg/event/event.go
@@ -179,7 +179,7 @@
 }
 
 // BacklogOnly will prevent Get from blocking on waiting for more updates from
-// etcd, by instead returning BacklogDone whenever no more data is currently
+// etcd, by instead returning ErrBacklogDone whenever no more data is currently
 // locally available. This is different however, from establishing that there
 // are no more pending updates from the etcd cluster - the only way to ensure
 // the local client is up to date is by performing Get calls without this option
@@ -187,7 +187,7 @@
 //
 // This mode of retrieval should only be used for the retrieval of the existing
 // data in the etcd cluster on the initial creation of the Watcher (by
-// repeatedly calling Get until BacklogDone is returned), and shouldn't be set
+// repeatedly calling Get until ErrBacklogDone is returned), and shouldn't be set
 // for any subsequent call. Any use of this option after that initial fetch is
 // undefined behaviour that exposes the internals of the Get implementation, and
 // must not be relied on. However, in the future, this behaviour might be
@@ -203,10 +203,10 @@
 }
 
 var (
-	// BacklogDone is returned by Get when BacklogOnly is set and there is no more
+	// ErrBacklogDone is returned by Get when BacklogOnly is set and there is no more
 	// event data stored in the Watcher client, ie. when the initial cluster state
 	// of the requested key has been retrieved.
-	BacklogDone = errors.New("no more backlogged data")
+	ErrBacklogDone = errors.New("no more backlogged data")
 )
 
 // Pipe a Value's initial state and subsequent updates to an already existing