From 1274b8a276477558c34831a9957526a72dd4e5e6 Mon Sep 17 00:00:00 2001 From: Dan Reif <35710107+CH-DanReif@users.noreply.github.com> Date: Thu, 29 Nov 2018 16:10:25 -0800 Subject: [PATCH 1/2] Use `FILENAME_MAX` instead of hardcoded max --- dentls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dentls.c b/dentls.c index 4241c83..b0af7ec 100644 --- a/dentls.c +++ b/dentls.c @@ -62,7 +62,7 @@ struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; - char d_name[256]; + char d_name[FILENAME_MAX]; char d_type; }; From f51fe958c404edb61a1f66af42a2bc8e01c5b77e Mon Sep 17 00:00:00 2001 From: Dan Reif Date: Fri, 30 Nov 2018 12:24:55 -0800 Subject: [PATCH 2/2] feat: runtime unlink enable, runtime progress enable --- dentls.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/dentls.c b/dentls.c index b0af7ec..8853444 100644 --- a/dentls.c +++ b/dentls.c @@ -20,6 +20,13 @@ * that has significantly negative effect on unlink performance */ +// Globals +unsigned long delete_count = 0; // Running count of deletions +unsigned short show_progress = 0; // By default, don't show progress +unsigned short print_only = 1; // By default, print entries, don't unlink +unsigned long progress_interval_minor = 1000; // Print a ".". +unsigned long progress_interval_major = 50; // Print the number done so far. + /* Tests indicate that performing a ascending order traversal * is about 1/3 faster than a descending order traversal */ int compare_fnames(const void *key1, const void *key2) { @@ -30,15 +37,23 @@ void walk_tree(const void *node, VISIT val, int lvl) { int rc = 0; switch(val) { case leaf: - printf("%s\n", *(char **)node); - // rc = unlink(*(char **)node); + if (print_only) { + printf("%s\n", *(char **)node); + } else { + rc = unlink(*(char **)node); + } + delete_count++; break; /* End order is deliberate here as it offers the best btree * rebalancing avoidance. */ case endorder: - printf("%s\n", *(char **)node); - // rc = unlink(*(char **)node); + if (print_only) { + printf("%s\n", *(char **)node); + } else { + rc = unlink(*(char **)node); + } + delete_count++; break; default: return; @@ -46,10 +61,22 @@ void walk_tree(const void *node, VISIT val, int lvl) { } if (rc < 0) { + fprintf(stderr, "Failed to delete %s", *(char **)node); perror("unlink problem"); exit(1); } + if (show_progress) { + if (delete_count % (progress_interval_minor * progress_interval_major) == 0) { + sleep(1); + fprintf(stderr, "%s%lu", (delete_count ? "\n" : ""), delete_count); + fflush(stderr); + } + else if (delete_count % progress_interval_minor == 0) { + fprintf(stderr, "."); + fflush(stderr); + } + } } void dummy_destroy(void *nil) { @@ -114,6 +141,28 @@ int main(const int argc, const char** argv) { exit(1); } + if (argv[1][0] == '-' || argv[1][0] != '/') { + fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, " For safety, must be fully-qualified (i.e., start with /).\n"); + fprintf(stderr, " Env: Set DENTLS_DELETE=delete to delete instead of print.\n"); + fprintf(stderr, " Env: Set DENTLS_PROGRESS to show progress on stderr.\n"); + return -1; + } + + if (getenv("DENTLS_DELETE") != NULL) { + if (strcmp(getenv("DENTLS_DELETE"), "delete")) { + fprintf(stderr, "If you'd like to delete files, please set DENTLS_DELETE to 'delete', *EXACTLY*.\n"); + fprintf(stderr, "If you did not intend to run deletes, please unset the variable entirely.\n"); + return 1; + } else { + print_only = 0; + } + } + + if (getenv("DENTLS_PROGRESS")) { + show_progress = 1; + } + const char *path = argv[1]; /* Standard sanity checking stuff */ @@ -190,10 +239,10 @@ int main(const int argc, const char** argv) { linked_list_prepend_override(&dirent_buffers_list, buffer); } fprintf(stderr, "Total files: %d\n", totalfiles); - printf("Performing delete..\n"); + fprintf(stderr, "Performing %s...\n", (print_only ? "print" : "delete")); twalk(tree, walk_tree); - printf("Done\n"); + fprintf(stderr, "Done\n"); close(dirfd); free_linked_list(dirent_buffers_list); tdestroy(tree, dummy_destroy);