}
}
-static void ls3_stats_init_heap(void)
+static void ls3_stats_init_heap(struct ls3_stats_dir_general *d_stats)
{
- if (!dir_stats)
+ if (!d_stats)
return;
- if (dir_stats->lsdg_top_size == NULL)
+ if (d_stats->lsdg_top_size == NULL)
/* Create/init HEAP */
- dir_stats->lsdg_top_size =
- ls3_stats_create_heap(dir_stats->lsdg_top_rating_limit);
+ d_stats->lsdg_top_size =
+ ls3_stats_create_heap(d_stats->lsdg_top_rating_limit);
}
/* ls3_stats_get_dots - Generates dots to display
* file if all conditions are met.
*/
static void ls3_stats_fprintf_out_recursive(FILE *out_fd,
+ struct ls3_stats_dir_general *stats,
struct ls3_stats_dir_obj *dir_ptr,
bool top_rating_only,
uint64_t *total_size,
*total_alloc_size += dir_ptr->lsdo_alloc_size_in_sectors * 512;
}
- /* dir_stats->lsdg_min_size_value_for_print is initialized
+ /* stats->lsdg_min_size_value_for_print is initialized
* to 0 by default unless the user has specified this
* option with a value in Lipe_find3. This is necessary
* when there are a lot of directories and it won't be
* And skip first dir.
*/
if (dir_ptr->lsdo_depth >= 0 &&
- dir_ptr->lsdo_size >= dir_stats->lsdg_min_size_value_for_print &&
+ dir_ptr->lsdo_size >= stats->lsdg_min_size_value_for_print &&
!top_rating_only && out_fd) {
allocate_dir_size = dir_ptr->lsdo_alloc_size_in_sectors * 512;
tabulation = ls3_stats_get_dots(dir_ptr->lsdo_depth);
}
/* Trying to add a directory to the rating table */
- if (dir_stats->lsdg_top_size)
- ls3_stats_insert_heap(dir_stats->lsdg_top_size, dir_ptr);
+ if (stats->lsdg_top_size)
+ ls3_stats_insert_heap(stats->lsdg_top_size, dir_ptr);
for (i = 0; i < dir_ptr->lsdo_last_child + 1; i++) {
child_ptr = dir_ptr->lsdo_child[i];
if (child_ptr == NULL)
continue;
- ls3_stats_fprintf_out_recursive(out_fd, child_ptr,
+ ls3_stats_fprintf_out_recursive(out_fd, stats, child_ptr,
top_rating_only, total_size,
total_alloc_size);
}
}
static void ls3_stats_printf_rating_out(FILE *out_fd,
- struct ls3_stats_dir_rating *heap)
+ struct ls3_stats_dir_general *d_stats)
{
+ struct ls3_stats_dir_rating *heap = d_stats->lsdg_top_size;
+ struct fstats_report *d_fstats = d_stats->lsdg_files_report;
int i;
fprintf(out_fd, "\n\nTop %d largest directories:\n",
- dir_stats->lsdg_top_rating_limit);
+ d_stats->lsdg_top_rating_limit);
fprintf(out_fd, "____Size____ _Alloc_Size_ __Files_Count__"
" ___Dirs_Count__ __User_ID___ _____________FID______________"
" ____________________Directory_name_______________________\n");
snprintf(tmp_alocte_size_str, sizeof(tmp_alocte_size_str),
"%s", ls3_stats_fmt_size_units(allocate_dir_size));
- if (heap->lsdr_array[i]->lsdo_fid.f_seq != 0) {
- rc = llapi_fid2path(reports_with_stats->client_mount_path,
+ if (heap->lsdr_array[i]->lsdo_fid.f_seq != 0 &&
+ !d_fstats->merging) {
+ rc = llapi_fid2path(d_fstats->client_mount_path,
fid_str, path, PATH_MAX, NULL, NULL);
if (rc != 0)
llapi_error(LLAPI_MSG_ERROR, rc,
* size statistics in an easy-to-read format into a general stats report
* with the *.out extension.
*/
-void ls3_stats_fprintf_out(FILE *out_fd)
+void ls3_stats_fprintf_out(struct ls3_stats_dir_general *d_stats, FILE *out_fd)
{
uint64_t total_size;
uint64_t total_alloc_size;
char tmp_alocte_size_str[LS3_STATS_NUM_STR_MAX_WITH_NULL];
+ struct fstats_report *f_stats = d_stats->lsdg_files_report;
- if (!dir_stats)
+ if (!d_stats)
return;
- if (!dir_stats->lsdg_start_dir)
+ if (!d_stats->lsdg_start_dir)
return;
- ls3_stats_init_heap();
-
+ ls3_stats_init_heap(d_stats);
fprintf(out_fd,
"\n\nDirectory statistics for: '%s' [files count:%u size:%s]\n",
- dir_stats->lsdg_start_path[0] ?
- dir_stats->lsdg_start_path : "/",
- dir_stats->lsdg_start_dir->lsdo_files_count,
- ls3_stats_fmt_size_units(dir_stats->lsdg_start_dir->lsdo_size));
+ d_stats->lsdg_start_path,
+ d_stats->lsdg_start_dir->lsdo_files_count,
+ ls3_stats_fmt_size_units(d_stats->lsdg_start_dir->lsdo_size));
fprintf(out_fd,
"____Size____ _Alloc_Size_ __Files_Count__ ___Dirs_Count__"
" _____________FID______________"
" _____________Structure_and_directory_name________________\n");
- ls3_stats_fprintf_out_recursive(out_fd, dir_stats->lsdg_start_dir,
+ ls3_stats_fprintf_out_recursive(out_fd, d_stats, d_stats->lsdg_start_dir,
false, &total_size, &total_alloc_size);
fprintf(out_fd,
"____________ ____________ _______________ _______________"
fprintf(out_fd,
"Total size of directories on %s: %s | allocate size: %s",
- reports_with_stats->device_name,
+ f_stats->device_name,
ls3_stats_fmt_size_units(total_size),
tmp_alocte_size_str);
-
/* Update total size counters for next reports (*.all) */
- dir_stats->lsdg_total_size = total_size;
- dir_stats->lsdg_total_alloc_size = total_alloc_size;
+ d_stats->lsdg_total_size = total_size;
+ d_stats->lsdg_total_alloc_size = total_alloc_size;
- if (dir_stats->lsdg_top_size) {
- ls3_stats_heap_sort(dir_stats->lsdg_top_size);
- ls3_stats_printf_rating_out(out_fd, dir_stats->lsdg_top_size);
+ if (d_stats->lsdg_top_size) {
+ ls3_stats_heap_sort(d_stats->lsdg_top_size);
+ ls3_stats_printf_rating_out(out_fd, d_stats);
} else {
LS3_WARNING("the size of the rating table has not been "
"specified or is equal to 0, the rating table "
* file if all conditions are met.
*/
static struct json_object *ls3_stats_fprintf_dir_json_recursive(
+ struct ls3_stats_dir_general *d_stats,
struct ls3_stats_dir_obj *dir_ptr,
bool top_rating_only,
uint64_t *total_size,
struct json_object *jobj_dir_obj;
struct json_object *jobj_dir_child;
struct ls3_stats_dir_obj *child_ptr;
+ struct fstats_report *f_stats = d_stats->lsdg_files_report;
int i;
jobj_dir_obj = json_object_new_object();
}
if (dir_ptr->lsdo_depth >= 0 &&
- dir_ptr->lsdo_size >= dir_stats->lsdg_min_size_value_for_print &&
+ dir_ptr->lsdo_size >= d_stats->lsdg_min_size_value_for_print &&
!top_rating_only) {
uint64_t allocate_dir_size;
char fid_str[60];
snprintf(fid_str, sizeof(fid_str),
DFID_NOBRACE, PFID(&dir_ptr->lsdo_fid));
- if (dir_ptr->lsdo_fid.f_seq != 0) {
+ if (dir_ptr->lsdo_fid.f_seq != 0 && !f_stats->merging) {
int rc;
- rc = llapi_fid2path(reports_with_stats->client_mount_path,
+ rc = llapi_fid2path(f_stats->client_mount_path,
fid_str, path, PATH_MAX, NULL, NULL);
if (rc != 0)
llapi_error(LLAPI_MSG_ERROR, rc,
}
/* Trying to add a directory to the rating table */
- if (dir_stats->lsdg_top_size &&
- !(reports_with_stats->report_extension &
- LS3_STATS_FILE_EXTENSION_OUT)) {
- ls3_stats_insert_heap(dir_stats->lsdg_top_size, dir_ptr);
+ if (d_stats->lsdg_top_size &&
+ !(f_stats->report_extension & LS3_STATS_FILE_EXTENSION_OUT)) {
+ ls3_stats_insert_heap(d_stats->lsdg_top_size, dir_ptr);
}
/* We always have at least 10 pointers in stock dir_ptr->lsdo_child[] */
continue;
tmp_jobj_dir_obj =
- ls3_stats_fprintf_dir_json_recursive(child_ptr,
+ ls3_stats_fprintf_dir_json_recursive(d_stats, child_ptr,
top_rating_only,
total_size,
total_alloc_size);
return jobj_dir_obj;
}
-struct json_object *ls3_stats_fprintf_dirs_json(void)
+struct json_object *ls3_stats_fprintf_dirs_json(
+ struct ls3_stats_dir_general *d_stats)
{
+ struct fstats_report *d_fstats = d_stats->lsdg_files_report;
struct json_object *jobj_dirs_rating;
struct json_object *jobj_objects; /* Rating */
struct json_object *jobj_tree;
struct ls3_stats_dir_rating *heap;
uint64_t total_size;
uint64_t total_alloc_size;
- int extension = reports_with_stats->report_extension;
+ int extension = d_fstats->report_extension;
int i;
- if (!dir_stats)
+ if (!d_stats)
return NULL;
- if (!dir_stats->lsdg_start_dir)
+ if (!d_stats->lsdg_start_dir)
return NULL;
- ls3_stats_init_heap();
- if (!dir_stats->lsdg_top_size)
+ ls3_stats_init_heap(d_stats);
+ if (!d_stats->lsdg_top_size)
return NULL;
jobj_dirs_rating = json_object_new_object();
- jobj_tree = ls3_stats_fprintf_dir_json_recursive(
- dir_stats->lsdg_start_dir,
- false, &total_size,
- &total_alloc_size);
+ jobj_tree = ls3_stats_fprintf_dir_json_recursive(d_stats,
+ d_stats->lsdg_start_dir,
+ false, &total_size,
+ &total_alloc_size);
if (!(extension & LS3_STATS_FILE_EXTENSION_OUT))
- ls3_stats_heap_sort(dir_stats->lsdg_top_size);
+ ls3_stats_heap_sort(d_stats->lsdg_top_size);
- heap = dir_stats->lsdg_top_size;
+ heap = d_stats->lsdg_top_size;
jobj_objects = json_object_new_array();
if (!jobj_objects) {
json_object_put(jobj_dirs_rating);
snprintf(fid_str, sizeof(fid_str), DFID_NOBRACE,
PFID(&tmp_obj->lsdo_fid));
- if (tmp_obj->lsdo_fid.f_seq != 0) {
- rc = llapi_fid2path(reports_with_stats->client_mount_path,
+ if (tmp_obj->lsdo_fid.f_seq != 0 && !d_fstats->merging) {
+ rc = llapi_fid2path(d_fstats->client_mount_path,
fid_str, path, PATH_MAX,
NULL, NULL);
if (rc != 0)
}
json_object_object_add(jobj_dirs_rating, "SourceDirectory",
- json_object_new_string(dir_stats->lsdg_start_path));
+ json_object_new_string(d_stats->lsdg_start_path));
json_object_object_add(jobj_dirs_rating, "MaxDepth",
- json_object_new_int64(dir_stats->lsdg_max_depth));
+ json_object_new_int64(d_stats->lsdg_max_depth));
+
+ json_object_object_add(jobj_dirs_rating, "TopRatingLimit",
+ json_object_new_int(d_stats->lsdg_top_rating_limit));
json_object_object_add(jobj_dirs_rating, "TotalSizeBytes",
json_object_new_int64(total_size));
/* ls3_expand_num_of_dirs expanding the number of child directories
* for a directory in statistics.
*/
-static void ls3_expand_num_of_dirs(struct ls3_stats_dir_obj *dir_ptr)
+void ls3_expand_num_of_dirs(struct ls3_stats_dir_obj *dir_ptr)
{
struct ls3_stats_dir_obj **new_dirs_array;
unsigned int old_size = dir_ptr->lsdo_child_max;
/* ls3_stats_allocate_new_dir allocates memory for a new
* directory in statistics.
*/
-static struct ls3_stats_dir_obj
- *ls3_stats_allocate_new_dir(struct ls3_object_attrs *loa_all,
- char *dir_name, int depth)
+struct ls3_stats_dir_obj
+ *ls3_stats_allocate_new_dir(struct ls3_stats_dir_general *d_stats,
+ struct ls3_object_attrs *loa_all,
+ const char *dir_name, int depth)
{
struct ls3_stats_dir_obj *new_dir_ptr;
int rc;
if (!loa_all) /* skip first dir from ls3_stats_init_first_dir() */
return new_dir_ptr;
- dir_stats->lsdg_dirs_count++;
-
+ d_stats->lsdg_dirs_count++;
return new_dir_ptr;
}
* have attributes for the first directory.
*/
dir_stats->lsdg_start_dir =
- ls3_stats_allocate_new_dir(NULL,
+ ls3_stats_allocate_new_dir(dir_stats, NULL,
(last_slash ?
last_slash + 1 : tmp_path), -1);
free(tmp_path);
uint64_t current_index = 0;
int i;
- /* Check array with dir */
+ /* Check array with dir */
if ((*count) == 0 || (*dirs)[0] == NULL)
return; /* catalogs are out */
child_ptr = dir_ptr->lsdo_child[current_index];
if (child_ptr == NULL) {
- child_ptr = ls3_stats_allocate_new_dir(loa_all, (*dirs)[0],
+ child_ptr = ls3_stats_allocate_new_dir(dir_stats, loa_all,
+ (*dirs)[0],
dir_ptr->lsdo_depth + 1);
dir_ptr->lsdo_child[current_index] = child_ptr;
dir_ptr->lsdo_last_child = current_index;
if (rc != 0)
LS3_FATAL("failed to initialize mutex\n");
+ if (reports_with_stats)
+ /* Assign a pointer so don't have to reference the global
+ * variable in the rest of code.
+ */
+ dir_stats->lsdg_files_report = reports_with_stats;
+ else
+ LS3_FATAL("failed to get pointer for fstats_report\n");
+
}
static void ls3_stats_destroy_dirs(struct ls3_stats_dir_obj *dir_ptr)
free(dir_ptr);
}
-void ls3_stats_dir_destroy(void)
+void ls3_stats_dir_destroy(struct ls3_stats_dir_general *d_stats)
{
- if (dir_stats->lsdg_start_dir)
- ls3_stats_destroy_dirs(dir_stats->lsdg_start_dir);
+ if (d_stats->lsdg_start_dir)
+ ls3_stats_destroy_dirs(d_stats->lsdg_start_dir);
- if (dir_stats->lsdg_top_size) {
- free(dir_stats->lsdg_top_size->lsdr_array);
- free(dir_stats->lsdg_top_size);
+ if (d_stats->lsdg_top_size) {
+ free(d_stats->lsdg_top_size->lsdr_array);
+ free(d_stats->lsdg_top_size);
}
- pthread_mutex_destroy(&dir_stats->lsdg_mutex);
- if (dir_stats->lsdg_start_path)
- free(dir_stats->lsdg_start_path);
+ pthread_mutex_destroy(&d_stats->lsdg_mutex);
+ if (d_stats->lsdg_start_path)
+ free(d_stats->lsdg_start_path);
- free(dir_stats);
+ free(d_stats);
}