コード例 #1
0
ファイル: os_fhandle.c プロジェクト: Machyne/mongo
/*
 * __wt_open --
 *	Open a file handle.
 */
int
__wt_open(WT_SESSION_IMPL *session,
    const char *name, WT_FS_OPEN_FILE_TYPE file_type, u_int flags, WT_FH **fhp)
{
	WT_CONNECTION_IMPL *conn;
	WT_DECL_RET;
	WT_FH *fh;
	WT_FILE_SYSTEM *file_system;
	bool lock_file, open_called;
	char *path;

	WT_ASSERT(session, file_type != 0);	/* A file type is required. */

	conn = S2C(session);
	file_system = conn->file_system;
	fh = NULL;
	open_called = false;
	path = NULL;

	WT_RET(__open_verbose(session, name, file_type, flags));

	/* Check if the handle is already open. */
	if (__handle_search(session, name, NULL, &fh)) {
		*fhp = fh;
		return (0);
	}

	/* Allocate and initialize the handle. */
	WT_ERR(__wt_calloc_one(session, &fh));
	WT_ERR(__wt_strdup(session, name, &fh->name));

	/*
	 * If this is a read-only connection, open all files read-only except
	 * the lock file.
	 *
	 * The only file created in read-only mode is the lock file.
	 */
	if (F_ISSET(conn, WT_CONN_READONLY)) {
		lock_file = strcmp(name, WT_SINGLETHREAD) == 0;
		if (!lock_file)
			LF_SET(WT_FS_OPEN_READONLY);
		WT_ASSERT(session, lock_file || !LF_ISSET(WT_FS_OPEN_CREATE));
	}

	/* Create the path to the file. */
	if (!LF_ISSET(WT_FS_OPEN_FIXED))
		WT_ERR(__wt_filename(session, name, &path));

	/* Call the underlying open function. */
	WT_ERR(file_system->fs_open_file(file_system, &session->iface,
	    path == NULL ? name : path, file_type, flags, &fh->handle));
	open_called = true;

	WT_ERR(__fhandle_method_finalize(
	    session, fh->handle, LF_ISSET(WT_FS_OPEN_READONLY)));

	/*
	 * Repeat the check for a match: if there's no match, link our newly
	 * created handle onto the database's list of files.
	 */
	if (__handle_search(session, name, fh, fhp)) {
err:		if (open_called)
			WT_TRET(fh->handle->close(
			    fh->handle, (WT_SESSION *)session));
		if (fh != NULL) {
			__wt_free(session, fh->name);
			__wt_free(session, fh);
		}
	}

	__wt_free(session, path);
	return (ret);
}
コード例 #2
0
ファイル: os_fhandle.c プロジェクト: ralic/mongo
/*
 * __wt_open --
 *	Open a file handle.
 */
int
__wt_open(WT_SESSION_IMPL *session,
          const char *name, uint32_t file_type, uint32_t flags, WT_FH **fhp)
{
    WT_CONNECTION_IMPL *conn;
    WT_DECL_RET;
    WT_FH *fh;
    bool lock_file, open_called;
    char *path;

    WT_ASSERT(session, file_type != 0);	/* A file type is required. */

    conn = S2C(session);
    fh = NULL;
    open_called = false;
    path = NULL;

    WT_RET(__open_verbose(session, name, file_type, flags));

    /* Check if the handle is already open. */
    if (__wt_handle_search(session, name, true, NULL, &fh)) {
        /*
         * XXX
         * The in-memory implementation has to reset the file offset
         * when a file is re-opened (which obviously also depends on
         * in-memory configurations never opening a file in more than
         * one thread at a time). This needs to be fixed.
         */
        if (F_ISSET(fh, WT_FH_IN_MEMORY) && fh->ref == 1)
            fh->off = 0;
        *fhp = fh;
        return (0);
    }

    /* Allocate a structure and set the name. */
    WT_ERR(__wt_calloc_one(session, &fh));
    WT_ERR(__wt_strdup(session, name, &fh->name));

    /*
     * If this is a read-only connection, open all files read-only except
     * the lock file.
     *
     * The only file created in read-only mode is the lock file.
     */
    if (F_ISSET(conn, WT_CONN_READONLY)) {
        lock_file = strcmp(name, WT_SINGLETHREAD) == 0;
        if (!lock_file)
            LF_SET(WT_OPEN_READONLY);
        WT_ASSERT(session, lock_file || !LF_ISSET(WT_OPEN_CREATE));
    }

    /* Create the path to the file. */
    if (!LF_ISSET(WT_OPEN_FIXED))
        WT_ERR(__wt_filename(session, name, &path));

    /* Call the underlying open function. */
    WT_ERR(conn->handle_open(
               session, fh, path == NULL ? name : path, file_type, flags));
    open_called = true;

    /*
     * Repeat the check for a match: if there's no match, link our newly
     * created handle onto the database's list of files.
     */
    if (__wt_handle_search(session, name, true, fh, fhp)) {
err:
        if (open_called)
            WT_TRET(fh->fh_close(session, fh));
        if (fh != NULL) {
            __wt_free(session, fh->name);
            __wt_free(session, fh);
        }
    }

    __wt_free(session, path);
    return (ret);
}