Files
go-cart-actor/pkg/actor/grain_pool.go
T
mats cecf4abe76
Build and Publish / BuildAndDeployArm64 (push) Failing after 6s
Build and Publish / BuildAndDeployAmd64 (push) Failing after 4s
update
2026-07-03 17:45:51 +02:00

67 lines
2.5 KiB
Go

package actor
import (
"context"
"io"
"net/http"
"google.golang.org/protobuf/proto"
)
type MutationResult[V any] struct {
Result V `json:"result"`
Mutations []ApplyResult `json:"mutations,omitempty"`
}
type GrainPool[V any] interface {
Apply(ctx context.Context, id uint64, mutation ...proto.Message) (*MutationResult[V], error)
Get(ctx context.Context, id uint64) (*V, error)
OwnerHost(id uint64) (Host[V], bool)
Hostname() string
TakeOwnership(id uint64)
// HandleOwnershipChange processes a remote first-touch ownership
// claim. lastChanges is the parallel []int64 of UnixNano stamps from
// the announcer; -1 entries fall back to the pre-arbitration
// "always accept remote" behaviour so mixed-version rollouts
// remain safe.
HandleOwnershipChange(host string, ids []uint64, lastChanges []int64) error
HandleRemoteExpiry(host string, ids []uint64, lastChanges []int64) error
Negotiate(otherHosts []string)
GetLocalIds() []uint64
IsHealthy() bool
Close()
IsKnown(string) bool
RemoveHost(host string)
AddRemoteHost(host string)
}
// Host abstracts a remote node capable of proxying cart requests.
type Host[V any] interface {
// AnnounceExpiry broadcasts per-id eviction decisions. lastChanges is
// a parallel []int64 of UnixNano stamps taken at the moment the
// grain was dropped from the local cache; it is informational on
// this path (the receiver just removes the id from its remoteOwners
// map) but kept in the wire signature for symmetry with
// AnnounceOwnership.
AnnounceExpiry(ids []uint64, lastChanges []int64)
Negotiate(otherHosts []string) ([]string, error)
Name() string
Proxy(id uint64, w http.ResponseWriter, r *http.Request, customBody io.Reader) (bool, error)
Apply(ctx context.Context, id uint64, mutation ...proto.Message) (*MutationResult[V], error)
Get(ctx context.Context, id uint64) (*V, error)
GetActorIds() []uint64
Close() error
Ping() bool
IsHealthy() bool
// AnnounceOwnership broadcasts a first-touch ownership claim.
// lastChanges is a parallel []int64 of UnixNano stamps of the
// announcing pod's local grain's GetLastChange() at the moment of
// broadcast; receivers use it as the first-spawn-wins oracle for
// concurrent cold-cache first-touch (smaller stamp = older spawn =
// owns the grain; on equal stamps the lexicographically smaller
// hostname wins). A stamp of -1 means "no local grain to back this
// id" — receivers treat that as legacy/no-arbitration and accept
// the remote claim as before.
AnnounceOwnership(ownerHost string, ids []uint64, lastChanges []int64)
}