@@ -9,11 +9,12 @@ import (
9
9
10
10
"github.com/dustin/go-humanize"
11
11
"github.com/go-faster/errors"
12
+ "golang.org/x/sync/errgroup"
12
13
13
14
"github.com/go-faster/ch/proto"
14
15
)
15
16
16
- func run (_ context.Context ) ( re error ) {
17
+ func run (ctx context.Context ) error {
17
18
ln , err := net .Listen ("tcp4" , "127.0.0.1:9001" )
18
19
if err != nil {
19
20
return errors .Wrap (err , "listen" )
@@ -54,45 +55,61 @@ func run(_ context.Context) (re error) {
54
55
55
56
fmt .Println ("starting" , "with chunk of" , humanize .Bytes (uint64 (len (raw ))))
56
57
57
- for {
58
- conn , err := ln .Accept ()
59
- if err != nil {
60
- return errors .Wrap (err , "accept" )
61
- }
62
-
58
+ process := func (conn net.Conn ) error {
63
59
go func () {
60
+ // Drain input.
64
61
_ , _ = io .Copy (io .Discard , conn )
65
62
}()
66
- go func () {
67
- defer func () { _ = conn .Close () }()
68
- b := new (proto.Buffer )
69
- b .EncodeAware (& proto.ServerHello {
70
- Name : "ch-bench-server" ,
71
- Major : 0 ,
72
- Minor : 12 ,
73
- Revision : proto .Version ,
74
- Timezone : "UTC" ,
75
- DisplayName : "Bench" ,
76
- Patch : 1 ,
77
- }, proto .Version )
78
- if _ , err := conn .Write (b .Buf ); err != nil {
79
- return
80
- }
63
+ defer func () { _ = conn .Close () }()
64
+ b := new (proto.Buffer )
65
+ b .EncodeAware (& proto.ServerHello {
66
+ Name : "ch-bench-server" ,
67
+ Major : 0 ,
68
+ Minor : 12 ,
69
+ Revision : proto .Version ,
70
+ Timezone : "UTC" ,
71
+ DisplayName : "Bench" ,
72
+ Patch : 1 ,
73
+ }, proto .Version )
74
+ if _ , err := conn .Write (b .Buf ); err != nil {
75
+ return errors .Wrap (err , "write server hello" )
76
+ }
81
77
82
- for i := 0 ; i < chunks ; i ++ {
83
- if _ , err := conn .Write (raw ); err != nil {
84
- return
85
- }
78
+ for i := 0 ; i < chunks ; i ++ {
79
+ if _ , err := conn .Write (raw ); err != nil {
80
+ return errors .Wrap (err , "write chunk" )
86
81
}
82
+ }
83
+
84
+ // End of data.
85
+ b .Reset ()
86
+ proto .ServerCodeEndOfStream .Encode (b )
87
+ if _ , err := conn .Write (b .Buf ); err != nil {
88
+ return errors .Wrap (err , "write end of stream" )
89
+ }
90
+
91
+ return nil
92
+ }
87
93
88
- // End of data.
89
- b .Reset ()
90
- proto .ServerCodeEndOfStream .Encode (b )
91
- if _ , err := conn .Write (b .Buf ); err != nil {
92
- return
94
+ g , ctx := errgroup .WithContext (ctx )
95
+ for i := 0 ; i < 10 ; i ++ {
96
+ g .Go (func () error {
97
+ for {
98
+ if ctx .Err () != nil {
99
+ return ctx .Err ()
100
+ }
101
+ conn , err := ln .Accept ()
102
+ if err != nil {
103
+ return errors .Wrap (err , "accept" )
104
+ }
105
+ if err := process (conn ); err != nil {
106
+ return errors .Wrap (err , "process" )
107
+ }
93
108
}
94
- }( )
109
+ })
95
110
}
111
+
112
+ return g .Wait ()
96
113
}
97
114
98
115
func main () {
0 commit comments