분산 식 저장 소 - 오픈 소스 소프트웨어 sheep dog 분석 기록
sheep dog 의 가장 핵심 적 인 알고리즘 과 실현 방향 을 기록 하 였 습 니 다.
//sheep
#define main_thread(type) struct { type __val; }
-----------------------------------------------------------------------
md.c
========================================================================
struct disk {
char path[PATH_MAX]; /* */
uint16_t nr_vdisks;
uint64_t space;
};
struct vdisk {
uint16_t idx;
uint64_t id;
};
#define MD_MAX_DISK 64
#define MD_DEFAULT_VDISKS 128
#define MD_MAX_VDISK (MD_MAX_DISK * MD_DEFAULT_VDISKS)
static struct disk md_disks[MD_MAX_DISK];
static struct vdisk md_vds[MD_MAX_VDISK];
static int md_nr_disks; /* Protected by md_lock ( )*/
static int md_nr_vds; /* vdisk
/* vdisk
uint64_t md_init_space(void)
{
...
calculate_vdisks(md_disks, md_nr_disks, total); vdisk
md_nr_vds = disks_to_vdisks(md_disks, md_nr_disks, md_vds);
...
}
/* vdisk ?
static inline int disks_to_vdisks(struct disk *ds, int nmds, struct vdisk *vds)
{
struct disk *d_iter = ds;
int i, j, nr_vdisks = 0;
uint64_t hval;
while (nmds--) {
hval = FNV1A_64_INIT;
for (i = 0; i < d_iter->nr_vdisks; i++) {
hval = fnv_64a_buf(&nmds, sizeof(nmds), hval);
for (j = strlen(d_iter->path) - 1; j >= 0; j--)
hval = fnv_64a_buf(&d_iter->path[j], 1, hval);
vds[nr_vdisks].id = hval;
vds[nr_vdisks].idx = d_iter - ds;
nr_vdisks++;
}
d_iter++;
}
xqsort(vds, nr_vdisks, vdisk_cmp);
return nr_vdisks;
}
/*oid vdisk,
static inline struct vdisk *oid_to_vdisk(uint64_t oid)
{
return oid_to_vdisk_from(md_vds, md_nr_vds, oid);
}
/* , oid vdisk (nr=md_nr_vds,vds=md_vds)*/
static struct vdisk *oid_to_vdisk_from(struct vdisk *vds, int nr, uint64_t oid)
{
uint64_t id = fnv_64a_buf(&oid, sizeof(oid), FNV1A_64_INIT);
int start, end, pos;
start = 0;
end = nr - 1;
if (id > vds[end].id || id < vds[start].id)
return &vds[start];
for (;;) {
pos = (end - start) / 2 + start;
if (vds[pos].id < id) {
if (vds[pos + 1].id >= id)
return &vds[pos + 1];
start = pos;
} else
end = pos;
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
group.c
=====================================================================================================
#define SD_DEFAULT_VNODES 64
#define SD_NODE_SIZE 56
/*
struct sd_node {
struct node_id nid;
uint16_t nr_vnodes;
uint32_t zone; /* use last 4 bytes as zone id
uint8_t *b = sys->this_node.nid.addr + 12;
sys->this_node.zone = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24 */
uint64_t space;
};
/*
struct sd_vnode {
struct node_id nid;
uint16_t node_idx;
uint32_t zone;
uint64_t id;
};
struct vnode_info {
struct sd_vnode vnodes[SD_MAX_VNODES];
int nr_vnodes;
struct sd_node nodes[SD_MAX_NODES];
int nr_nodes;
int nr_zones;
refcnt_t refcnt;
};
/* , vnode, vnode
struct vnode_info *alloc_vnode_info(const struct sd_node *nodes,
size_t nr_nodes)
{
...
recalculate_vnodes(vnode_info->nodes, nr_nodes);
vnode_info->nr_vnodes = nodes_to_vnodes(vnode_info->nodes, nr_nodes,
vnode_info->vnodes);
vnode_info->nr_zones = get_zones_nr_from(nodes, nr_nodes);
refcount_set(&vnode_info->refcnt, 1);
return vnode_info;
}
/* vnode , 64 ( recalculate_vnodes SD_DEFAULT_VNODES )
static inline int nodes_to_vnodes(struct sd_node *nodes, int nr,
struct sd_vnode *vnodes)
{
struct sd_node *n = nodes;
int i, j, nr_vnodes = 0;
uint64_t hval;
while (nr--) {
hval = FNV1A_64_INIT;
for (i = 0; i < n->nr_vnodes; i++) {
if (vnodes) {
hval = fnv_64a_buf(&n->nid.port, sizeof(n->nid.port), hval);
for (j = ARRAY_SIZE(n->nid.addr) - 1; j >= 0; j--)
hval = fnv_64a_buf(&n->nid.addr[j], 1, hval);
vnodes[nr_vnodes].id = hval;
memcpy(vnodes[nr_vnodes].nid.addr, n->nid.addr, sizeof(n->nid.addr));
vnodes[nr_vnodes].nid.port = n->nid.port;
vnodes[nr_vnodes].node_idx = n - nodes;
vnodes[nr_vnodes].zone = n->zone;
}
nr_vnodes++;
}
n++;
}
if (vnodes)
xqsort(vnodes, nr_vnodes, vnode_cmp);
return nr_vnodes;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.