From 4f3a6f7bbca60781cac720a54cb3b0f1ca0aa701 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Tue, 14 Jan 2025 13:06:41 -0500 Subject: [PATCH] dev: ll_rmdir,ll_rmnode -> provider.(rmdir,unlink) --- .../src/filesystem/ll_operations/ll_rmdir.js | 13 +--- .../src/filesystem/ll_operations/ll_rmnode.js | 32 +------- .../modules/puterfs/lib/PuterFSProvider.js | 75 +++++++++++++++++++ 3 files changed, 79 insertions(+), 41 deletions(-) diff --git a/src/backend/src/filesystem/ll_operations/ll_rmdir.js b/src/backend/src/filesystem/ll_operations/ll_rmdir.js index 0e33608b6..e18ad0b1f 100644 --- a/src/backend/src/filesystem/ll_operations/ll_rmdir.js +++ b/src/backend/src/filesystem/ll_operations/ll_rmdir.js @@ -98,17 +98,10 @@ class LLRmDir extends LLFilesystemOperation { }); } - if ( ! descendants_only ) { - tasks.add(`fs:rm:rm-self`, async () => { - const ll_rm = new LLRmNode(); - await ll_rm.run({ - target, - user, - }); - }); - } - await tasks.awaitAll(); + if ( ! descendants_only ) { + await target.provider.rmdir({ context, node: target }); + } } } diff --git a/src/backend/src/filesystem/ll_operations/ll_rmnode.js b/src/backend/src/filesystem/ll_operations/ll_rmnode.js index 7a4d4277d..1f2c818da 100644 --- a/src/backend/src/filesystem/ll_operations/ll_rmnode.js +++ b/src/backend/src/filesystem/ll_operations/ll_rmnode.js @@ -40,37 +40,7 @@ class LLRmNode extends LLFilesystemOperation { } } - if ( await target.get('immutable') ) { - throw new APIError(403, 'File is immutable.'); - } - - const svc_size = svc.get('sizeService'); - const svc_fsEntry = svc.get('fsEntryService'); - - svc_size.change_usage( - await target.get('user_id'), - -1 * await target.get('size') - ); - - const tracer = svc.get('traceService').tracer; - const tasks = new ParallelTasks({ tracer, max: 4 }); - - tasks.add(`remove-fsentry`, async () => { - await svc_fsEntry.delete(await target.get('uid')); - }); - - if ( await target.get('has-s3') ) { - tasks.add(`remove-from-s3`, async () => { - // const storage = new PuterS3StorageStrategy({ services: svc }); - const storage = Context.get('storage'); - const state_delete = storage.create_delete(); - await state_delete.run({ - node: target, - }); - }); - } - - await tasks.awaitAll(); + await target.provider.unlink({ context, node: target }); } } diff --git a/src/backend/src/modules/puterfs/lib/PuterFSProvider.js b/src/backend/src/modules/puterfs/lib/PuterFSProvider.js index bab0e935d..58bf4355e 100644 --- a/src/backend/src/modules/puterfs/lib/PuterFSProvider.js +++ b/src/backend/src/modules/puterfs/lib/PuterFSProvider.js @@ -29,6 +29,9 @@ const FSNodeContext = require('../../../filesystem/FSNodeContext'); const { RESOURCE_STATUS_PENDING_CREATE } = require('../ResourceService'); const { ParallelTasks } = require('../../../util/otelutil'); +const { TYPE_DIRECTORY } = require('../../../filesystem/FSNodeContext'); +const APIError = require('../../../api/APIError'); + class PuterFSProvider extends putility.AdvancedBase { static MODULES = { _path: require('path'), @@ -354,6 +357,78 @@ class PuterFSProvider extends putility.AdvancedBase { // TODO: What event do we emit? How do we know if we're overwriting? return node; } + + async unlink ({ context, node }) { + if ( await node.get('type') === TYPE_DIRECTORY ) { + console.log(`\x1B[31;1m===N=====${await node.get('path')}=========\x1B[0m`) + throw new APIError(409, 'Cannot unlink a directory.'); + } + + await this.rmnode_({ context, node }); + } + + async rmdir ({ context, node }) { + if ( await node.get('type') !== TYPE_DIRECTORY ) { + console.log(`\x1B[31;1m===D1====${await node.get('path')}=========\x1B[0m`) + throw new APIError(409, 'Cannot rmdir a file.'); + } + + if ( await node.get('immutable') ) { + console.log(`\x1B[31;1m===D2====${await node.get('path')}=========\x1B[0m`) + throw APIError.create('immutable'); + } + + // Services + const services = context.get('services'); + const svc_fsEntry = services.get('fsEntryService'); + + const children = await svc_fsEntry.fast_get_direct_descendants( + await node.get('uid') + ); + + if ( children.length > 0 ) { + console.log(`\x1B[31;1m===D3====${await node.get('path')}=========\x1B[0m`) + throw APIError.create('not_empty'); + } + + await this.rmnode_({ context, node }); + } + + async rmnode_ ({ context, node }) { + // Services + const services = context.get('services'); + const svc_size = services.get('sizeService'); + const svc_fsEntry = services.get('fsEntryService'); + + if ( await node.get('immutable') ) { + throw new APIError(403, 'File is immutable.'); + } + + svc_size.change_usage( + await node.get('user_id'), + -1 * await node.get('size') + ); + + const tracer = services.get('traceService').tracer; + const tasks = new ParallelTasks({ tracer, max: 4 }); + + tasks.add(`remove-fsentry`, async () => { + await svc_fsEntry.delete(await node.get('uid')); + }); + + if ( await node.get('has-s3') ) { + tasks.add(`remove-from-s3`, async () => { + // const storage = new PuterS3StorageStrategy({ services: svc }); + const storage = Context.get('storage'); + const state_delete = storage.create_delete(); + await state_delete.run({ + node: node, + }); + }); + } + + await tasks.awaitAll(); + } } module.exports = {