From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id BB7181F5AE; Sat, 25 Jul 2020 02:10:01 +0000 (UTC) Date: Sat, 25 Jul 2020 02:10:01 +0000 From: Eric Wong To: cmogstored-public@yhbt.net Subject: [PATCH v2] http: update in-memory devXX/usage on PUT+DELETE Message-ID: <20200725020922.GA30804@dcvr> References: <20200724060858.25068-1-e@80x24.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20200724060858.25068-1-e@80x24.org> List-Id: Under heavy write traffic, free space changes constantly, and the periodic updates every 10 (or MOG_DISK_USAGE_INTERVAL) seconds can be too far behind. Since we keep the usage file contents in-memory now for out-of-FD situations, we can update that without incurring extra VFS traffic. v2: We no longer try to use fstatvfs(2) and instead pay the cost of an extra name lookups and just update all usage files. This was necessary since calculating free space while a file is still open can take a long time on some FSes and we need to send the HTTP response back ASAP to avoid timeouts on the client-side. This avoids contention in the request worker threads and the mostly idle main thread to do more work. --- http_dav.c | 2 ++ http_put.c | 1 + 2 files changed, 3 insertions(+) diff --git a/http_dav.c b/http_dav.c index 4b6df9b..43b6c7a 100644 --- a/http_dav.c +++ b/http_dav.c @@ -29,6 +29,8 @@ void mog_http_delete(struct mog_fd *mfd, char *buf) rc = mog_unlink(http->svc, path); if (rc == 0) { mog_http_resp(mfd, "204 No Content", true); + mog_notify(MOG_NOTIFY_DEVICE_REFRESH); + return; } diff --git a/http_put.c b/http_put.c index fc36ba7..11d6342 100644 --- a/http_put.c +++ b/http_put.c @@ -153,6 +153,7 @@ static void put_commit_resp(struct mog_fd *mfd) if (set_perms_commit(http)) { file_close_null(mfd); mog_http_resp(mfd, "201 Created", true); + mog_notify(MOG_NOTIFY_DEVICE_REFRESH); } else { file_close_null(mfd); mog_http_resp(mfd, "500 Internal Server Error", false);