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) */ };
gluster代码碎片
最新推荐文章于 2024-07-13 15:17:36 发布