dev: ll_rmdir,ll_rmnode -> provider.(rmdir,unlink)

This commit is contained in:
KernelDeimos
2025-01-14 13:06:41 -05:00
parent 5bf11adff3
commit 4f3a6f7bbc
3 changed files with 79 additions and 41 deletions
@@ -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 });
}
}
}
@@ -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 });
}
}
@@ -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 = {