webroar 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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