-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
76 lines (65 loc) · 1.82 KB
/
main.go
File metadata and controls
76 lines (65 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main
import (
"flag"
"fmt"
"log"
"net"
"os"
"os/signal"
"time"
"mapreduce/master"
"mapreduce/worker"
"google.golang.org/grpc"
pb "mapreduce/proto"
)
func main() {
var mode string
var port string
var configPath string
var inputPath string
flag.StringVar(&mode, "mode", "master", "Mode to run: master or worker")
flag.StringVar(&port, "port", ":50051", "Worker listen port (only used in worker mode)")
flag.StringVar(&configPath, "config", "config.yaml", "Path to configuration file (only used in master mode)")
flag.StringVar(&inputPath, "input", "input", "Path to input file (only used in master mode)")
flag.Parse()
switch mode {
case "master":
if configPath == "" || inputPath == "" {
fmt.Println("Usage: go run main.go --mode=master --config=config.yaml --input=input")
return
}
master.RunMaster(configPath, inputPath)
case "worker":
if port == "" {
fmt.Println("Usage: go run main.go --mode=worker --port=:50051")
return
}
runWorker(port)
default:
log.Fatalf("Unknown mode: %s "+
"\nUsage"+
"\nmaster: go run main.go --mode=master --config=config.yaml --input=input"+
"\nworker: go run main.go --mode=worker --port=:50051", mode)
}
}
func runWorker(port string) {
ws := &worker.WorkerServer{}
ws.BindAddress = port
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen on %s: %v", port, err)
}
grpcServer := grpc.NewServer()
pb.RegisterWorkerServiceServer(grpcServer, ws)
go func() {
fmt.Printf("%s Worker listening on port %s\n", time.Now().Format("2006/01/02 15:04:05"), port[1:])
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("Failed to serve gRPC: %v", err)
}
}()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
fmt.Println("Received shutdown signal, shutting down...")
grpcServer.GracefulStop()
}