Example #1
0
static int farm_snapshot(const struct siocb *iocb)
{
	unsigned char snap_sha1[SHA1_LEN];
	unsigned char trunk_sha1[SHA1_LEN];
	struct sd_node nodes[SD_MAX_NODES];
	int nr_nodes;
	void *buffer;
	int log_nr, ret = SD_RES_EIO, epoch;

	buffer = snap_log_read(&log_nr);
	if (!buffer)
		goto out;

	epoch = log_nr + 1;
	sd_dprintf("user epoch %d", epoch);

	nr_nodes = epoch_log_read(sys->epoch, nodes, sizeof(nodes));
	if (nr_nodes < 0)
		goto out;

	if (trunk_file_write(trunk_sha1) < 0)
		goto out;

	if (snap_file_write(sys->epoch, nodes, nr_nodes,
			    trunk_sha1, snap_sha1) < 0)
		goto out;

	if (snap_log_write(epoch, snap_sha1) < 0)
		goto out;

	ret = SD_RES_SUCCESS;
out:
	free(buffer);
	return ret;
}
Example #2
0
static int farm_snapshot(struct siocb *iocb)
{
    unsigned char snap_sha1[SHA1_LEN];
    unsigned char trunk_sha1[SHA1_LEN];
    void *buffer;
    int log_nr, ret = SD_RES_EIO, epoch;

    buffer = snap_log_read(&log_nr, 1);
    if (!buffer)
        goto out;

    epoch = log_nr + 1;
    dprintf("user epoch %d\n", epoch);
    if (trunk_file_write(trunk_sha1, 1) < 0)
        goto out;

    if (snap_file_write(epoch, trunk_sha1, snap_sha1, 1) < 0)
        goto out;

    if (snap_log_write(epoch, snap_sha1, 1) < 0)
        goto out;

    ret = SD_RES_SUCCESS;
out:
    free(buffer);
    return ret;
}
Example #3
0
static int farm_cleanup_sys_obj(struct siocb *iocb)
{
    int i, ret = SD_RES_SUCCESS;
    int epoch = iocb->epoch;
    struct snap_log *log_pos, *log_free = NULL;
    int nr_logs;

    if (iocb->epoch <= 0)
        return ret;

    for (i = 1; i <= epoch; i++)
        cleanup_trunk(i);

    log_free = log_pos = snap_log_read(&nr_logs, 0);
    if (snap_log_truncate() < 0) {
        dprintf("snap reset fail\n");
        ret = SD_RES_EIO;
        goto out;
    }

    for (i = epoch + 1; i < nr_logs; i++, log_pos++) {
        if (snap_log_write(log_pos->epoch, log_pos->sha1, 0) < 0) {
            dprintf("snap write fail %d, %s\n",
                    log_pos->epoch, sha1_to_hex(log_pos->sha1));
            ret = SD_RES_EIO;
            goto out;
        }
    }

out:
    free(log_free);
    return ret;
}
Example #4
0
static int farm_end_recover(struct siocb *iocb)
{
    unsigned char snap_sha1[SHA1_LEN];
    unsigned char trunk_sha1[SHA1_LEN];
    int epoch = iocb->epoch - 1;

    if (epoch == 0)
        return SD_RES_SUCCESS;
    dprintf("epoch %d\n", epoch);
    if (trunk_file_write_recovery(trunk_sha1) < 0)
        return SD_RES_EIO;

    if (snap_file_write(epoch, trunk_sha1, snap_sha1, 0) < 0)
        return SD_RES_EIO;

    if (snap_log_write(iocb->epoch - 1, snap_sha1, 0) < 0)
        return SD_RES_EIO;

    return SD_RES_SUCCESS;
}
Example #5
0
File: farm.c Project: yamt/sheepdog
static int farm_end_recover(uint32_t old_epoch,
		struct vnode_info *old_vnode_info)
{
	unsigned char snap_sha1[SHA1_LEN];
	unsigned char trunk_sha1[SHA1_LEN];

	if (old_epoch == 0)
		return SD_RES_SUCCESS;

	dprintf("old epoch %d\n", old_epoch);

	if (trunk_file_write_recovery(trunk_sha1) < 0)
		return SD_RES_EIO;

	if (snap_file_write(old_epoch, old_vnode_info->nodes,
			    old_vnode_info->nr_nodes, trunk_sha1,
			    snap_sha1) < 0)
		return SD_RES_EIO;

	if (snap_log_write(old_epoch, snap_sha1, 0) < 0)
		return SD_RES_EIO;

	return SD_RES_SUCCESS;
}