package device import ( "context" "fmt" "time" pb "git.pengzhan.dev/ddp-simulator/proto" "github.com/cenkalti/backoff/v4" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) func (d *Device) RegisterClient() error { conn, err := grpc.NewClient(fmt.Sprintf("%s:%d", d.ParentIP, d.ParentPort), grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("failed to connect to global server: %v", err) } defer conn.Close() client := pb.NewDeviceClient(conn) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() children := make([]string, 0) for _, child := range d.Children { children = append(children, child.ID) } _, err = client.Register(ctx, &pb.RegisterRequest{ Id: d.ID, Role: d.Role, Ip: d.IP, Port: int32(d.Port), ChildrenIds: children, Capacity: d.Capacity, }) return err } func (d *Device) RegisterClientRetry(ctx context.Context, timeout time.Duration) error { b := backoff.NewExponentialBackOff() b.InitialInterval = 1 * time.Second b.MaxElapsedTime = timeout retryOp := func() error { return d.RegisterClient() } err := backoff.Retry(retryOp, backoff.WithContext(b, ctx)) return err }