diff options
author | Eric Wong <normalperson@yhbt.net> | 2013-06-20 01:51:09 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2013-06-20 02:38:07 +0000 |
commit | 16e31f8dce64323fdef6151a30756ce2bc770a88 (patch) | |
tree | 9dd368a9b0e0cd80283652e5477b6fc1ab0e9722 /http.c | |
parent | 91cb86eb03d828bda8a4ac9cd0c3edbac73418af (diff) | |
download | cmogstored-wip-1.3.tar.gz |
Simply releasing the descriptor triggering ENOSPC/ENOMEM errors from epoll_ctl and kevent is not good enough, as those descriptors may have other descriptors (e.g. files to be served) hanging off of them.
Diffstat (limited to 'http.c')
-rw-r--r-- | http.c | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -95,6 +95,31 @@ MOG_NOINLINE static void http_close(struct mog_fd *mfd) mog_fd_put(mfd); } +void mog_http_unlink_ftmp(struct mog_http *http) +{ + struct mog_file *file = &http->forward->as.file; + + if (!file->tmppath) + return; + + if (mog_unlink(http->svc, file->tmppath) != 0) + syslog(LOG_ERR, "Failed to unlink %s (in %s): %m", + file->tmppath, http->svc->docroot); +} + +/* called if epoll/kevent is out-of-space */ +void mog_http_drop(struct mog_fd *mfd) +{ + struct mog_http *http = &mfd->as.http; + + assert(http->forward != MOG_IOSTAT); + if (http->forward) { + mog_http_unlink_ftmp(http); + mog_file_close(http->forward); + } + http_close(mfd); +} + /* returns true if we can continue queue step, false if not */ static enum mog_next http_wbuf_in_progress(struct mog_http *http) { |