blob: 21e881589072eba456b3f06587028de7dc6eb076 [file] [log] [blame]
vjpaifdeacd92016-03-17 14:52:20 -07001#!/usr/bin/env ruby
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003# Copyright 2016 gRPC authors.
vjpaifdeacd92016-03-17 14:52:20 -07004#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
vjpaifdeacd92016-03-17 14:52:20 -07008#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009# http://www.apache.org/licenses/LICENSE-2.0
vjpaifdeacd92016-03-17 14:52:20 -070010#
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
vjpaifdeacd92016-03-17 14:52:20 -070016
17# Worker and worker service implementation
18
19this_dir = File.expand_path(File.dirname(__FILE__))
20lib_dir = File.join(File.dirname(this_dir), 'lib')
21$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
22$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir)
23
24require 'grpc'
25require 'optparse'
26require 'histogram'
27require 'etc'
28require 'facter'
vjpai75291c92016-03-21 07:59:26 -070029require 'client'
30require 'qps-common'
31require 'server'
Ken Payson5a2c9182016-07-26 17:15:08 -070032require 'src/proto/grpc/testing/services_services_pb'
vjpaifdeacd92016-03-17 14:52:20 -070033
34class WorkerServiceImpl < Grpc::Testing::WorkerService::Service
vjpai75291c92016-03-21 07:59:26 -070035 def cpu_cores
36 Facter.value('processors')['count']
vjpaifdeacd92016-03-17 14:52:20 -070037 end
vjpai75291c92016-03-21 07:59:26 -070038 def run_server(reqs)
39 q = EnumeratorQueue.new(self)
40 Thread.new {
vjpaie8ff3882016-03-29 18:31:34 -070041 bms = ''
vjpaied25a332016-03-30 12:16:25 -070042 gtss = Grpc::Testing::ServerStatus
Jan Tattermusch38493352016-04-18 18:07:49 -070043 reqs.each do |req|
vjpai45be26e2016-03-29 17:21:28 -070044 case req.argtype.to_s
45 when 'setup'
vjpaie8ff3882016-03-29 18:31:34 -070046 bms = BenchmarkServer.new(req.setup, @server_port)
vjpaied25a332016-03-30 12:16:25 -070047 q.push(gtss.new(stats: bms.mark(false), port: bms.get_port))
Jan Tattermusch38493352016-04-18 18:07:49 -070048 when 'mark'
vjpaied25a332016-03-30 12:16:25 -070049 q.push(gtss.new(stats: bms.mark(req.mark.reset), cores: cpu_cores))
vjpai75291c92016-03-21 07:59:26 -070050 end
51 end
vjpaie8ff3882016-03-29 18:31:34 -070052 bms.stop
Alexander Polcyn847f9ec2016-08-15 18:44:14 -070053 q.push(self)
vjpai75291c92016-03-21 07:59:26 -070054 }
55 q.each_item
56 end
57 def run_client(reqs)
58 q = EnumeratorQueue.new(self)
59 Thread.new {
vjpaid7f43b32016-03-29 18:38:10 -070060 client = ''
vjpai75291c92016-03-21 07:59:26 -070061 reqs.each do |req|
vjpaiad1c1cc2016-03-30 09:58:46 -070062 case req.argtype.to_s
vjpai45be26e2016-03-29 17:21:28 -070063 when 'setup'
64 client = BenchmarkClient.new(req.setup)
vjpai75291c92016-03-21 07:59:26 -070065 q.push(Grpc::Testing::ClientStatus.new(stats: client.mark(false)))
vjpai45be26e2016-03-29 17:21:28 -070066 when 'mark'
vjpaied25a332016-03-30 12:16:25 -070067 q.push(Grpc::Testing::ClientStatus.new(stats:
68 client.mark(req.mark.reset)))
vjpai75291c92016-03-21 07:59:26 -070069 end
70 end
vjpaiad1c1cc2016-03-30 09:58:46 -070071 client.shutdown
Alexander Polcyn847f9ec2016-08-15 18:44:14 -070072 q.push(self)
vjpai75291c92016-03-21 07:59:26 -070073 }
74 q.each_item
vjpaifdeacd92016-03-17 14:52:20 -070075 end
76 def core_count(_args, _call)
vjpai75291c92016-03-21 07:59:26 -070077 Grpc::Testing::CoreResponse.new(cores: cpu_cores)
vjpaifdeacd92016-03-17 14:52:20 -070078 end
79 def quit_worker(_args, _call)
80 Thread.new {
81 sleep 3
82 @server.stop
83 }
84 Grpc::Testing::Void.new
85 end
vjpai45be26e2016-03-29 17:21:28 -070086 def initialize(s, sp)
vjpaifdeacd92016-03-17 14:52:20 -070087 @server = s
vjpai45be26e2016-03-29 17:21:28 -070088 @server_port = sp
vjpaifdeacd92016-03-17 14:52:20 -070089 end
90end
91
92def main
93 options = {
vjpai45be26e2016-03-29 17:21:28 -070094 'driver_port' => 0,
95 'server_port' => 0
vjpaifdeacd92016-03-17 14:52:20 -070096 }
97 OptionParser.new do |opts|
vjpai45be26e2016-03-29 17:21:28 -070098 opts.banner = 'Usage: [--driver_port <port>] [--server_port <port>]'
vjpaifdeacd92016-03-17 14:52:20 -070099 opts.on('--driver_port PORT', '<port>') do |v|
100 options['driver_port'] = v
101 end
vjpai45be26e2016-03-29 17:21:28 -0700102 opts.on('--server_port PORT', '<port>') do |v|
103 options['server_port'] = v
104 end
vjpaifdeacd92016-03-17 14:52:20 -0700105 end.parse!
Alexander Polcyn847f9ec2016-08-15 18:44:14 -0700106
107 # Configure any errors with client or server child threads to surface
108 Thread.abort_on_exception = true
109
vjpaifdeacd92016-03-17 14:52:20 -0700110 s = GRPC::RpcServer.new
111 s.add_http2_port("0.0.0.0:" + options['driver_port'].to_s,
112 :this_port_is_insecure)
vjpai45be26e2016-03-29 17:21:28 -0700113 s.handle(WorkerServiceImpl.new(s, options['server_port'].to_i))
vjpaifdeacd92016-03-17 14:52:20 -0700114 s.run
115end
116
117main