more refactoring
Some checks failed
Build and Publish / BuildAndDeploy (push) Successful in 3m6s
Build and Publish / BuildAndDeployAmd64 (push) Has been cancelled

This commit is contained in:
matst80
2025-10-10 13:22:36 +00:00
parent c30be581cd
commit 159253b8b0
13 changed files with 1475 additions and 295 deletions

View File

@@ -32,7 +32,18 @@ func NewCartActorGRPCServer(pool GrainPool, syncedPool *SyncedPool) *cartActorGR
// applyMutation routes a single cart mutation to the target grain (used by per-mutation RPC handlers).
func (s *cartActorGRPCServer) applyMutation(cartID string, mutation interface{}) *messages.CartMutationReply {
grain, err := s.pool.Apply(ToCartId(cartID), mutation)
// Canonicalize or preserve legacy id (do NOT hash-rewrite legacy textual ids)
cid, _, wasBase62, cerr := CanonicalizeOrLegacy(cartID)
if cerr != nil {
return &messages.CartMutationReply{
StatusCode: 500,
Result: &messages.CartMutationReply_Error{Error: fmt.Sprintf("cart_id canonicalization failed: %v", cerr)},
ServerTimestamp: time.Now().Unix(),
}
}
_ = wasBase62 // placeholder; future: propagate canonical id in reply metadata
legacy := CartIDToLegacy(cid)
grain, err := s.pool.Apply(legacy, mutation)
if err != nil {
return &messages.CartMutationReply{
StatusCode: 500,
@@ -159,9 +170,17 @@ func (s *cartActorGRPCServer) GetState(ctx context.Context, req *messages.StateR
Result: &messages.StateReply_Error{Error: "cart_id is required"},
}, nil
}
cartID := ToCartId(req.GetCartId())
// Canonicalize / upgrade incoming cart id (preserve legacy strings)
cid, _, _, cerr := CanonicalizeOrLegacy(req.GetCartId())
if cerr != nil {
return &messages.StateReply{
StatusCode: 500,
Result: &messages.StateReply_Error{Error: fmt.Sprintf("cart_id canonicalization failed: %v", cerr)},
}, nil
}
legacy := CartIDToLegacy(cid)
grain, err := s.pool.Get(cartID)
grain, err := s.pool.Get(legacy)
if err != nil {
return &messages.StateReply{
StatusCode: 500,
@@ -212,47 +231,18 @@ func (s *cartActorGRPCServer) Negotiate(ctx context.Context, req *messages.Negot
// ControlPlane: GetCartIds (locally owned carts only)
func (s *cartActorGRPCServer) GetCartIds(ctx context.Context, _ *messages.Empty) (*messages.CartIdsReply, error) {
ids := make([]string, 0, len(s.syncedPool.local.grains))
s.syncedPool.local.mu.RLock()
for id, g := range s.syncedPool.local.grains {
if g != nil {
ids = append(ids, id.String())
ids := make([]string, 0, len(s.syncedPool.local.grains))
for _, g := range s.syncedPool.local.grains {
if g == nil {
continue
}
ids = append(ids, g.GetId().String())
}
s.syncedPool.local.mu.RUnlock()
return &messages.CartIdsReply{CartIds: ids}, nil
}
// ControlPlane: ConfirmOwner (simple always-accept implementation)
// Future enhancement: add fencing / versioning & validate current holder.
func (s *cartActorGRPCServer) ConfirmOwner(ctx context.Context, req *messages.OwnerChangeRequest) (*messages.OwnerChangeAck, error) {
if req.GetCartId() == "" || req.GetNewHost() == "" {
return &messages.OwnerChangeAck{
Accepted: false,
Message: "cart_id and new_host required",
}, nil
}
// If we are *not* the new host and currently have a local grain, we:
// 1. Drop any local grain (relinquish ownership)
// 2. Spawn (or refresh) a remote proxy pointing to the new owner so
// subsequent mutations from this node route correctly.
if req.GetNewHost() != s.syncedPool.Hostname {
cid := ToCartId(req.GetCartId())
// Drop local ownership if present.
s.syncedPool.local.mu.Lock()
delete(s.syncedPool.local.grains, cid)
s.syncedPool.local.mu.Unlock()
// Ensure a remote proxy exists for the new owner. SpawnRemoteGrain will
// no-op if host unknown and attempt AddRemote asynchronously.
s.syncedPool.SpawnRemoteGrain(cid, req.GetNewHost())
}
return &messages.OwnerChangeAck{
Accepted: true,
Message: "accepted",
}, nil
}
// ControlPlane: Closing (peer shutdown notification)
func (s *cartActorGRPCServer) Closing(ctx context.Context, req *messages.ClosingNotice) (*messages.OwnerChangeAck, error) {
if req.GetHost() != "" {