# Buggy code
def _lock(self, op, timeout):
    """This takes a lock using POSIX locks (``fnctl.lockf``).

    The lock is implemented as a spin lock using a nonblocking
    call to lockf().

    On acquiring an exclusive lock, the lock writes this process's
    pid and host to the lock file, in case the holding process
    needs to be killed later.

    If the lock times out, it raises a ``LockError``.
    """
    start_time = time.time()
    while (time.time() - start_time) < timeout:
        try:
            # If this is already open read-only and we want to
            # upgrade to an exclusive write lock, close first.
            if self._fd is not None:
                flags = fcntl.fcntl(self._fd, fcntl.F_GETFL)
                if op == fcntl.LOCK_EX and flags | os.O_RDONLY:
                    os.close(self._fd)
                    self._fd = None

            if self._fd is None:
                mode = os.O_RDWR if op == fcntl.LOCK_EX else os.O_RDONLY
                self._fd = os.open(self._file_path, mode)

            fcntl.lockf(self._fd, op | fcntl.LOCK_NB)
            if op == fcntl.LOCK_EX:
                os.write(self._fd, "pid=%s,host=%s" % (os.getpid(), socket.getfqdn()))
            return

        except IOError as error:
            if error.errno == errno.EAGAIN or error.errno == errno.EACCES:
                pass
            else:
                raise
        time.sleep(_sleep_time)

    raise LockError("Timed out waiting for lock.")


# Traceback (KeyError)
==> Installing cactusext
==> openmpi is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/openmpi-2.0.0-5l3pomaqonrx3phvbm4kblzsms56ljtj
==> hwloc is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/hwloc-1.11.3-xgdwohjb2o26uftzaqtcmwf2ejxlhidw
==> git is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/git-2.8.1-jh72meyfuritl2wexqmckrshmufe7az4
==> papi is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/papi-5.4.3-tnovpyennp4cerqns4xnfscfvl6d3zlz
==> hdf5-blosc is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/hdf5-blosc-master-6m7xtyqubxsb2merc36i2oyhtdvno3zp
==> lmod is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/lmod-6.4.1-i2xu3l63aipam7bdlu3ig4eriqtjnbbd
==> hdf5 is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/hdf5-1.10.0-patch1-jfa4zar7ysebuadia7zlhoebrlaeo5lv
==> python is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/python-2.7.11-y6bfneoxof25qt6wgdsbfsra62grfdnz
==> lua is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/lua-5.3.2-xe6niqb4cwgkdpq33qjoi3rby3vcdnew
==> fftw is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/fftw-3.3.4-ojokm7aahpro46e4tvoqgsc57lzbfdum
==> openssl is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/openssl-1.0.2h-ookfh4fsbv5ijqjsewerc5vvf4hzfme6
==> julia is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/julia-master-bzqdzwekzl3geaeyuexssnelbnwfiwsf
Traceback (most recent call last):
File "/home/ux452368/comet/src/spack/bin/spack", line 179, in <module>
main()
File "/home/ux452368/comet/src/spack/bin/spack", line 157, in main
return_val = command(parser, args)
File "/home/ux452368/comet/src/spack/lib/spack/spack/cmd/install.py", line 91, in install
explicit=True)
File "/home/ux452368/comet/src/spack/lib/spack/spack/package.py", line 943, in do_install
run_tests=run_tests)
File "/home/ux452368/comet/src/spack/lib/spack/spack/package.py", line 1096, in do_install_dependencies
dep.package.do_install(**kwargs)
File "/home/ux452368/comet/src/spack/lib/spack/spack/package.py", line 925, in do_install
rec = spack.installed_db.get_record(self.spec)
File "/home/ux452368/comet/src/spack/lib/spack/spack/database.py", line 76, in converter
return function(self, spec_like, *args, **kwargs)
File "/home/ux452368/comet/src/spack/lib/spack/spack/database.py", line 461, in get_record
key = self._get_matching_spec_key(spec, **kwargs)
File "/home/ux452368/comet/src/spack/lib/spack/spack/database.py", line 456, in _get_matching_spec_key
raise KeyError("No such spec in database! %s" % spec)
KeyError: 'No such spec in database! julia@master%gcc@6.1.0-spack+binutils~cxx+hdf5+mpi~plot~python arch=linux-centos6-x86_64^binutils@2.25%gcc@6.1.0-spack+gold~krellpatch~libiberty arch=linux-centos6-x86_64^bzip2@1.0.6%gcc@6.1.0-spack arch=linux-centos6-x86_64^cmake@3.5.2%gcc@6.1.0-spack~doc+ncurses+openssl~qt arch=linux-centos6-x86_64^curl@7.49.1%gcc@6.1.0-spack arch=linux-centos6-x86_64^expat@2.1.0%gcc@6.1.0-spack arch=linux-centos6-x86_64^git@2.8.1%gcc@6.1.0-spack arch=linux-centos6-x86_64^hdf5@1.10.0-patch1%gcc@6.1.0-spack+cxx~debug+fortran+mpi+shared~szip~threadsafe arch=linux-centos6-x86_64^hwloc@1.11.3%gcc@6.1.0-spack arch=linux-centos6-x86_64^libpciaccess@0.13.4%gcc@6.1.0-spack arch=linux-centos6-x86_64^libsigsegv@2.10%gcc@6.1.0-spack arch=linux-centos6-x86_64^m4@1.4.17%gcc@6.1.0-spack+sigsegv arch=linux-centos6-x86_64^ncurses@6.0%gcc@6.1.0-spack arch=linux-centos6-x86_64^openmpi@2.0.0%gcc@6.1.0-spack~mxm~pmi~psm~psm2~slurm~sqlite3~thread_multiple~tm+verbs+vt arch=linux-centos6-x86_64^openssl@1.0.2h%gcc@6.1.0-spack arch=linux-centos6-x86_64^python@2.7.11%gcc@6.1.0-spack~ucs4 arch=linux-centos6-x86_64^readline@6.3%gcc@6.1.0-spack arch=linux-centos6-x86_64^sqlite@3.8.5%gcc@6.1.0-spack arch=linux-centos6-x86_64^zlib@1.2.8%gcc@6.1.0-spack arch=linux-centos6-x86_64'

# Fixed code
def _lock(self, op, timeout=_default_timeout):
    """This takes a lock using POSIX locks (``fnctl.lockf``).

    The lock is implemented as a spin lock using a nonblocking call
    to lockf().

    On acquiring an exclusive lock, the lock writes this process's
    pid and host to the lock file, in case the holding process needs
    to be killed later.

    If the lock times out, it raises a ``LockError``.
    """
    start_time = time.time()
    while (time.time() - start_time) < timeout:
        try:
            # If we could write the file, we'd have opened it 'r+'.
            # Raise an error when we attempt to upgrade to a write lock.
            if op == fcntl.LOCK_EX:
                if self._file and self._file.mode == "r":
                    raise LockError(
                        "Can't take exclusive lock on read-only file: %s" % self.path
                    )

            # Create file and parent directories if they don't exist.
            if self._file is None:
                self._ensure_parent_directory()

                # Prefer to open 'r+' to allow upgrading to write
                # lock later if possible.  Open read-only if we can't
                # write the lock file at all.
                os_mode, fd_mode = (os.O_RDWR | os.O_CREAT), "r+"
                if os.path.exists(self.path) and not os.access(self.path, os.W_OK):
                    os_mode, fd_mode = os.O_RDONLY, "r"

                fd = os.open(self.path, os_mode)
                self._file = os.fdopen(fd, fd_mode)

            # Try to get the lock (will raise if not available.)
            fcntl.lockf(
                self._file, op | fcntl.LOCK_NB, self._length, self._start, os.SEEK_SET
            )

            # All locks read the owner PID and host
            self._read_lock_data()

            # Exclusive locks write their PID/host
            if op == fcntl.LOCK_EX:
                self._write_lock_data()

            return

        except IOError as error:
            if error.errno == errno.EAGAIN or error.errno == errno.EACCES:
                pass
            else:
                raise
        time.sleep(_sleep_time)

    raise LockError("Timed out waiting for lock.")