[Devel] [PATCH 3/6] ext4defrag2: improve statistics configuration
Dmitry Monakhov
dmonakhov at openvz.org
Mon May 16 04:53:33 PDT 2016
Signed-off-by: Dmitry Monakhov <dmonakhov at openvz.org>
---
misc/e4defrag2.c | 85 +++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 65 insertions(+), 20 deletions(-)
diff --git a/misc/e4defrag2.c b/misc/e4defrag2.c
index 9206c89..0ca7a63 100644
--- a/misc/e4defrag2.c
+++ b/misc/e4defrag2.c
@@ -218,6 +218,10 @@ enum debug_flags {
DBG_FIEMAP = 0x20,
DBG_BITMAP = 0x40,
DBG_ERR = 0x80,
+ DBG_CLUSTER = 0x100,
+ DBG_TAG = 0x200,
+ DBG_IAF = 0x400,
+ DBG_IEF = 0x800,
};
/* The following macro is used for ioctl FS_IOC_FIEMAP
@@ -903,7 +907,7 @@ static int group_add_ief_candidate(struct defrag_context *dfx, int dirfd, const
fhp->handle_bytes = dfx->root_fhp->handle_bytes;
ret = name_to_handle_at(dirfd, name, fhp, &mnt, 0);
if (ret) {
- if (debug_flag & DBG_SCAN)
+ if (debug_flag & (DBG_SCAN|DBG_IEF))
fprintf(stderr, "Unexpected result from name_to_handle_at()\n");
goto free_fh;
}
@@ -916,7 +920,7 @@ static int group_add_ief_candidate(struct defrag_context *dfx, int dirfd, const
if (insert_fhandle(&dfx->group[group]->fh_root, &rbfh->node)) {
/* Inode is already in the list, likely nlink > 1 */
- if (debug_flag & DBG_SCAN)
+ if (debug_flag & (DBG_SCAN|DBG_IEF))
fprintf(stderr, "File is already in the list, nlink > 1,"
" Not an error\n");
ext2fs_free_mem(&rbfh);
@@ -1127,8 +1131,10 @@ static int scan_inode_pass3(struct defrag_context *dfx, int fd,
goto out;
group_add_dircache(dfx, dirfd, &dst, ".");
- do_iaf_defrag_one(dfx, dirfd, name, stat, fec, &fest);
- goto out;
+ ret = do_iaf_defrag_one(dfx, dirfd, name, stat, fec, &fest);
+ if (!ret)
+ goto out;
+
}
if (stat->st_mtime < older_than)
@@ -1171,6 +1177,12 @@ static int scan_inode_pass3(struct defrag_context *dfx, int fd,
ino_flags |= SP_FL_LOCAL;
if (ief_blocks || tp_blocks) {
+ if (debug_flag & DBG_SCAN && ief_blocks != size_blk)
+ printf("%s ENTER %lu to IEF set ief:%lld "
+ "size_blk:%lld used_blk:%lld\n",
+ __func__, stat->st_ino, ief_blocks,
+ size_blk, used_blk);
+
/*
* Even if some extents belong to IEF cluster, it is not a good
* idea to relocate the whole file. From other point of view,
@@ -1201,11 +1213,17 @@ static int scan_inode_pass3(struct defrag_context *dfx, int fd,
__func__, stat->st_ino, ief_blocks,
size_blk, used_blk);
}
+ if (debug_flag & DBG_SCAN && ief_blocks != size_blk)
+ printf("%s ENTER %lu to IEF set ief:%lld "
+ "size_blk:%lld used_blk:%lld fl:%lx\n",
+ __func__, stat->st_ino, ief_blocks,
+ size_blk, used_blk, ino_flags);
+
}
if (ino_flags & SP_FL_IEF_RELOC) {
struct stat dst;
- struct rb_fhandle *rbfh;
+ struct rb_fhandle *rbfh = NULL;
/* FIXME: Is it any better way to find directory inode num? */
ret = fstat(dirfd, &dst);
if (!ret && ino_grp == e4d_group_of_ino(dfx, dst.st_ino))
@@ -1456,7 +1474,7 @@ static int ief_defrag_prep_one(struct defrag_context *dfx, dgrp_t group,
if (fhandle->flags & SP_FL_LOCAL)
dfx->group[group]->ief_local++;
- if (debug_flag & DBG_SCAN)
+ if (debug_flag & (DBG_SCAN | DBG_IEF))
printf("%s Check inode %lu flags:%x, OK...\n",
__func__, stat->st_ino, fhandle->flags);
@@ -1603,7 +1621,9 @@ static void pass3_prep(struct defrag_context *dfx)
__u64 clusters_to_move = 0;
unsigned used = 0;
unsigned good = 0;
+ unsigned mdata = 0;
unsigned count = 0;
+ unsigned found = 0;
unsigned ief_ok = 0;
unsigned force_reloc = 0;
@@ -1620,7 +1640,7 @@ static void pass3_prep(struct defrag_context *dfx)
ex->flags |= SP_FL_FULL;
cluster = (ex->start + ex->count) & cluster_mask;
- if (debug_flag & DBG_TREE)
+ if (debug_flag & DBG_CLUSTER)
print_spex("\t\t\t", ex);
if (prev_cluster != cluster) {
@@ -1645,7 +1665,7 @@ static void pass3_prep(struct defrag_context *dfx)
se->flags |= SP_FL_IEF_RELOC;
if (force_reloc)
se->flags |= SP_FL_TP_RELOC;
- if (debug_flag & DBG_TREE)
+ if (debug_flag & DBG_CLUSTER)
print_spex("\t\t\t->IEF", se);
ext_to_move++;
blocks_to_move += se->count;
@@ -1654,19 +1674,28 @@ static void pass3_prep(struct defrag_context *dfx)
}
clusters_to_move++;
}
- if (debug_flag & DBG_TREE)
- printf("Cluster %lld %lld] group:%ld stats {count:%d used:%d good:%d ief:%d}\n",
- prev_cluster, prev_cluster + dfx->cluster_size,
+ if (debug_flag & DBG_CLUSTER)
+ printf("Cluster %lld %lld] group:%ld stats "
+ "{count:%d used:%d good:%d found:%d "
+ "mdata:%u ief:%d force_reloc:%d}\n",
+ prev_cluster,
+ prev_cluster + dfx->cluster_size,
e4d_group_of_blk(dfx, prev_cluster),
- count, used, good, ief_ok);
+ count, used, good, found, mdata,
+ ief_ok, force_reloc);
good = 0;
count = 0;
used = 0;
+ found = 0;
+ mdata = 0;
cluster_node = node;
prev_cluster = cluster;
}
count++;
used += ex->count;
+ found += ex->found;
+ mdata += ex->dir_extents;
+
if (ex->flags & SP_FL_GOOD && !(ex->flags & SP_FL_IGNORE))
good++;
}
@@ -1960,6 +1989,9 @@ static int do_defrag_one(struct defrag_context *dfx, int fd, struct stat64 *sta
assert(donor->length >= eof_lblk);
+ if (debug_flag & (DBG_RT | DBG_IEF| DBG_IAF))
+ printf("%s perform inode:%ld\n", __func__, stat->st_ino);
+
if (dfx->ro_fs) {
if (debug_flag & DBG_RT)
printf("Fileystem is readonly, skip actual defrag");
@@ -1999,7 +2031,13 @@ static int do_defrag_one(struct defrag_context *dfx, int fd, struct stat64 *sta
donor->length -= moved;
donor->offset += moved;
-
+ if (debug_flag & (DBG_RT | DBG_IAF | DBG_IEF))
+ printf("%s inode:%lld start:%lld eof:%lld donor [%lld, %lld] ret:%d\n",
+ __func__, (unsigned long long)stat->st_ino,
+ (unsigned long long)fec->fec_map[0].pblk,
+ (unsigned long long)eof_lblk,
+ (unsigned long long)donor->offset,
+ (unsigned long long)donor->length, ret);
return ret;
}
/*
@@ -2022,20 +2060,20 @@ static int do_iaf_defrag_one(struct defrag_context *dfx, int dirfd, const char *
/* Need to reopen file for RW */
fd = openat(dirfd, name, O_RDWR);
if (fd < 0) {
- if (debug_flag & DBG_RT)
+ if (debug_flag & (DBG_RT|DBG_IAF))
fprintf(stderr, "%s: can not open candidate\n", __func__);
return 0;
}
if (fstat64(fd, &st2)) {
- if (debug_flag & DBG_RT)
+ if (debug_flag & (DBG_RT|DBG_IAF))
fprintf(stderr, "%s: stat failed err:%d\n", __func__,
errno);
goto out_fd;
}
if (st2.st_ino != stat->st_ino) {
- if (debug_flag & DBG_RT)
+ if (debug_flag & (DBG_RT|DBG_IAF))
fprintf(stderr, "%s: Race while reopen\n", __func__);
goto out_fd;
}
@@ -2050,26 +2088,26 @@ static int do_iaf_defrag_one(struct defrag_context *dfx, int dirfd, const char *
*/
force_local = eof_lblk < 4;
- if (debug_flag & DBG_SCAN) {
+ if (debug_flag & (DBG_SCAN|DBG_IAF)) {
int i;
printf("%s ENTER inode:%ld eof:%llu force_local:%d frag:%u local_ex:%u\n",
__func__, stat->st_ino, (unsigned long long) eof_lblk,
force_local, fest->frag, fest->local_ex);
for (i = 0; i < fec->fec_extents; i++)
- printf("%u [%u, %u] -> %llu [%u, %u]\n",
+ printf("%u [%u, %u] -> %llu\n",
i, fec->fec_map[i].lblk, fec->fec_map[i].len,
fec->fec_map[i].pblk);
}
ret = prepare_donor(dfx, ino_grp, &donor, eof_lblk, force_local, fest->frag / 2);
if (ret) {
- if (debug_flag & DBG_SCAN)
+ if (debug_flag & (DBG_SCAN|DBG_IAF))
fprintf(stderr, "%s: group:%u Can not allocate donor"
" file\n", __func__, ino_grp);
goto out_fd;
}
- if (debug_flag & DBG_SCAN) {
+ if (debug_flag & (DBG_SCAN|DBG_IAF)) {
int i;
printf("%s FOUND DONOR inode:%ld eof:%llu force_local:%d frag:%u local_ex:%u\n",
__func__, stat->st_ino, (unsigned long long) eof_lblk,
@@ -2121,6 +2159,7 @@ static int do_ief_defrag_one(struct defrag_context *dfx, dgrp_t group,
struct fmap_extent_cache *fec = NULL;
assert(rfh->flags & SP_FL_FMAP);
+
fd = do_open_fhandle(dfx, rfh, O_RDWR);
if (fd < 0) {
/* Propably file was unlinked, renamed "
@@ -2156,6 +2195,12 @@ static int do_ief_defrag_one(struct defrag_context *dfx, dgrp_t group,
defrag_fadvise(fd, 0 , eof_lblk << dfx->blocksize_bits, 1);
ret = do_defrag_one(dfx, fd, &st, fec, &fest, eof_lblk, donor);
+
+ if (debug_flag & (DBG_RT| DBG_IEF))
+ printf("%s process inode %lu flags:%x, ret:%d\n",
+ __func__, st.st_ino, rfh->flags, ret);
+
+
if (!ret) {
dfx->group[group]->ief_inodes++;
dfx->group[group]->ief_blocks += st.st_size >> dfx->blocksize_bits;
--
1.7.1
More information about the Devel
mailing list