From a50866ec76cd247fabab987297612dd4ceca5f00 Mon Sep 17 00:00:00 2001 From: KernelDeimos <7225168+KernelDeimos@users.noreply.github.com> Date: Wed, 12 Nov 2025 15:55:29 -0500 Subject: [PATCH] dev(puterfs): move get_recursive_size to extension --- extensions/puterfs/PuterFSProvider.js | 22 +++++++++++++++++++ src/backend/src/filesystem/FSNodeContext.js | 4 +--- .../filesystem/definitions/capabilities.js | 9 ++++---- .../src/modules/puterfs/SizeService.js | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/extensions/puterfs/PuterFSProvider.js b/extensions/puterfs/PuterFSProvider.js index 38bed619..1134201b 100644 --- a/extensions/puterfs/PuterFSProvider.js +++ b/extensions/puterfs/PuterFSProvider.js @@ -112,6 +112,7 @@ export default class PuterFSProvider { capabilities.READDIR_UUID_MODE, capabilities.COPY_TREE, + capabilities.GET_RECURSIVE_SIZE, capabilities.READ, capabilities.WRITE, @@ -777,6 +778,27 @@ export default class PuterFSProvider { return node; } + async get_recursive_size ({ node }) { + const uuid = await node.get('uid'); + const cte_query = ` + WITH RECURSIVE descendant_cte AS ( + SELECT uuid, parent_uid, size + FROM fsentries + WHERE parent_uid = ? + + UNION ALL + + SELECT f.uuid, f.parent_uid, f.size + FROM fsentries f + INNER JOIN descendant_cte d + ON f.parent_uid = d.uuid + ) + SELECT SUM(size) AS total_size FROM descendant_cte + `; + const rows = await db.read(cte_query, [uuid]); + return rows[0].total_size; + } + /** * @param {Object} param * @param {File} param.file: The file to write. diff --git a/src/backend/src/filesystem/FSNodeContext.js b/src/backend/src/filesystem/FSNodeContext.js index 82e11980..5aba6794 100644 --- a/src/backend/src/filesystem/FSNodeContext.js +++ b/src/backend/src/filesystem/FSNodeContext.js @@ -531,15 +531,13 @@ module.exports = class FSNodeContext { * already fetched. */ async fetchSize() { - const { fsEntryService } = Context.get('services').values; - // we already have the size for files if ( ! this.entry.is_dir ) { await this.fetchEntry(); return this.entry.size; } - this.entry.size = await fsEntryService.get_recursive_size(this.entry.uuid); + this.entry.size = await this.provider.get_recursive_size({ node: this }); return this.entry.size; } diff --git a/src/backend/src/filesystem/definitions/capabilities.js b/src/backend/src/filesystem/definitions/capabilities.js index ef9b289d..695d49d8 100644 --- a/src/backend/src/filesystem/definitions/capabilities.js +++ b/src/backend/src/filesystem/definitions/capabilities.js @@ -1,18 +1,18 @@ /* * Copyright (C) 2024-present Puter Technologies Inc. - * + * * This file is part of Puter. - * + * * Puter is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. - * + * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ @@ -35,6 +35,7 @@ const capabilityNames = [ 'copy-tree', 'move-tree', 'remove-tree', + 'get-recursive-size', // Behavior Capabilities 'case-sensitive', diff --git a/src/backend/src/modules/puterfs/SizeService.js b/src/backend/src/modules/puterfs/SizeService.js index fbd84330..02cdb113 100644 --- a/src/backend/src/modules/puterfs/SizeService.js +++ b/src/backend/src/modules/puterfs/SizeService.js @@ -108,7 +108,7 @@ class SizeService extends BaseService { let sz; if ( node.entry.is_dir ) { if ( node.entry.uuid ) { - sz = await fsEntryService.get_recursive_size(node.entry.uuid); + sz = await node.fetchSize(); } else { // very unlikely, but a warning is better than a throw right now // TODO: remove this once we're sure this is never hit