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; }
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; }
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; }
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; }
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; }