[sheepdog] [PATCH 2/9] http: avoid reading a total data in the main thread
Liu Yuan
namei.unix at gmail.com
Thu Oct 31 10:19:16 CET 2013
On Thu, Oct 31, 2013 at 04:49:00PM +0900, MORITA Kazutaka wrote:
> From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
>
> It's not good to sleep a long time in the main thread.
>
> Object storage handles a big data and we shouldn't keep whole of it in
> the memory. I think we should directly use http_request_read and
> http_request_write.
>
> Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> ---
> sheep/http.c | 39 +++++++++++++++++----------------------
> 1 file changed, 17 insertions(+), 22 deletions(-)
>
> diff --git a/sheep/http.c b/sheep/http.c
> index 88c66e4..71bfb37 100644
> --- a/sheep/http.c
> +++ b/sheep/http.c
> @@ -20,7 +20,6 @@
> struct http_request {
> FCGX_Request fcgx;
> int opcode;
> - char *data;
> size_t data_length;
> };
>
> @@ -71,19 +70,16 @@ struct http_work {
> struct http_request *request;
> };
>
> -static inline int http_request_error(struct http_request *req)
> +static inline void http_request_error(struct http_request *req)
> {
> int ret = FCGX_GetError(req->fcgx.out);
>
> - if (ret == 0) {
> - return OK;
> - } else if (ret < 0) {
> + if (ret == 0)
> + return;
> + else if (ret < 0)
> sd_err("failed, FCGI error %d", ret);
> - return INTERNAL_SERVER_ERROR;
> - } else {
> + else
> sd_err("failed, %s", strerror(ret));
> - return INTERNAL_SERVER_ERROR;
> - }
> }
>
> static inline int http_request_write(struct http_request *req,
> @@ -91,8 +87,8 @@ static inline int http_request_write(struct http_request *req,
> {
> int ret = FCGX_PutStr(buf, len, req->fcgx.out);
> if (ret < 0)
> - return http_request_error(req);
> - return OK;
> + http_request_error(req);
> + return ret;
> }
>
> static inline int http_request_read(struct http_request *req,
> @@ -100,16 +96,16 @@ static inline int http_request_read(struct http_request *req,
> {
> int ret = FCGX_GetStr(buf, len, req->fcgx.in);
> if (ret < 0)
> - return http_request_error(req);
> - return OK;
> + http_request_error(req);
> + return ret;
> }
>
> static inline int http_request_writes(struct http_request *req, const char *str)
> {
> int ret = FCGX_PutS(str, req->fcgx.out);
> if (ret < 0)
> - return http_request_error(req);
> - return OK;
> + http_request_error(req);
> + return ret;
> }
>
> __printf(2, 3)
> @@ -122,8 +118,8 @@ static int http_request_writef(struct http_request *req, const char *fmt, ...)
> ret = FCGX_VFPrintF(req->fcgx.out, fmt, ap);
> va_end(ap);
> if (ret < 0)
> - return http_request_error(req);
> - return OK;
> + http_request_error(req);
> + return ret;
> }
>
> static int request_init_operation(struct http_request *req)
> @@ -134,10 +130,6 @@ static int request_init_operation(struct http_request *req)
> p = FCGX_GetParam("REQUEST_METHOD", env);
> if (!strcmp(p, "PUT")) {
> req->opcode = HTTP_PUT;
> - p = FCGX_GetParam("CONTENT_LENGTH", env);
> - req->data_length = strtoll(p, NULL, 10);
> - req->data = xmalloc(req->data_length);
> - http_request_read(req, req->data, req->data_length);
> } else if (!strcmp(p, "GET")) {
> req->opcode = HTTP_GET;
> } else if (!strcmp(p, "POST")) {
> @@ -149,6 +141,10 @@ static int request_init_operation(struct http_request *req)
> } else {
> return BAD_REQUEST;
> }
> +
> + p = FCGX_GetParam("CONTENT_LENGTH", env);
> + req->data_length = strtoll(p, NULL, 10);
We need to check error of strtoll.
Thanks
Yuan
More information about the sheepdog
mailing list