summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorn1c00o <n@nc0.fr>2023-02-06 21:54:59 +0100
committerNicolas <34602094+n1c00o@users.noreply.github.com>2023-02-06 22:35:54 +0100
commit90f58a5db6742ac8b43fc3be76fb2cf78b96f6b4 (patch)
treeb6cf6293dccf71cc88cd2400c5a578934ad4a9f0
parent53c6e903ba8ab3f775027eb8161b5a29f06396fc (diff)
Add Clawflake generator
-rwxr-xr-xcmd/generator/generatorbin12730770 -> 0 bytes
-rw-r--r--cmd/generator/generator.go57
-rw-r--r--cmd/generator/id.go4
-rw-r--r--cmd/generator/main.go23
4 files changed, 73 insertions, 11 deletions
diff --git a/cmd/generator/generator b/cmd/generator/generator
deleted file mode 100755
index 4182f4b..0000000
--- a/cmd/generator/generator
+++ /dev/null
Binary files differ
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
+ }
}