| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /*
- List cluster files - the job half
- Walks the whole cluster:/ drive and returns every file with its size and
- extension, plus a total per extension. It can run on any node: cluster:/
- looks the same everywhere, so the scheduler is free to pick the least
- busy one.
- args (all optional):
- root folder to list, default "cluster:/"
- limit how many files to put in the list, default 5000. The totals
- always cover every file; the limit only keeps the reply small
- on a very large drive.
- */
- requirelib("filelib");
- function humanSize(bytes) {
- var units = ["B", "KB", "MB", "GB", "TB"];
- var i = 0;
- var v = bytes;
- while (v >= 1024 && i < units.length - 1) {
- v = v / 1024;
- i++;
- }
- return (i === 0 ? v : v.toFixed(1)) + " " + units[i];
- }
- function extensionOf(name) {
- var dot = name.lastIndexOf(".");
- if (dot <= 0 || dot === name.length - 1) {
- return ""; //no extension, or a dot file such as .gitignore
- }
- return name.substring(dot + 1).toLowerCase();
- }
- function run(job) {
- var args = job.args || {};
- var root = args.root || "cluster:/";
- var limit = args.limit > 0 ? args.limit : 5000;
- job.log("Walking " + root);
- var paths = filelib.walk(root, "file");
- if (!paths) {
- throw new Error("cannot read " + root);
- }
- var files = [];
- var byExtension = {};
- var totalBytes = 0;
- for (var i = 0; i < paths.length; i++) {
- job.abortIfCancelled();
- var path = paths[i];
- var name = path.split("/").pop();
- var ext = extensionOf(name);
- var size = filelib.filesize(path);
- totalBytes += size;
- var key = ext === "" ? "(none)" : ext;
- if (!byExtension[key]) {
- byExtension[key] = { files: 0, bytes: 0 };
- }
- byExtension[key].files++;
- byExtension[key].bytes += size;
- if (files.length < limit) {
- files.push({ path: path, name: name, extension: ext, size: size, sizeText: humanSize(size) });
- }
- if (i % 200 === 0) {
- job.progress(i / paths.length);
- }
- }
- for (var k in byExtension) {
- byExtension[k].sizeText = humanSize(byExtension[k].bytes);
- }
- return {
- root: root,
- listedOn: job.node,
- totalFiles: paths.length,
- totalBytes: totalBytes,
- totalSizeText: humanSize(totalBytes),
- truncated: paths.length > files.length,
- byExtension: byExtension,
- files: files
- };
- }
|