webroar 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +25 -0
- data/lib/user_interaction.rb +1 -1
- data/src/head/wr_application.c +11 -6
- data/src/head/wr_config.h +1 -1
- data/src/head/wr_connection.c +2 -2
- data/src/head/wr_main.c +0 -1
- data/src/head/wr_resolver.c +2 -2
- data/src/head/wr_worker.c +1 -13
- data/src/helper/wr_logger.c +13 -1
- data/src/helper/wr_util.c +1 -1
- data/src/ruby_lib/analyzer/message_reader.rb +1 -0
- data/src/ruby_lib/profiler/message_dispatcher.rb +1 -0
- data/src/ruby_lib/ruby_interface/request_body.rb +3 -4
- data/src/ruby_lib/ruby_interface/version.rb +1 -1
- data/src/vendor/libebb/ebb.c +8 -4
- data/src/vendor/libebb/ebb.h +1 -1
- data/src/worker/wkr_main.c +19 -16
- data/tasks/gem.rake +1 -1
- metadata +487 -402
data/CHANGELOG
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
v0.2.4 - 01-Dec-2009
|
2
|
+
--------------------
|
3
|
+
|
4
|
+
* Fixed intermittent crash issue in head while closing client connections
|
5
|
+
by calling close_connection() directly rather than running it through
|
6
|
+
goodbye_watcher in libebb.
|
7
|
+
* Renamed on_error callback (introduced by us in libebb) to the more
|
8
|
+
appropriate on_request_parse_error.
|
9
|
+
* Fixed install issue on ruby 1.9 caused due to invalid multibyte char.
|
10
|
+
* Fixed the incorrect month value in the file name format for gcore dumps.
|
11
|
+
* Initialized logging for the worker right as it is instantiated before
|
12
|
+
it connects to head process.
|
13
|
+
* Cleaned up wr_wkr_create() method in head/wr_worker.c.
|
14
|
+
* Print logging level as a string in the log files.
|
15
|
+
* Fixed invalid pointer being used in 'wr_req_resolve_http_req' function.
|
16
|
+
* Fixed creation of rack.input stream object. Resolves Ticket #2 related to
|
17
|
+
error seen on posting form with enctype="multipart/form-data".
|
18
|
+
* Ensured 'starling-starling' gem is used by WebROaR even is 'starling' is
|
19
|
+
present on the system.
|
20
|
+
|
21
|
+
v0.2.3 - 25-Nov-2009
|
22
|
+
---------------------
|
23
|
+
|
24
|
+
* First cut for public.
|
25
|
+
|
data/lib/user_interaction.rb
CHANGED
@@ -46,7 +46,7 @@ module Webroar
|
|
46
46
|
puts "found."
|
47
47
|
gem_name = "WebROaR-" + gem_list[gem_list.length - 1].to_s
|
48
48
|
require File.join(WEBROAR_ROOT, 'src', 'ruby_lib', 'ruby_interface','version.rb')
|
49
|
-
choice_list = [
|
49
|
+
choice_list = ["Import configuration, logs and admin panel data from the previous installation - #{gem_name}.",
|
50
50
|
"No import required, install #{Webroar::SERVER} afresh."]
|
51
51
|
|
52
52
|
puts ""
|
data/src/head/wr_application.c
CHANGED
@@ -260,13 +260,18 @@ void wr_app_print(wr_app_t*app) {
|
|
260
260
|
/** Create worker for application */
|
261
261
|
int wr_app_wkr_add(wr_app_t *app) {
|
262
262
|
if(app->pending_wkr < WR_MAX_PENDING_WKR) {
|
263
|
-
app->
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
263
|
+
int retval = wr_wkr_create(app->svr, app->conf);
|
264
|
+
if(retval > 0){
|
265
|
+
app->pending_wkr++;
|
266
|
+
app->high_ratio = TOTAL_WORKER_COUNT(app) * WR_MAX_REQ_RATIO;
|
267
|
+
app->last_wkr_pid[app->pending_wkr-1] = retval;
|
268
|
+
ev_timer_again(app->svr->ebb_svr.loop, &app->t_add_timeout);
|
269
|
+
LOG_INFO("PID of created worker = %d, Rails application=%s, ",
|
268
270
|
app->last_wkr_pid[app->pending_wkr-1],app->conf->path.str);
|
269
|
-
|
271
|
+
return 0;
|
272
|
+
}else{
|
273
|
+
LOG_ERROR(SEVERE,"Could not fork process to start new worker.");
|
274
|
+
}
|
270
275
|
}
|
271
276
|
return -1;
|
272
277
|
}
|
data/src/head/wr_config.h
CHANGED
@@ -81,7 +81,7 @@
|
|
81
81
|
// File to store Server process id
|
82
82
|
#define WR_PID_FILE "/var/run/webroar.pid"
|
83
83
|
#define WR_SERVER "WebROaR"
|
84
|
-
#define WR_VERSION "0.2.
|
84
|
+
#define WR_VERSION "0.2.4"
|
85
85
|
#define WR_MIME_TYPE_PATH "/conf/mime_type.yml"
|
86
86
|
#define WR_CONF_PATH "/conf/config.yml"
|
87
87
|
#define WR_SERVER_INTERNAL_CONF_PATH "/conf/server_internal_config.yml"
|
data/src/head/wr_connection.c
CHANGED
@@ -101,7 +101,7 @@ void wr_conn_after_write_cb(ebb_connection *connection) {
|
|
101
101
|
}
|
102
102
|
|
103
103
|
/** The connection got parser error */
|
104
|
-
void
|
104
|
+
void wr_req_parse_err_cb(ebb_connection* connection) {
|
105
105
|
LOG_FUNCTION
|
106
106
|
|
107
107
|
wr_conn_t* conn = (wr_conn_t*)connection->data;
|
@@ -183,7 +183,7 @@ wr_conn_t* wr_conn_new(wr_svr_t *server) {
|
|
183
183
|
connection->new_request = wr_new_req_cb;
|
184
184
|
connection->on_close = wr_conn_close_cb;
|
185
185
|
connection->on_timeout = wr_conn_timeout_cb;
|
186
|
-
connection->
|
186
|
+
connection->on_request_parse_error = wr_req_parse_err_cb;
|
187
187
|
|
188
188
|
return a_connection;
|
189
189
|
}
|
data/src/head/wr_main.c
CHANGED
data/src/head/wr_resolver.c
CHANGED
@@ -244,7 +244,7 @@ int wr_req_resolve_http_req(wr_svr_t *server, wr_req_t *req) {
|
|
244
244
|
}
|
245
245
|
}
|
246
246
|
/* resolve host name */
|
247
|
-
if(app == NULL) {
|
247
|
+
if(app == NULL && server->resolver->hosts) {
|
248
248
|
scgi_header_t *http_host = scgi_header_get(req->scgi, "HTTP_HOST");
|
249
249
|
if(http_host) {
|
250
250
|
wr_str_t host_str;
|
@@ -252,7 +252,7 @@ int wr_req_resolve_http_req(wr_svr_t *server, wr_req_t *req) {
|
|
252
252
|
char *value = req->scgi->header + http_host->value_offset;
|
253
253
|
|
254
254
|
//removing port
|
255
|
-
char *ptr = memchr(
|
255
|
+
char *ptr = memchr(value, ':', http_host->value_length);
|
256
256
|
if(ptr) {
|
257
257
|
wr_string_new(host_str, value, ptr - value);
|
258
258
|
} else {
|
data/src/head/wr_worker.c
CHANGED
@@ -561,7 +561,6 @@ int wr_wkr_create(wr_svr_t *server, wr_app_conf_t *app_conf) {
|
|
561
561
|
pid = fork();
|
562
562
|
LOG_DEBUG(DEBUG,"Forked PID is %i, uid = %s, gid =%s, app = %s",pid, cuid_s, cgid_s, app_conf->name.str) ;
|
563
563
|
if (pid == 0) {
|
564
|
-
if (pid == 0) {
|
565
564
|
LOG_DEBUG(3,"Child is continuing %i",pid);
|
566
565
|
setsid();
|
567
566
|
int i = 0;
|
@@ -605,17 +604,6 @@ int wr_wkr_create(wr_svr_t *server, wr_app_conf_t *app_conf) {
|
|
605
604
|
fflush(stderr);
|
606
605
|
_exit(1);
|
607
606
|
}
|
608
|
-
|
609
|
-
} else if (pid == -1) {
|
610
|
-
wr_string_free(baseuri);
|
611
|
-
perror("Cannot fork a new process");
|
612
|
-
LOG_ERROR(5,"Cannot fork a new process");
|
613
|
-
fflush(stderr);
|
614
|
-
_exit(1);
|
615
|
-
} else {
|
616
|
-
wr_string_free(baseuri);
|
617
|
-
_exit(0);
|
618
|
-
}
|
619
607
|
} else if (pid == -1) {
|
620
608
|
wr_string_free(baseuri);
|
621
609
|
LOG_ERROR(5,"Cannot fork a new process %i", errno);
|
@@ -624,7 +612,7 @@ int wr_wkr_create(wr_svr_t *server, wr_app_conf_t *app_conf) {
|
|
624
612
|
//Temporary Hack
|
625
613
|
return pid;
|
626
614
|
}
|
627
|
-
return
|
615
|
+
return -1;
|
628
616
|
}
|
629
617
|
|
630
618
|
/** Request callback called by ebb Request*/
|
data/src/helper/wr_logger.c
CHANGED
@@ -137,6 +137,18 @@ void a_error(LOG_SEVERITY level, const char *file_name, int line_no, const char
|
|
137
137
|
}
|
138
138
|
}
|
139
139
|
|
140
|
+
/** Get log level string */
|
141
|
+
char* get_log_level_string(LOG_SEVERITY level){
|
142
|
+
switch(level){
|
143
|
+
case DEBUG: return "DEBUG";
|
144
|
+
case INFO: return "INFO";
|
145
|
+
case WARN: return "WARN";
|
146
|
+
case SEVERE: return "SEVERE";
|
147
|
+
case FATAL: return "FATAL";
|
148
|
+
default: "Unknown";
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
140
152
|
/** Get logging severity */
|
141
153
|
LOG_SEVERITY get_log_severity(const char*str) {
|
142
154
|
if(strcmp(str,"DEBUG") == 0) {
|
@@ -163,6 +175,6 @@ int change_log_file_owner(int user_id, int group_id) {
|
|
163
175
|
|
164
176
|
/** Set logging level */
|
165
177
|
int set_log_severity(int severity) {
|
166
|
-
LOG_INFO("setting log level to %
|
178
|
+
LOG_INFO("setting log level to %s", get_log_level_string(severity));
|
167
179
|
logging_level = severity;
|
168
180
|
}
|
data/src/helper/wr_util.c
CHANGED
@@ -158,6 +158,6 @@ int get_timestamp(char *str) {
|
|
158
158
|
LOG_ERROR(SEVERE, "Error detected in localtime()");
|
159
159
|
return -1;
|
160
160
|
}
|
161
|
-
sprintf(str, "%d-%d-%d-%d-%d-%d", tm_struct->tm_year + 1900, tm_struct->tm_mon, tm_struct->tm_mday, tm_struct->tm_hour, tm_struct->tm_min, tm_struct->tm_sec);
|
161
|
+
sprintf(str, "%d-%d-%d-%d-%d-%d", tm_struct->tm_year + 1900, tm_struct->tm_mon + 1, tm_struct->tm_mday, tm_struct->tm_hour, tm_struct->tm_min, tm_struct->tm_sec);
|
162
162
|
return 0;
|
163
163
|
}
|
@@ -24,18 +24,17 @@ module Webroar
|
|
24
24
|
@client = client
|
25
25
|
end
|
26
26
|
|
27
|
-
def read(len = nil)
|
27
|
+
def read(len = nil, s = '')
|
28
28
|
if @io
|
29
29
|
@io.read(len)
|
30
30
|
else
|
31
|
-
if len.nil?
|
32
|
-
s = ''
|
31
|
+
if len.nil?
|
33
32
|
while(chunk = read(10*1024))
|
34
33
|
s << chunk
|
35
34
|
end
|
36
35
|
s
|
37
36
|
else
|
38
|
-
Webroar::read_request(@client, len)
|
37
|
+
s = Webroar::read_request(@client, len)
|
39
38
|
end
|
40
39
|
end
|
41
40
|
end
|
data/src/vendor/libebb/ebb.c
CHANGED
@@ -322,8 +322,8 @@ on_readable(struct ev_loop *loop, ev_io *watcher, int revents)
|
|
322
322
|
/* parse error? just drop the client. screw the 400 response */
|
323
323
|
// if(ebb_request_parser_has_error(&connection->parser)) goto error;
|
324
324
|
if(ebb_request_parser_has_error(&connection->parser)){
|
325
|
-
if(connection->
|
326
|
-
connection->
|
325
|
+
if(connection->on_request_parse_error){
|
326
|
+
connection->on_request_parse_error(connection);
|
327
327
|
}else{
|
328
328
|
ebb_connection_schedule_close(connection);
|
329
329
|
}
|
@@ -756,7 +756,7 @@ ebb_connection_init(ebb_connection *connection)
|
|
756
756
|
connection->new_request = NULL;
|
757
757
|
connection->on_timeout = NULL;
|
758
758
|
connection->on_close = NULL;
|
759
|
-
connection->
|
759
|
+
connection->on_request_parse_error = NULL;
|
760
760
|
connection->data = NULL;
|
761
761
|
}
|
762
762
|
|
@@ -770,7 +770,11 @@ ebb_connection_schedule_close (ebb_connection *connection)
|
|
770
770
|
return;
|
771
771
|
}
|
772
772
|
#endif
|
773
|
-
ev_timer_start(connection->server->loop, &connection->goodbye_watcher);
|
773
|
+
//ev_timer_start(connection->server->loop, &connection->goodbye_watcher);
|
774
|
+
// Why do we need to start a timer which would to execute after 0. second?
|
775
|
+
// Looks timer is creating problem(not able to reproduce it on development machine) like
|
776
|
+
// few time its giving on_goodbye callback twice and causing server crash
|
777
|
+
close_connection(connection);
|
774
778
|
}
|
775
779
|
|
776
780
|
/*
|
data/src/vendor/libebb/ebb.h
CHANGED
data/src/worker/wkr_main.c
CHANGED
@@ -148,7 +148,7 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
|
|
148
148
|
extern char *optarg;
|
149
149
|
size_t len;
|
150
150
|
char *str;
|
151
|
-
int invalid_arg_flag = 0, app_path_flag = 0;
|
151
|
+
int invalid_arg_flag = 0, app_path_flag = 0, log_level = INFO;
|
152
152
|
wkr_tmp_t *tmp = wkr_tmp_new();
|
153
153
|
|
154
154
|
if(tmp == NULL)
|
@@ -171,14 +171,7 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
|
|
171
171
|
wr_string_new(tmp->env, str, len);
|
172
172
|
break;
|
173
173
|
case 'l': // Logging level
|
174
|
-
|
175
|
-
|
176
|
-
set_log_severity(DEBUG);
|
177
|
-
#else
|
178
|
-
|
179
|
-
set_log_severity(atoi(optarg));
|
180
|
-
#endif
|
181
|
-
|
174
|
+
log_level = atoi(optarg);
|
182
175
|
break;
|
183
176
|
case 'f': // Log file name
|
184
177
|
wr_string_free(tmp->log_file);
|
@@ -227,8 +220,21 @@ static inline wkr_tmp_t* parse_args(int argc, char **argv) {
|
|
227
220
|
invalid_arg_flag++;
|
228
221
|
}
|
229
222
|
}
|
230
|
-
|
223
|
+
|
224
|
+
if(tmp->log_file.str){
|
225
|
+
initialize_logger(tmp->log_file.str);
|
226
|
+
#ifdef L_DEBUG
|
227
|
+
set_log_severity(DEBUG);
|
228
|
+
#else
|
229
|
+
set_log_severity(log_level);
|
230
|
+
#endif
|
231
|
+
}else{
|
232
|
+
perror("Log file is not specified.");
|
233
|
+
}
|
234
|
+
|
235
|
+
if (invalid_arg_flag > 0 || app_path_flag == 0) {
|
231
236
|
print_usage(argv[0]);
|
237
|
+
LOG_ERROR(SEVERE, "Either argument is invalid or application path is not passed.");
|
232
238
|
wkr_tmp_free(&tmp);
|
233
239
|
return NULL;
|
234
240
|
}
|
@@ -277,7 +283,7 @@ int main(int argc, char **argv) {
|
|
277
283
|
int port, retval = 0;
|
278
284
|
wkr_t* w = NULL;
|
279
285
|
|
280
|
-
if(argc==1) {
|
286
|
+
if(argc == 1) {
|
281
287
|
print_usage(argv[0]);
|
282
288
|
return -1;
|
283
289
|
}
|
@@ -289,18 +295,15 @@ int main(int argc, char **argv) {
|
|
289
295
|
// signal(SIGFPE, crash_handler);
|
290
296
|
|
291
297
|
wkr_tmp_t *tmp = parse_args(argc, argv);
|
292
|
-
|
293
298
|
if(tmp == NULL)
|
294
299
|
return -1;
|
295
|
-
|
300
|
+
|
296
301
|
loop = ev_default_loop (0);
|
302
|
+
|
297
303
|
w = worker_new(loop, tmp);
|
298
304
|
if(w==NULL)
|
299
305
|
goto err;
|
300
306
|
worker = w;
|
301
|
-
// assert(w!=NULL);
|
302
|
-
|
303
|
-
initialize_logger(w->tmp->log_file.str);
|
304
307
|
redirect_standard_io();
|
305
308
|
|
306
309
|
LOG_DEBUG(DEBUG,"control path = %s, Application baseuri = %s",
|
data/tasks/gem.rake
CHANGED