Пример #1
0
static int get_trunk_sha1(uint32_t epoch, unsigned char *outsha1)
{
	int i, nr_logs = -1, ret = -1;
	struct snap_log *log_buf, *log_free = NULL;
	void *snap_buf = NULL;
	struct sha1_file_hdr hdr;

	log_free = log_buf = snap_log_read(&nr_logs);
	sd_dprintf("%d", nr_logs);
	if (nr_logs < 0)
		goto out;

	for (i = 0; i < nr_logs; i++, log_buf++) {
		if (log_buf->epoch != epoch)
			continue;
		snap_buf = snap_file_read(log_buf->sha1, &hdr);
		if (!snap_buf)
			goto out;
		memcpy(outsha1, snap_buf, SHA1_LEN);
		ret = 0;
		break;
	}
out:
	free(log_free);
	free(snap_buf);
	return ret;
}
Пример #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;
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
0
static int farm_get_snap_file(struct siocb *iocb)
{
	int ret = SD_RES_EIO;
	void *buffer = NULL;
	size_t size;
	int nr;

	sd_dprintf("try get snap file");
	buffer = snap_log_read(&nr);
	if (!buffer)
		goto out;
	size = nr * sizeof(struct snap_log);
	memcpy(iocb->buf, buffer, size);
	iocb->length = size;
	ret = SD_RES_SUCCESS;
out:
	free(buffer);
	return ret;
}