inode_table_dump (inode_table_t *itable, char *prefix)
{
char key[GF_DUMP_MAX_BUF_LEN];
int ret = 0;
if (!itable)
return;
memset(key, 0, sizeof(key));
ret = pthread_mutex_trylock(&itable->lock);
if (ret != 0) {
return;
}
gf_proc_dump_build_key(key, prefix, "hashsize");
gf_proc_dump_write(key, "%d", itable->hashsize);
gf_proc_dump_build_key(key, prefix, "name");
gf_proc_dump_write(key, "%s", itable->name);
gf_proc_dump_build_key(key, prefix, "lru_limit");
gf_proc_dump_write(key, "%d", itable->lru_limit);
gf_proc_dump_build_key(key, prefix, "active_size");
gf_proc_dump_write(key, "%d", itable->active_size);
gf_proc_dump_build_key(key, prefix, "lru_size");
gf_proc_dump_write(key, "%d", itable->lru_size);
gf_proc_dump_build_key(key, prefix, "purge_size");
gf_proc_dump_write(key, "%d", itable->purge_size);
INODE_DUMP_LIST(&itable->active, key, prefix, "active");
INODE_DUMP_LIST(&itable->lru, key, prefix, "lru");
INODE_DUMP_LIST(&itable->purge, key, prefix, "purge");
pthread_mutex_unlock(&itable->lock);
}
int
gf_proc_dump_write (char *key, char *value,...)
{
//调用形式:gf_proc_dump_write("gfid", "%s", uuid_utoa (inode->gfid));
char buf[GF_DUMP_MAX_BUF_LEN];//申请一个4096字节的buf
int offset = 0;//偏移量offset
va_list ap;//参数指针
GF_ASSERT (key);
offset = strlen (key);
memset (buf, 0, GF_DUMP_MAX_BUF_LEN);//缓存区初始化
snprintf (buf, GF_DUMP_MAX_BUF_LEN, "%s", key);//把gfid以%s的形式打包到buf中去
snprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, "=");//再打包一个=进去
offset += 1;//等号=占一位,所以要偏移量要加上一位
va_start (ap, value);//参数指针指向value。即从value开始
vsnprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, value, ap);//打包value
va_end (ap);
offset = strlen (buf);
snprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, "\n");
return write (gf_dump_fd, buf, strlen (buf));
}
#define INODE_DUMP_LIST(head, key_buf, key_prefix, list_type) \
{ \
int i = 1; \
inode_t *inode = NULL; \
list_for_each_entry (inode, head, list) { \
gf_proc_dump_build_key(key_buf, key_prefix, \
"%s.%d",list_type, i++); \
gf_proc_dump_add_section(key_buf); \
inode_dump(inode, key); \
} \
}
inode_dump (inode_t *inode, char *prefix)
{
int ret = -1;
xlator_t *xl = NULL;
int i = 0;
fd_t *fd = NULL;
struct _inode_ctx *inode_ctx = NULL;
struct list_head fd_list;
if (!inode)
return;
INIT_LIST_HEAD (&fd_list);
ret = TRY_LOCK(&inode->lock);
if (ret != 0) {
return;
}
{
gf_proc_dump_write("gfid", "%s", uuid_utoa (inode->gfid));
gf_proc_dump_write("nlookup", "%ld", inode->nlookup);
gf_proc_dump_write("ref", "%u", inode->ref);
gf_proc_dump_write("ia_type", "%d", inode->ia_type);
if (inode->_ctx) {
inode_ctx = GF_CALLOC (inode->table->xl->graph->xl_count,
sizeof (*inode_ctx),
gf_common_mt_inode_ctx);
if (inode_ctx == NULL) {
goto unlock;
}
for (i = 0; i < inode->table->xl->graph->xl_count; i++) {
inode_ctx[i] = inode->_ctx[i];
}
}
if (dump_options.xl_options.dump_fdctx != _gf_true)
goto unlock;
list_for_each_entry (fd, &inode->fd_list, inode_list) {
fd_ctx_dump (fd, prefix);
}
}
unlock:
UNLOCK(&inode->lock);
if (inode_ctx && (dump_options.xl_options.dump_inodectx == _gf_true)) {
for (i = 0; i < inode->table->xl->graph->xl_count; i++) {
if (inode_ctx[i].xl_key) {
xl = (xlator_t *)(long)inode_ctx[i].xl_key;
if (xl->dumpops && xl->dumpops->inodectx)
xl->dumpops->inodectx (xl, inode);
}
}
}
if (inode_ctx != NULL) {
GF_FREE (inode_ctx);
}
return;
}
struct _inode {
inode_table_t *table; /* the table this inode belongs to */
uuid_t gfid;
gf_lock_t lock;
uint64_t nlookup;
uint32_t ref; /* reference count on this inode */
ia_type_t ia_type; /* what kind of file */
struct list_head fd_list; /* list of open files on this inode */
struct list_head dentry_list; /* list of directory entries for this inode */
struct list_head hash; /* hash table pointers */
struct list_head list; /* active/lru/purge */
struct _inode_ctx *_ctx; /* replacement for dict_t *(inode->ctx) */
};