ready to implement the main-side

This commit is contained in:
Ryo Nakamura
2024-02-17 13:25:07 +09:00
parent f71c7a145a
commit 2f9c2c0f10
4 changed files with 61 additions and 50 deletions

View File

@@ -228,16 +228,13 @@ static int checkpoint_load_meta(struct checkpoint_obj_hdr *hdr, char *remote, si
}
pr_debug("checkpoint: version %u", meta->version);
if (dir)
*dir = meta->direction;
if (remote) {
if (len < ntohs(hdr->len) - sizeof(*meta)) {
priv_set_errv("too short buffer");
return -1;
}
snprintf(remote, len, "%s", meta->remote);
if (len < ntohs(hdr->len) - sizeof(*meta)) {
priv_set_errv("too short buffer");
return -1;
}
snprintf(remote, len, "%s", meta->remote);
*dir = meta->direction;
pr_info("checkpoint: remote=%s direction=%s", meta->remote,
meta->direction == MSCP_DIRECTION_L2R ? "local-to-remote" :
meta->direction == MSCP_DIRECTION_R2L ? "remote-to-local" :
@@ -305,8 +302,8 @@ static int checkpoint_load_chunk(struct checkpoint_obj_hdr *hdr, pool *path_pool
return 0;
}
int checkpoint_load(const char *pathname, char *remote, size_t len, int *dir,
pool *path_pool, pool *chunk_pool)
static int checkpoint_load(const char *pathname, char *remote, size_t len, int *dir,
pool *path_pool, pool *chunk_pool)
{
char buf[CHECKPOINT_OBJ_MAXLEN];
struct checkpoint_obj_hdr *hdr;
@@ -323,10 +320,12 @@ int checkpoint_load(const char *pathname, char *remote, size_t len, int *dir,
while (checkpoint_read_obj(fd, buf, sizeof(buf)) == 0) {
switch (hdr->type) {
case OBJ_TYPE_META:
if (!remote || !dir)
break;
if (checkpoint_load_meta(hdr, remote, len, dir) < 0)
return -1;
if (!path_pool || !chunk_pool)
break;
goto out;
break;
case OBJ_TYPE_PATH:
if (!path_pool)
@@ -346,7 +345,18 @@ int checkpoint_load(const char *pathname, char *remote, size_t len, int *dir,
}
}
out:
close(fd);
return 0;
}
int checkpoint_load_remote(const char *pathname, char *remote, size_t len, int *dir)
{
return checkpoint_load(pathname, remote, len, dir, NULL, NULL);
}
int checkpoint_load_paths(const char *pathname, pool *path_pool, pool *chunk_pool)
{
return checkpoint_load(pathname, NULL, 0, NULL, path_pool, chunk_pool);
}

View File

@@ -7,10 +7,14 @@
int checkpoint_save(const char *pathname, int dir, char *remote_host, pool *path_pool,
pool *chunk_pool);
/* checkpoint_load() reads a checkpoint file (pathname). If path_pool
* and chunk_pool are NULL, This function fills only *remote and *dir.
/* checkpoint_load_meta() reads a checkpoint file (pathname) and returns
* remote host string to *remote and transfer direction to *dir.
*/
int checkpoint_load(const char *pathname, char *remote, size_t len, int *dir,
pool *path_pool, pool *chunk_pool);
int checkpoint_load_remote(const char *pathname, char *remote, size_t len, int *dir);
/* checkpoint_load_paths() reads a checkpoint file (pathname) and
* fills path_pool and chunk_pool.
*/
int checkpoint_load_paths(const char *pathname, pool *path_pool, pool *chunk_pool);
#endif /* _CHECKPOINT_H_ */

View File

@@ -492,34 +492,17 @@ int mscp_scan_join(struct mscp *m)
return 0;
}
int mscp_load_checkpoint(struct mscp *m, const char *pathname)
int mscp_checkpoint_get_remote(const char *pathname, char *remote, size_t len, int *dir)
{
size_t total_bytes = 0;
unsigned int idx;
struct chunk *c;
char remote[1024];
if (checkpoint_load(pathname, remote, sizeof(remote), &m->direction, m->path_pool,
m->chunk_pool) < 0)
return -1;
if (!(m->remote = strdup(remote))) {
priv_set_errv("malloc: %s", strerrno());
return -1;
}
pool_for_each(m->chunk_pool, c, idx) {
total_bytes += c->len;
}
m->total_bytes = total_bytes;
__sync_synchronize();
chunk_pool_set_ready(m, true);
return 0;
return checkpoint_load_remote(pathname, remote, len, dir);
}
int mscp_save_checkpoint(struct mscp *m, const char *pathname)
int mscp_checkpoint_load(struct mscp *m, const char *pathname)
{
return checkpoint_load_paths(pathname, m->path_pool, m->chunk_pool);
}
int mscp_checkpoint_save(struct mscp *m, const char *pathname)
{
return checkpoint_save(pathname, m->direction, m->remote, m->path_pool,
m->chunk_pool);