worker_service_impl.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. *
  3. * Copyright 2015 gRPC authors.
  4. *
  5. * 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
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * 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.
  16. *
  17. */
  18. 'use strict';
  19. var os = require('os');
  20. var console = require('console');
  21. var BenchmarkClient = require('./benchmark_client');
  22. var BenchmarkServer = require('./benchmark_server');
  23. module.exports = function WorkerServiceImpl(benchmark_impl, server) {
  24. var BenchmarkClient;
  25. var BenchmarkServer;
  26. switch (benchmark_impl) {
  27. case 'grpc':
  28. BenchmarkClient = require('./benchmark_client');
  29. BenchmarkServer = require('./benchmark_server');
  30. break;
  31. case 'express':
  32. BenchmarkClient = require('./benchmark_client_express');
  33. BenchmarkServer = require('./benchmark_server_express');
  34. break;
  35. default:
  36. throw new Error('Unrecognized benchmark impl: ' + benchmark_impl);
  37. }
  38. this.quitWorker = function quitWorker(call, callback) {
  39. callback(null, {});
  40. server.tryShutdown(function() {});
  41. };
  42. this.runClient = function runClient(call) {
  43. var client;
  44. call.on('data', function(request) {
  45. var stats;
  46. switch (request.argtype) {
  47. case 'setup':
  48. var setup = request.setup;
  49. console.log('ClientConfig %j', setup);
  50. client = new BenchmarkClient(setup.server_targets,
  51. setup.client_channels,
  52. setup.histogram_params,
  53. setup.security_params);
  54. client.on('error', function(error) {
  55. call.emit('error', error);
  56. });
  57. var req_size, resp_size, generic;
  58. switch (setup.payload_config.payload) {
  59. case 'bytebuf_params':
  60. req_size = setup.payload_config.bytebuf_params.req_size;
  61. resp_size = setup.payload_config.bytebuf_params.resp_size;
  62. generic = true;
  63. break;
  64. case 'simple_params':
  65. req_size = setup.payload_config.simple_params.req_size;
  66. resp_size = setup.payload_config.simple_params.resp_size;
  67. generic = false;
  68. break;
  69. default:
  70. call.emit('error', new Error('Unsupported PayloadConfig type' +
  71. setup.payload_config.payload));
  72. return;
  73. }
  74. switch (setup.load_params.load) {
  75. case 'closed_loop':
  76. client.startClosedLoop(setup.outstanding_rpcs_per_channel,
  77. setup.rpc_type, req_size, resp_size, generic);
  78. break;
  79. case 'poisson':
  80. client.startPoisson(setup.outstanding_rpcs_per_channel,
  81. setup.rpc_type, req_size, resp_size,
  82. setup.load_params.poisson.offered_load, generic);
  83. break;
  84. default:
  85. call.emit('error', new Error('Unsupported LoadParams type' +
  86. setup.load_params.load));
  87. return;
  88. }
  89. stats = client.mark();
  90. call.write({
  91. stats: stats
  92. });
  93. break;
  94. case 'mark':
  95. if (client) {
  96. stats = client.mark(request.mark.reset);
  97. call.write({
  98. stats: stats
  99. });
  100. } else {
  101. call.emit('error', new Error('Got Mark before ClientConfig'));
  102. }
  103. break;
  104. default:
  105. throw new Error('Nonexistent client argtype option: ' + request.argtype);
  106. }
  107. });
  108. call.on('end', function() {
  109. client.stop(function() {
  110. call.end();
  111. });
  112. });
  113. };
  114. this.runServer = function runServer(call) {
  115. var server;
  116. call.on('data', function(request) {
  117. var stats;
  118. switch (request.argtype) {
  119. case 'setup':
  120. console.log('ServerConfig %j', request.setup);
  121. var setup = request.setup;
  122. var resp_size, generic;
  123. if (setup.payload_config) {
  124. switch (setup.payload_config.payload) {
  125. case 'bytebuf_params':
  126. resp_size = setup.payload_config.bytebuf_params.resp_size;
  127. generic = true;
  128. break;
  129. case 'simple_params':
  130. resp_size = setup.payload_config.simple_params.resp_size;
  131. generic = false;
  132. break;
  133. default:
  134. call.emit('error', new Error('Unsupported PayloadConfig type' +
  135. setup.payload_config.payload));
  136. return;
  137. }
  138. }
  139. server = new BenchmarkServer('[::]', request.setup.port,
  140. request.setup.security_params,
  141. generic, resp_size);
  142. server.on('started', function() {
  143. stats = server.mark();
  144. call.write({
  145. stats: stats,
  146. port: server.getPort()
  147. });
  148. });
  149. server.start();
  150. break;
  151. case 'mark':
  152. if (server) {
  153. stats = server.mark(request.mark.reset);
  154. call.write({
  155. stats: stats,
  156. port: server.getPort(),
  157. cores: 1
  158. });
  159. } else {
  160. call.emit('error', new Error('Got Mark before ServerConfig'));
  161. }
  162. break;
  163. default:
  164. throw new Error('Nonexistent server argtype option');
  165. }
  166. });
  167. call.on('end', function() {
  168. server.stop(function() {
  169. call.end();
  170. });
  171. });
  172. };
  173. this.coreCount = function coreCount(call, callback) {
  174. callback(null, {cores: os.cpus().length});
  175. };
  176. };