示例#1
0
int hlfs_take_snapshot(struct hlfs_ctrl *ctrl, const char *ssname) 
{
	//HLOG_DEBUG("enter func %s", __func__);
	//HLOG_DEBUG("create ssname is %s", ssname);
	if(ctrl == NULL || ssname ==NULL){
		HLOG_ERROR("parameter error!");
		return -1;
	}
	int ret = 0;
	if ((strlen(ssname) + 1) > HLFS_FILE_NAME_MAX) {
		HLOG_ERROR("error, snapshot name beyond max length!");
		return -1;
	}

	g_mutex_lock(ctrl->hlfs_access_mutex);
	if (ctrl->rw_inode_flag == 0) {
		HLOG_ERROR("error, snapshot can not take when readonly");
		g_mutex_unlock (ctrl->hlfs_access_mutex);
		return -1;
	}
	g_mutex_unlock (ctrl->hlfs_access_mutex);

	struct snapshot *_ss = NULL;
	if (0 == (ret=load_snapshot_by_name (ctrl->storage, \
					SNAPSHOT_FILE, &_ss, ssname))){
		HLOG_ERROR("snapshot %s is exist, use another snapshot name", \
				ssname);
		return -1;
	}else{
		HLOG_DEBUG("snapshot %s is not exist , create it ", ssname);
	}

	struct snapshot ss;
	memset(&ss, 0, sizeof(struct snapshot));
	ss.timestamp = get_current_time();
	g_strlcpy(ss.sname, ssname, strlen(ssname) + 1);
	g_mutex_lock(ctrl->hlfs_access_mutex);
	sprintf(ss.up_sname, "%s", ctrl->alive_ss_name);
	ss.inode_addr = ctrl->imap_entry.inode_addr;
	memset(ctrl->alive_ss_name, 0, MAX_FILE_NAME_LEN);
	sprintf(ctrl->alive_ss_name, "%s", ss.sname);
	g_mutex_unlock (ctrl->hlfs_access_mutex);

	ret = dump_alive_snapshot(ctrl->storage, ALIVE_SNAPSHOT_FILE, &ss);
	if (ret != 0) {
		HLOG_ERROR("dump snapshot alive error!");
		return -1;
	}
	ret = dump_snapshot(ctrl->storage, SNAPSHOT_FILE, &ss);
	if (ret != 0) {
		HLOG_ERROR("dump snapshot error!");
		return -1;
	}
	HLOG_INFO("Take Snapshot Succ- snapshot_name:%s,last_segno:%d, \
			last_offset:%d", ssname, ctrl->last_segno, ctrl->last_offset);
	return ret;
}
示例#2
0
int hlfs_open_by_snapshot(struct hlfs_ctrl *ctrl,
					const char* snapshot,
					int flag) {
	//HLOG_DEBUG("enter func %s", __func__);
	if (NULL == ctrl || NULL == snapshot) {
		HLOG_ERROR("Parameter Error!");
		return -1;
	}
	if ((strlen(snapshot) + 1) > HLFS_FILE_NAME_MAX) {
		HLOG_ERROR("snapshot name beyond max length");
		return -1;
	}
	int ret = 0;
	struct snapshot *ss = NULL;
	if (0 == ctrl->storage->bs_file_is_exist(ctrl->storage, SNAPSHOT_FILE)) {
		if (0 > (ret = load_snapshot_by_name(ctrl->storage, SNAPSHOT_FILE, &ss, snapshot))) {
			HLOG_ERROR("load ss by name error");
			g_free(ss);
			ret = -1;
			goto out;
		}
	} else {
		HLOG_ERROR("We have no snapshot at the moment");
		ret = -1;
		goto out;
	}
	struct inode *inode = load_inode(ctrl->storage,ss->inode_addr);
	if (inode == NULL) {
		HLOG_ERROR("load_inode error!");
		ret = -1;
		goto out;
	}

    memcpy(&(ctrl->inode), inode, sizeof(struct inode));
	g_free(inode);
    ctrl->imap_entry.inode_no = HLFS_INODE_NO;
    ctrl->imap_entry.inode_addr = ss->inode_addr;

	if (0 == flag) {
		ctrl->rw_inode_flag = 0;
	} else if (1 == flag) {
		ctrl->rw_inode_flag = 1;
	} else {
		HLOG_ERROR("the bad flag for hlfs open by inode");
		ret = -1;
	}
	memset(ctrl->alive_ss_name, 0, MAX_FILE_NAME_LEN);
	sprintf(ctrl->alive_ss_name, "%s", ss->sname);
    g_free(ss);
	ctrl->usage_ref += 1;
out:
	//HLOG_DEBUG("leave func %s", __func__);
	return ret;
}