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