diff options
| author | n1c00o <n@nc0.fr> | 2023-02-06 21:54:59 +0100 |
|---|---|---|
| committer | Nicolas <34602094+n1c00o@users.noreply.github.com> | 2023-02-06 22:35:54 +0100 |
| commit | 90f58a5db6742ac8b43fc3be76fb2cf78b96f6b4 (patch) | |
| tree | b6cf6293dccf71cc88cd2400c5a578934ad4a9f0 | |
| parent | 53c6e903ba8ab3f775027eb8161b5a29f06396fc (diff) | |
Add Clawflake generator
| -rwxr-xr-x | cmd/generator/generator | bin | 12730770 -> 0 bytes | |||
| -rw-r--r-- | cmd/generator/generator.go | 57 | ||||
| -rw-r--r-- | cmd/generator/id.go | 4 | ||||
| -rw-r--r-- | cmd/generator/main.go | 23 |
4 files changed, 73 insertions, 11 deletions
diff --git a/cmd/generator/generator b/cmd/generator/generator Binary files differdeleted file mode 100755 index 4182f4b..0000000 --- a/cmd/generator/generator +++ /dev/null diff --git a/cmd/generator/generator.go b/cmd/generator/generator.go index 0a8f961..901a9c6 100644 --- a/cmd/generator/generator.go +++ b/cmd/generator/generator.go @@ -2,17 +2,70 @@ package main import ( "context" + "fmt" + "github.com/google/uuid" generatorpb "go.nc0.fr/clawflake/api/nc0/clawflake/generator/v3" + "go.uber.org/zap" + "google.golang.org/genproto/googleapis/rpc/errdetails" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) // GeneratorServiceServer is an implementation of the gRPC GeneratorService // service. type GeneratorServiceServer struct { generatorpb.UnimplementedGeneratorServiceServer + + idgen *IdGenerator + logger *zap.Logger } // Generate allows generating a set of Clawflake ID numbers. -func (g *GeneratorServiceServer) Generate(context.Context, *generatorpb.GenerateRequest) (*generatorpb.GenerateResponse, error) { - return nil, nil +func (g *GeneratorServiceServer) Generate(ctx context.Context, req *generatorpb.GenerateRequest) (*generatorpb.GenerateResponse, error) { + l := g.logger.With(zap.Uint32("amount", req.Amount), zap.String("request_id", uuid.NewString())) + l.Info("treating Generate() RPC") + + // Verify request: + if req.Amount < 1 || req.Amount > 4096 { + g.logger.Info("rejecting request due invalid amount") + s := status.New(codes.InvalidArgument, "invalid amount") + s.WithDetails(&errdetails.BadRequest_FieldViolation{ + Field: "amount", + Description: "Amount should be a value between 1 and 4096 (included).", + }) + return nil, s.Err() + } + + // Generation: + ids := make([]string, req.Amount) + l.Debug("generating ID numbers") + for i := 0; i < int(req.Amount); i++ { + id, err := g.idgen.NextId() + if err != nil { + l.Error("failed to generate ID", zap.Error(err)) + s := status.New(codes.Internal, "internal error") + s.WithDetails(&errdetails.ErrorInfo{ + Reason: "INTERNAL", + Domain: "generator.clawflake.nc0.fr", + }) + return nil, s.Err() + } + + l.Debug("generated an ID number", zap.Uint64("generated_id", id)) + + ids = append(ids, fmt.Sprint(id)) + } + l.Debug("generated ID numbers") + + return &generatorpb.GenerateResponse{ + IdNumbers: ids, + }, nil +} + +func NewGeneratorServiceServer(i *IdGenerator, l *zap.Logger) *GeneratorServiceServer { + return &GeneratorServiceServer{ + idgen: i, + logger: l.Named("grpc_generator"), + } } diff --git a/cmd/generator/id.go b/cmd/generator/id.go index 052b353..093d430 100644 --- a/cmd/generator/id.go +++ b/cmd/generator/id.go @@ -72,7 +72,7 @@ func (i *IdGenerator) NextId() (uint64, error) { i.last_time = t id = uint64(t)<<19 | uint64(*machineId)<<7 | uint64(i.seq) - l.Info("generated id number", zap.Uint64("generated_id", id)) + l.Debug("generated id number", zap.Uint64("generated_id", id)) return id, nil } @@ -83,6 +83,6 @@ func NewIdGenerator(l *zap.Logger) *IdGenerator { seq: 0, last_time: 0, mu: sync.Mutex{}, - logger: l, + logger: l.Named("id_generator"), } } diff --git a/cmd/generator/main.go b/cmd/generator/main.go index 7ed230b..22165a1 100644 --- a/cmd/generator/main.go +++ b/cmd/generator/main.go @@ -2,16 +2,18 @@ // Clawflake ID numbers. package main -// TODO(nc0): Configure CI inside //.github/workflows. - import ( "flag" + "net" + + generatorpb "go.nc0.fr/clawflake/api/nc0/clawflake/generator/v3" "go.uber.org/zap" + "google.golang.org/grpc" ) var ( - grpcHost *string = flag.String("grpc_host", "localhost:5000", "The host the gRPC server should listen to. Default to localhost:5000.") + grpcHost *string = flag.String("grpc_host", ":5000", "The host the gRPC server should listen to.") devMode *bool = flag.Bool("dev", false, "Enables development mode, with more debug logs.") ) @@ -37,13 +39,20 @@ func main() { } i := NewIdGenerator(l) - l.Info("i time", zap.Int64("time", i.GetTime())) - id, err := i.NextId() + // gRPC server + lis, err := net.Listen("tcp", *grpcHost) if err != nil { - l.Error("failed to generate id", zap.Error(err)) + l.Error("failed to listen", zap.Error(err)) return } - l.Info("i id", zap.Uint64("id", id)) + defer lis.Close() + l.Info("server is ready") + gs := grpc.NewServer() + generatorpb.RegisterGeneratorServiceServer(gs, NewGeneratorServiceServer(i, l)) + if err := gs.Serve(lis); err != nil { + l.Error("failed to serve gRPC", zap.Error(err)) + return + } } |
