1
1
import 'dart:async' show Future;
2
- import 'dart:io' ;
3
2
import 'dart:convert' ;
3
+ import 'dart:io' ;
4
+ import 'dart:isolate' ;
4
5
import 'dart:math' show Random;
5
6
import 'package:args/args.dart' show ArgParser;
6
7
import 'package:mustache/mustache.dart' as mustache;
@@ -17,11 +18,26 @@ main(List<String> args) {
17
18
parser.addOption ('address' , abbr: 'a' , defaultsTo: '0.0.0.0' );
18
19
parser.addOption ('port' , abbr: 'p' , defaultsTo: '8080' );
19
20
parser.addOption ('dbconnections' , abbr: 'd' , defaultsTo: '256' );
21
+ parser.addOption ('isolates' , abbr: 'i' , defaultsTo: '1' );
20
22
var arguments = parser.parse (args);
21
- _startServer (
22
- arguments['address' ],
23
- int .parse (arguments['port' ]),
24
- int .parse (arguments['dbconnections' ]));
23
+ var isolates = int .parse (arguments['isolates' ]);
24
+ var dbConnections = int .parse (arguments['dbconnections' ]) ~ / isolates;
25
+ ServerSocket .bind (arguments['address' ], int .parse (arguments['port' ]))
26
+ .then ((server) {
27
+ var ref = server.reference;
28
+ for (int i = 1 ; i < isolates; i++ ) {
29
+ Isolate .spawn (startInIsolate, [ref, dbConnections]);
30
+ }
31
+ _startServer (server, dbConnections);
32
+ });
33
+ }
34
+
35
+ void startInIsolate (args) {
36
+ var ref = args[0 ];
37
+ var dbConnections = args[1 ];
38
+ ref.create ().then ((server) {
39
+ _startServer (server, dbConnections);
40
+ });
25
41
}
26
42
27
43
/// The entity used in the database query and update tests.
@@ -51,15 +67,6 @@ const _WORLD_TABLE_SIZE = 10000;
51
67
/// A random number generator.
52
68
final _RANDOM = new Random ();
53
69
54
- /// The 'text/html; charset=utf-8' content type.
55
- final _TYPE_HTML = new ContentType ('text' , 'html' , charset: 'utf-8' );
56
-
57
- /// The 'application/json' content type.
58
- final _TYPE_JSON = new ContentType ('application' , 'json' );
59
-
60
- /// The 'text/html; charset=utf-8' content type.
61
- final _TYPE_TEXT = new ContentType ('text' , 'plain' , charset: 'utf-8' );
62
-
63
70
/// The PostgreSQL connection pool used by all the tests that require database
64
71
/// connectivity.
65
72
var _connectionPool;
@@ -70,7 +77,7 @@ var _fortunesTemplate;
70
77
/// Starts a benchmark server, which listens for connections from
71
78
/// '[address] : [port] ' and maintains [dbConnections] connections to the
72
79
/// database.
73
- _startServer (address, port , dbConnections) {
80
+ _startServer (serverSocket , dbConnections) {
74
81
Future .wait ([
75
82
new File ('postgresql.yaml' ).readAsString ().then ((config) {
76
83
_connectionPool = new pgpool.Pool (
@@ -83,33 +90,33 @@ _startServer(address, port, dbConnections) {
83
90
_fortunesTemplate = mustache.parse (template);
84
91
})
85
92
]).then ((_) {
86
- HttpServer .bind (address, port). then ((server) {
87
- server.serverHeader = 'dart' ;
88
- server.listen ((request) {
89
- switch ( request.uri.path ) {
90
- case '/json' :
91
- _jsonTest (request);
92
- break ;
93
- case '/db' :
94
- _dbTest (request);
95
- break ;
96
- case '/queries' :
97
- _queriesTest (request);
98
- break ;
99
- case '/fortunes' :
100
- _fortunesTest (request);
101
- break ;
102
- case '/updates' :
103
- _updatesTest (request);
104
- break ;
105
- case '/plaintext' :
106
- _plaintextTest (request);
107
- break ;
108
- default :
109
- _sendResponse (request, HttpStatus . NOT_FOUND );
110
- break ;
111
- }
112
- });
93
+ var server = new HttpServer .listenOn (serverSocket);
94
+ server.defaultResponseHeaders. clear () ;
95
+ server.serverHeader = 'dart' ;
96
+ server. listen (( request) {
97
+ switch (request.uri.path) {
98
+ case '/json' :
99
+ _jsonTest (request) ;
100
+ break ;
101
+ case '/db' :
102
+ _dbTest (request) ;
103
+ break ;
104
+ case '/queries' :
105
+ _queriesTest (request) ;
106
+ break ;
107
+ case '/fortunes' :
108
+ _fortunesTest (request) ;
109
+ break ;
110
+ case '/updates' :
111
+ _updatesTest (request) ;
112
+ break ;
113
+ case '/plaintext' :
114
+ _plaintextTest (request) ;
115
+ break ;
116
+ default :
117
+ _sendResponse (request, HttpStatus . NOT_FOUND ) ;
118
+ break ;
119
+ }
113
120
});
114
121
});
115
122
}
@@ -140,17 +147,18 @@ _sendResponse(request, statusCode, [ type, response ]) {
140
147
141
148
/// Completes the given [request] by writing the [response] as HTML.
142
149
_sendHtml (request, response) {
143
- _sendResponse (request, HttpStatus .OK , _TYPE_HTML , response);
150
+ _sendResponse (request, HttpStatus .OK , ContentType . HTML , response);
144
151
}
145
152
146
153
/// Completes the given [request] by writing the [response] as JSON.
147
154
_sendJson (request, response) {
148
- _sendResponse (request, HttpStatus .OK , _TYPE_JSON , JSON .encode (response));
155
+ _sendResponse (
156
+ request, HttpStatus .OK , ContentType .JSON , JSON .encode (response));
149
157
}
150
158
151
159
/// Completes the given [request] by writing the [response] as plain text.
152
160
_sendText (request, response) {
153
- _sendResponse (request, HttpStatus .OK , _TYPE_TEXT , response);
161
+ _sendResponse (request, HttpStatus .OK , ContentType . TEXT , response);
154
162
}
155
163
156
164
/// Responds with the JSON test to the [request] .
0 commit comments