Commit a51e38da authored by Ramon Nou's avatar Ramon Nou
Browse files

Improve metadata benchmark CSV and cleanup control

parent 45daad43
Loading
Loading
Loading
Loading
Loading
+31 −15
Changes for perf_tests/perf_metadata.cpp: 31 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include <getopt.h>

#include <dirent.h>
#include <fstream>
#include <libgen.h>
#include <sys/stat.h>

@@ -320,6 +321,7 @@ void print_usage(const char* prog) {
              << "  --batch                Use batch mode for mkdir test\n"
              << "  --no-cleanup           Don't cleanup test files after benchmark\n"
              << "  --csv                  Output results in CSV format (to stdout)\n"
              << "  --csv-file <path>      Write CSV results to a file\n"
              << "  --help                 Show this help message\n";
}

@@ -336,6 +338,7 @@ int main(int argc, char* argv[]) {
    bool cleanup = true;
    
    bool csv_output = false;
    std::string csv_file;
    
    static struct option long_options[] = {
        {"mountdir", required_argument, 0, 'm'},
@@ -345,12 +348,13 @@ int main(int argc, char* argv[]) {
        {"batch", no_argument, 0, 'b'},
        {"no-cleanup", no_argument, 0, 'n'},
        {"csv", no_argument, 0, 'c'},
        {"csv-file", required_argument, 0, 'o'},
        {"help", no_argument, 0, 'h'},
        {0, 0, 0, 0}
    };
    
    int opt;
    while ((opt = getopt_long(argc, argv, "m:i:f:w:bnch", long_options, nullptr)) != -1) {
    while ((opt = getopt_long(argc, argv, "m:i:f:w:bnco:h", long_options, nullptr)) != -1) {
        switch (opt) {
            case 'm': mountdir = optarg; break;
            case 'i': iterations = std::atoi(optarg); break;
@@ -359,6 +363,7 @@ int main(int argc, char* argv[]) {
            case 'b': batch_mode = true; break;
            case 'n': cleanup = false; break;
            case 'c': csv_output = true; break;
            case 'o': csv_file = optarg; csv_output = true; break;
            case 'h': print_usage(argv[0]); return 0;
            default: print_usage(argv[0]); return 1;
        }
@@ -413,7 +418,7 @@ int main(int argc, char* argv[]) {
            mkdir_batch_done = true;
        }
        
        mkdir_bench.cleanup();
        if(cleanup) mkdir_bench.cleanup();
    }
    
    // ---- 2. Stat benchmark ----
@@ -434,7 +439,7 @@ int main(int argc, char* argv[]) {
        std::cout << format_timing(stat_result, "Stat all files (" + std::to_string(num_files) + " files)", 
                      iterations * num_files) << "\n";
        
        stat_bench.cleanup();
        if(cleanup) stat_bench.cleanup();
    }
    
    // ---- 3. Readdir benchmark ----
@@ -456,7 +461,7 @@ int main(int argc, char* argv[]) {
        );
        std::cout << format_timing(readdir_result, "Readdir (" + std::to_string(num_files) + " entries)", iterations) << "\n";
        
        readdir_bench.cleanup();
        if(cleanup) readdir_bench.cleanup();
    }
    
    // ---- 4. Symlink benchmark ----
@@ -490,7 +495,7 @@ int main(int argc, char* argv[]) {
        );
        std::cout << format_timing(symlink_resolve_result, "Symlink resolve (readlink)", iterations) << "\n";
        
        symlink_bench.cleanup();
        if(cleanup) symlink_bench.cleanup();
    }
    
    // ---- 5. Rename benchmark ----
@@ -509,7 +514,7 @@ int main(int argc, char* argv[]) {
        );
        std::cout << format_timing(rename_result, "Rename (back and forth)", iterations) << "\n";
        
        rename_bench.cleanup();
        if(cleanup) rename_bench.cleanup();
    }
    
    // Cleanup
@@ -522,19 +527,30 @@ int main(int argc, char* argv[]) {
    
    // CSV output
    if (csv_output) {
        std::cout << format_timing_csv_header() << "\n";
        std::cout << format_timing_csv("metadata", "mkdir_single", mkdir_single_result, iterations) << "\n";
        std::ostringstream csv;
        csv << format_timing_csv_header() << "\n";
        csv << format_timing_csv("metadata", "mkdir_single", mkdir_single_result, iterations);
        if (mkdir_batch_done) {
            std::cout << format_timing_csv("metadata", "mkdir_batch", mkdir_batch_result, iterations) << "\n";
            csv << format_timing_csv("metadata", "mkdir_batch", mkdir_batch_result, iterations);
        }
        std::cout << format_timing_csv("metadata", "stat_all_files", stat_result, iterations * num_files) << "\n";
        std::cout << format_timing_csv("metadata", "readdir", readdir_result, iterations) << "\n";
        std::cout << format_timing_csv("metadata", "symlink_create", symlink_create_result, iterations) << "\n";
        csv << format_timing_csv("metadata", "stat_all_files", stat_result, iterations * num_files);
        csv << format_timing_csv("metadata", "readdir", readdir_result, iterations);
        csv << format_timing_csv("metadata", "symlink_create", symlink_create_result, iterations);
        if (symlink_batch_done) {
            std::cout << format_timing_csv("metadata", "symlink_batch_create", symlink_batch_result, iterations) << "\n";
            csv << format_timing_csv("metadata", "symlink_batch_create", symlink_batch_result, iterations);
        }
        csv << format_timing_csv("metadata", "symlink_resolve", symlink_resolve_result, iterations);
        csv << format_timing_csv("metadata", "rename", rename_result, iterations);
        if(!csv_file.empty()) {
            std::ofstream file(csv_file);
            if(!file) {
                std::cerr << "Error: Failed to open CSV file: " << csv_file << "\n";
                return 1;
            }
            file << csv.str();
        } else {
            std::cout << csv.str();
        }
        std::cout << format_timing_csv("metadata", "symlink_resolve", symlink_resolve_result, iterations) << "\n";
        std::cout << format_timing_csv("metadata", "rename", rename_result, iterations) << "\n";
    }
    
    std::cout << "\n=== Metadata benchmark complete ===\n";