|
@@ -56,13 +56,53 @@ var (
|
|
helloWorldBytes = []byte(helloWorldString)
|
|
helloWorldBytes = []byte(helloWorldString)
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+var prefork = flag.Bool("prefork", false, "use prefork")
|
|
|
|
+var child = flag.Bool("child", false, "is child proc")
|
|
|
|
+
|
|
func main() {
|
|
func main() {
|
|
|
|
+ var listener net.Listener
|
|
|
|
+ flag.Parse()
|
|
|
|
+ if !*prefork {
|
|
|
|
+ runtime.GOMAXPROCS(runtime.NumCPU())
|
|
|
|
+ } else {
|
|
|
|
+ listener = doPrefork()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ db, err := sql.Open("mysql", connectionString)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatalf("Error opening database: %v", err)
|
|
|
|
+ }
|
|
|
|
+ db.SetMaxIdleConns(maxConnectionCount)
|
|
|
|
+ worldStatement, err = db.Prepare(worldSelect)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ fortuneStatement, err = db.Prepare(fortuneSelect)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ updateStatement, err = db.Prepare(worldUpdate)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ http.HandleFunc("/db", dbHandler)
|
|
|
|
+ http.HandleFunc("/queries", queriesHandler)
|
|
|
|
+ http.HandleFunc("/json", jsonHandler)
|
|
|
|
+ http.HandleFunc("/fortune", fortuneHandler)
|
|
|
|
+ http.HandleFunc("/update", updateHandler)
|
|
|
|
+ http.HandleFunc("/plaintext", plaintextHandler)
|
|
|
|
+ if !*prefork {
|
|
|
|
+ http.ListenAndServe(":8080", nil)
|
|
|
|
+ } else {
|
|
|
|
+ http.Serve(listener, nil)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func doPrefork() (listener net.Listener) {
|
|
var err error
|
|
var err error
|
|
var fl *os.File
|
|
var fl *os.File
|
|
var tcplistener *net.TCPListener
|
|
var tcplistener *net.TCPListener
|
|
- var listener net.Listener
|
|
|
|
- var child = flag.Bool("child", false, "is child proc")
|
|
|
|
- flag.Parse()
|
|
|
|
if !*child {
|
|
if !*child {
|
|
var addr *net.TCPAddr
|
|
var addr *net.TCPAddr
|
|
addr, err = net.ResolveTCPAddr("tcp", ":8080")
|
|
addr, err = net.ResolveTCPAddr("tcp", ":8080")
|
|
@@ -79,7 +119,7 @@ func main() {
|
|
}
|
|
}
|
|
children := make([]*exec.Cmd, runtime.NumCPU()/2)
|
|
children := make([]*exec.Cmd, runtime.NumCPU()/2)
|
|
for i := range children {
|
|
for i := range children {
|
|
- children[i] = exec.Command(os.Args[0], "-child")
|
|
|
|
|
|
+ children[i] = exec.Command(os.Args[0], "-prefork", "-child")
|
|
children[i].Stdout = os.Stdout
|
|
children[i].Stdout = os.Stdout
|
|
children[i].Stderr = os.Stderr
|
|
children[i].Stderr = os.Stderr
|
|
children[i].ExtraFiles = []*os.File{fl}
|
|
children[i].ExtraFiles = []*os.File{fl}
|
|
@@ -89,40 +129,21 @@ func main() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for _, ch := range children {
|
|
for _, ch := range children {
|
|
- ch.Wait()
|
|
|
|
|
|
+ var err error = ch.Wait()
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Print(err)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
os.Exit(0)
|
|
os.Exit(0)
|
|
} else {
|
|
} else {
|
|
fl = os.NewFile(3, "")
|
|
fl = os.NewFile(3, "")
|
|
listener, err = net.FileListener(fl)
|
|
listener, err = net.FileListener(fl)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
runtime.GOMAXPROCS(2)
|
|
runtime.GOMAXPROCS(2)
|
|
}
|
|
}
|
|
-
|
|
|
|
- db, err := sql.Open("mysql", connectionString)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatalf("Error opening database: %v", err)
|
|
|
|
- }
|
|
|
|
- db.SetMaxIdleConns(maxConnectionCount)
|
|
|
|
- worldStatement, err = db.Prepare(worldSelect)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal(err)
|
|
|
|
- }
|
|
|
|
- fortuneStatement, err = db.Prepare(fortuneSelect)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal(err)
|
|
|
|
- }
|
|
|
|
- updateStatement, err = db.Prepare(worldUpdate)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal(err)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- http.HandleFunc("/db", dbHandler)
|
|
|
|
- http.HandleFunc("/queries", queriesHandler)
|
|
|
|
- http.HandleFunc("/json", jsonHandler)
|
|
|
|
- http.HandleFunc("/fortune", fortuneHandler)
|
|
|
|
- http.HandleFunc("/update", updateHandler)
|
|
|
|
- http.HandleFunc("/plaintext", plaintextHandler)
|
|
|
|
- http.Serve(listener, nil)
|
|
|
|
|
|
+ return listener
|
|
}
|
|
}
|
|
|
|
|
|
// Test 1: JSON serialization
|
|
// Test 1: JSON serialization
|