All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: "Fam Zheng" <fam@euphon.net>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Stefan Markovic" <smarkovic@wavecomp.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Claudio Fontana" <claudio.fontana@huawei.com>,
	qemu-devel@nongnu.org,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Aleksandar Rikalo" <arikalo@wavecomp.com>,
	qemu-s390x@nongnu.org, "Aurelien Jarno" <aurelien@aurel32.net>,
	"Aleksandar Markovic" <amarkovic@wavecomp.com>,
	"Cleber Rosa" <crosa@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Caio Carrara" <ccarrara@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 15/18] Boot Linux Console Test: add a test for aarch64 + virt
Date: Mon, 10 Jun 2019 09:53:03 +0100	[thread overview]
Message-ID: <20190610085303.GA7809@redhat.com> (raw)
In-Reply-To: <20190607185857.GD22416@habkost.net>

On Fri, Jun 07, 2019 at 03:58:57PM -0300, Eduardo Habkost wrote:
> CCing Daniel, who wrote commit 6ab3fc32ea64.
> 
> On Fri, Jun 07, 2019 at 11:44:32AM -0400, Cleber Rosa wrote:
> > On Fri, Jun 07, 2019 at 12:42:14AM -0300, Eduardo Habkost wrote:
> > > On Fri, Jun 07, 2019 at 12:26:48AM -0300, Eduardo Habkost wrote:
> > > > On Fri, Feb 01, 2019 at 11:10:31AM -0500, Cleber Rosa wrote:
> > > > > 
> > > > > 
> > > > > On 1/31/19 4:26 PM, Cleber Rosa wrote:
> > > > > > 
> > > > > > 
> > > > > > On 1/31/19 3:21 PM, Cleber Rosa wrote:
> > > > > >>
> > > > > >>
> > > > > >> On 1/31/19 3:02 PM, Wainer dos Santos Moschetta wrote:
> > > > > >>>
> > > > > >>> On 01/17/2019 04:56 PM, Cleber Rosa wrote:
> > > > > >>>> Just like the previous tests, boots a Linux kernel on a aarch64 target
> > > > > >>>> using the virt machine.
> > > > > >>>>
> > > > > >>>> One special option added is the CPU type, given that the kernel
> > > > > >>>> selected fails to boot on the virt machine's default CPU (cortex-a15).
> > > > > >>>>
> > > > > >>>> Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > > > > >>>> ---
> > > > > >>>>   .travis.yml                            |  2 +-
> > > > > >>>>   tests/acceptance/boot_linux_console.py | 20 ++++++++++++++++++++
> > > > > >>>>   2 files changed, 21 insertions(+), 1 deletion(-)
> > > > > >>>>
> > > > > >>>> diff --git a/.travis.yml b/.travis.yml
> > > > > >>>> index 54100eea5a..595e8c0b6c 100644
> > > > > >>>> --- a/.travis.yml
> > > > > >>>> +++ b/.travis.yml
> > > > > >>>> @@ -187,7 +187,7 @@ matrix:
> > > > > >>>>         # Acceptance (Functional) tests
> > > > > >>>>       - env:
> > > > > >>>> -        - CONFIG="--python=/usr/bin/python3
> > > > > >>>> --target-list=x86_64-softmmu,mips-softmmu,mips64el-softmmu,ppc64-softmmu"
> > > > > >>>> +        - CONFIG="--python=/usr/bin/python3
> > > > > >>>> --target-list=x86_64-softmmu,mips-softmmu,mips64el-softmmu,ppc64-softmmu,aarch64-softmmu"
> > > > > >>>>
> > > > > >>>>           - TEST_CMD="make check-acceptance"
> > > > > >>>>         addons:
> > > > > >>>>           apt:
> > > > > >>>> diff --git a/tests/acceptance/boot_linux_console.py
> > > > > >>>> b/tests/acceptance/boot_linux_console.py
> > > > > >>>> index f3ccd23a7a..107700b517 100644
> > > > > >>>> --- a/tests/acceptance/boot_linux_console.py
> > > > > >>>> +++ b/tests/acceptance/boot_linux_console.py
> > > > > >>>> @@ -138,3 +138,23 @@ class BootLinuxConsole(Test):
> > > > > >>>>           self.vm.launch()
> > > > > >>>>           console_pattern = 'Kernel command line: %s' %
> > > > > >>>> kernel_command_line
> > > > > >>>>           self.wait_for_console_pattern(console_pattern)
> > > > > >>>> +
> > > > > >>>> +    def test_aarch64_virt(self):
> > > > > >>>
> > > > > >>> That test case fails on my system (Fedora 29 x86_64). Avocado seems
> > > > > >>> unable to kill the VM so it  reaches the timeout.
> > > > > >>>
> > > > > >>> I compiled QEMU with default configuration:
> > > > > >>>
> > > > > >>> $ configure --python=/usr/bin/python3 --target-list=x86_64-softmmu
> > > > > >>> --target-list=x86_64-softmmu,mips-softmmu,mips64el-softmmu,ppc64-softmmu,aarch64-softmmu)
> > > > > >>>
> > > > > >>>
> > > > > >>> Follows a snippet of the Avocado's job.log file:
> > > > > >>> ----
> > > > > >>> 2019-01-31 14:41:34,912 test             L0602 INFO | START
> > > > > >>> 07-/root/src/qemu/tests/acceptance/boot_linux_console.py:BootLinuxConsole.test_aarch64_virt
> > > > > >>>
> > > > > >>> 2019-01-31 14:41:34,912 test             L0298 DEBUG| DATA
> > > > > >>> (filename=output.expected) => NOT FOUND (data sources: variant, test, file)
> > > > > >>> 2019-01-31 14:41:34,913 parameters       L0146 DEBUG| PARAMS (key=arch,
> > > > > >>> path=*, default=aarch64) => 'aarch64'
> > > > > >>> 2019-01-31 14:41:34,913 parameters       L0146 DEBUG| PARAMS
> > > > > >>> (key=qemu_bin, path=*, default=aarch64-softmmu/qemu-system-aarch64) =>
> > > > > >>> 'aarch64-softmmu/qemu-system-aarch64'
> > > > > >>> 2019-01-31 14:41:34,915 download         L0070 INFO | Fetching
> > > > > >>> https://sjc.edge.kernel.org/fedora-buffet/fedora/linux/releases/29/Server/aarch64/os/images/pxeboot/vmlinuz
> > > > > >>> -> /var/lib/avocado/data/cache/by_name/vmlinuz.3upct2pr
> > > > > >>> 2019-01-31 14:41:35,490 download         L0054 DEBUG| Retrieved URL
> > > > > >>> "https://sjc.edge.kernel.org/fedora-buffet/fedora/linux/releases/29/Server/aarch64/os/images/pxeboot/vmlinuz":
> > > > > >>> content-length 8623423, date: "Thu, 31 Jan 2019 19:41:35 GMT",
> > > > > >>> last-modified: "Sun, 21 Oct 2018 00:43:09 GMT"
> > > > > >>> 2019-01-31 14:41:41,765 qemu             L0317 DEBUG| VM launch command:
> > > > > >>> 'aarch64-softmmu/qemu-system-aarch64 -chardev
> > > > > >>> socket,id=mon,path=/var/tmp/tmpizirkcud/qemu-32609-monitor.sock -mon
> > > > > >>> chardev=mon,mode=control -display none -vga none -machine virt -chardev
> > > > > >>> socket,id=console,path=/var/tmp/tmpizirkcud/qemu-32609-console.sock,server,nowait
> > > > > >>> -serial chardev:console -cpu cortex-a53 -kernel
> > > > > >>> /var/lib/avocado/data/cache/by_name/vmlinuz -append console=ttyAMA0'
> > > > > >>> 2019-01-31 14:41:41,779 qmp              L0167 DEBUG| >>> {'execute':
> > > > > >>> 'qmp_capabilities'}
> > > > > >>> 2019-01-31 14:41:41,931 qmp              L0175 DEBUG| <<< {'return': {}}
> > > > > >>> 2019-01-31 14:41:42,830 boot_linux_conso L0041 DEBUG| [    0.000000]
> > > > > >>> Booting Linux on physical CPU 0x0000000000 [0x410fd034]
> > > > > >>>
> > > > > >>> (...)
> > > > > >>>
> > > > > >>> 2019-01-31 14:41:42,833 boot_linux_conso L0041 DEBUG| [    0.000000]
> > > > > >>> Policy zone: DMA32
> > > > > >>> 2019-01-31 14:41:42,833 boot_linux_conso L0041 DEBUG| [    0.000000]
> > > > > >>> Kernel command line: console=ttyAMA0
> > > > > >>> 2019-01-31 14:41:42,833 qmp              L0167 DEBUG| >>> {'execute':
> > > > > >>> 'quit'}
> > > > > >>
> > > > > >> Here, a QMP response like "<<< {'return': {}}" would be expected.
> > > > > >>
> > > > > >> Since I can not reproduce this on my system (or on Travis-CI jobs I've
> > > > > >> sent), can you tell me on top of which commit you've applied these patches?
> > > > > >>
> > > > > > 
> > > > > > I spoke too soon:
> > > > > > 
> > > > > > https://travis-ci.org/clebergnu/qemu/jobs/487121425#L3033
> > > > > > 
> > > > > > This looks like a recent regression, and I'm guessing it's not on the
> > > > > > test's side.  I'll try to bisect it and let you know.
> > > > > > 
> > > > > 
> > > > > On a fresh environment, I am able to get this reproduced on every 2 of
> > > > > runs, more or less.  When I hit it, I attached GDB to it, and the
> > > > > backtrace shows:
> > > > > 
> > > > > Thread debugging using libthread_db enabled]
> > > > > Using host libthread_db library "/lib64/libthread_db.so.1".
> > > > > warning: Loadable section ".note.gnu.property" outside of ELF segments
> > > > > warning: Loadable section ".note.gnu.property" outside of ELF segments
> > > > > __lll_lock_wait () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:103
> > > > > 103     2:      movl    %edx, %eax
> > > > > (gdb) bt
> > > > > #0  __lll_lock_wait () at
> > > > > ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:103
> > > > > #1  0x00007fc6ba1a2e09 in __GI___pthread_mutex_lock
> > > > > (mutex=mutex@entry=0x5615a233d020 <qemu_global_mutex>) at
> > > > > ../nptl/pthread_mutex_lock.c:80
> > > > > #2  0x00005615a1bb7593 in qemu_mutex_lock_impl (mutex=0x5615a233d020
> > > > > <qemu_global_mutex>, file=0x5615a1db2d4c "util/main-loop.c", line=236)
> > > > > at util/qemu-thread-posix.c:66
> > > > > #3  0x00005615a171125e in qemu_mutex_lock_iothread_impl
> > > > > (file=file@entry=0x5615a1db2d4c "util/main-loop.c", line=line@entry=236)
> > > > > at /home/cleber/src/qemu/cpus.c:1849
> > > > > #4  0x00005615a1bb415d in os_host_main_loop_wait (timeout=<optimized
> > > > > out>) at util/main-loop.c:236
> > > > > #5  main_loop_wait (nonblocking=<optimized out>) at util/main-loop.c:497
> > > > > #6  0x00005615a18fdd39 in main_loop () at vl.c:1928
> > > > > #7  0x00005615a16c9ee9 in main (argc=<optimized out>, argv=<optimized
> > > > > out>, envp=<optimized out>) at vl.c:4665
> > > > 
> > > > Tip: run "thread apply all bt" so you can get a backtrace of all
> > > > threads.
> > > > 
> > > > 
> > > > > 
> > > > > Running it with `taskset -c 1` prevents this issue from happening, which
> > > > > AFAICT, contributes even further towards this being a QEMU race condition.
> > > > > 
> > > > > I'm CC'ing Peter and Claudio (listed maintainers of aarch64), as this
> > > > > seems to limited to that target.  Any tips on what to do here?
> > > > 
> > > > I am hitting this on Travis, too, and I finally could reproduce
> > > > it locally,
> > > > 
> > > > The guest is still writing on the serial console, but nobody is
> > > > reading the data on the other side.  A VCPU thread is stuck
> > > > inside the EAGAIN/nanosleep loop at qemu_chr_write_buffer(),
> > > > holding the QEMU global lock.
> > > 
> > > Experimental fix below.
> > > 
> > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> > > ---
> > >  python/qemu/__init__.py | 12 ++++++++----
> > >  1 file changed, 8 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/python/qemu/__init__.py b/python/qemu/__init__.py
> > > index 81d9657ec0..4a691f34da 100644
> > > --- a/python/qemu/__init__.py
> > > +++ b/python/qemu/__init__.py
> > > @@ -274,10 +274,6 @@ class QEMUMachine(object):
> > >  
> > >          self._qemu_log_path = None
> > >  
> > > -        if self._console_socket is not None:
> > > -            self._console_socket.close()
> > > -            self._console_socket = None
> > > -
> > >          if self._temp_dir is not None:
> > >              shutil.rmtree(self._temp_dir)
> > >              self._temp_dir = None
> > > @@ -336,6 +332,14 @@ class QEMUMachine(object):
> > >          """
> > >          Terminate the VM and clean up
> > >          """
> > > +
> > > +        # If we keep the console socket open, we may deadlock waiting
> > > +        # for QEMU to exit, while QEMU is waiting for the socket to
> > > +        # become writeable.
> > > +        if self._console_socket is not None:
> > > +            self._console_socket.close()
> > > +            self._console_socket = None
> > > +
> > 
> > Right, this is somewhat equivalent to the following "workaround":
> > 
> >    https://github.com/clebergnu/qemu/commit/e1713f3b91972ad57c089f276c54db3f3fa63423
> > 
> > I could not tell at the moment, though, if closing (or shutting down)
> > the console socket was the appropriate fix.
> > 
> > What I see is that Rick's commit pointed to by Lazlo is dated from
> > 2016, and it says that a virtio-console fix is necessary.  I'd imagine
> > that, if a fix was ever proposed, it'd have been incorporated in the
> > F29 kernel used in this test... and that this workaround/fix would
> > not be the best solution.
> 
> If I understood this correctly, fixing the guest driver wouldn't
> help here.  The commit mentioned by Laszlo (6ab3fc32ea64 "hw:
> replace most use of qemu_chr_fe_write with qemu_chr_fe_write_all")
> fixes data loss bugs but introduces the potential for deadlocks
> like the one we are seeing.
> 
> Unless we replace the existing ~30 qemu_chr_fe_write_all() calls
> in device code, we need to make sure we are constantly reading
> data from the console socket.

Yes, you must *always* have something reading from the chardev backend.
This really sucks, but it is preferrable to letting data end up in
/dev/null.

If this is being a problem for tests then consider it motivation to
fix the root cause problem and make the devices properly do async
I/O for chardevs.  Only a handful of them properly do this right
now.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


  reply	other threads:[~2019-06-10  8:54 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-17 18:56 [Qemu-devel] [PATCH 00/18] Acceptance Tests: target architecture support Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 01/18] scripts/qemu.py: log QEMU launch command line Cleber Rosa
2019-01-21 20:19   ` Caio Carrara
2019-01-22  9:47   ` Philippe Mathieu-Daudé
2019-01-22 11:17   ` Alex Bennée
2019-01-17 18:56 ` [Qemu-devel] [PATCH 02/18] Acceptance tests: show avocado test execution by default Cleber Rosa
2019-01-21 20:20   ` Caio Carrara
2019-01-22  9:50   ` Philippe Mathieu-Daudé
2019-01-22 11:19   ` Alex Bennée
2019-01-17 18:56 ` [Qemu-devel] [PATCH 03/18] Acceptance tests: improve docstring on pick_default_qemu_bin() Cleber Rosa
2019-01-21 20:20   ` Caio Carrara
2019-01-17 18:56 ` [Qemu-devel] [PATCH 04/18] Acceptance tests: fix doc reference to avocado_qemu directory Cleber Rosa
2019-01-21 20:21   ` Caio Carrara
2019-01-22  9:51   ` Philippe Mathieu-Daudé
2019-01-17 18:56 ` [Qemu-devel] [PATCH 05/18] Acceptance tests: introduce arch parameter and attribute Cleber Rosa
2019-01-18 14:28   ` Caio Carrara
2019-01-22  9:54     ` Philippe Mathieu-Daudé
2019-01-30 21:49     ` Cleber Rosa
2019-01-30 21:59     ` Cleber Rosa
2019-01-31 13:55   ` Wainer dos Santos Moschetta
2019-01-31 19:01     ` Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 06/18] Acceptance tests: use "arch:" tag to filter target specific tests Cleber Rosa
2019-01-18 10:38   ` Cornelia Huck
2019-01-30 22:15     ` Cleber Rosa
2019-01-21 20:24   ` Caio Carrara
2019-01-17 18:56 ` [Qemu-devel] [PATCH 07/18] Acceptance tests: look for target architecture in test tags first Cleber Rosa
2019-01-21 20:25   ` Caio Carrara
2019-01-17 18:56 ` [Qemu-devel] [PATCH 08/18] Boot Linux Console Test: rename the x86_64 after the arch and machine Cleber Rosa
2019-01-21 20:26   ` Caio Carrara
2019-01-22  9:56   ` Philippe Mathieu-Daudé
2019-01-17 18:56 ` [Qemu-devel] [PATCH 09/18] Boot Linux Console Test: update the x86_64 kernel Cleber Rosa
2019-01-21 20:27   ` Caio Carrara
2019-01-17 18:56 ` [Qemu-devel] [PATCH 10/18] Boot Linux Console Test: refactor the console watcher into utility method Cleber Rosa
2019-01-21 20:28   ` Caio Carrara
2019-01-22 10:06   ` Philippe Mathieu-Daudé
2019-01-31  0:17     ` Cleber Rosa
2019-01-31 17:46   ` Wainer dos Santos Moschetta
2019-01-31 19:29     ` Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 11/18] scripts/qemu.py: support adding a console with the default serial device Cleber Rosa
2019-01-21 20:29   ` Caio Carrara
2019-01-31 18:49   ` Wainer dos Santos Moschetta
2019-01-31 20:05     ` Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 12/18] Boot Linux Console Test: add a test for mips + malta Cleber Rosa
2019-01-21 20:30   ` Caio Carrara
2019-01-22 10:16   ` Philippe Mathieu-Daudé
2019-01-31  0:27     ` Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 13/18] Boot Linux Console Test: add a test for mips64el " Cleber Rosa
2019-01-21 20:31   ` Caio Carrara
2019-01-22 10:19   ` Philippe Mathieu-Daudé
2019-01-31  1:26     ` Cleber Rosa
2019-01-31 10:24       ` Philippe Mathieu-Daudé
2019-01-22 10:57   ` Philippe Mathieu-Daudé
2019-01-31  1:34     ` Cleber Rosa
2019-01-31 10:26       ` Philippe Mathieu-Daudé
2019-01-31 15:06         ` Cleber Rosa
2019-01-31 18:14   ` Wainer dos Santos Moschetta
2019-01-31 20:11     ` Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 14/18] Boot Linux Console Test: add a test for ppc64 + pseries Cleber Rosa
2019-01-21 20:32   ` Caio Carrara
2019-01-22 16:07   ` Alex Bennée
2019-01-31  2:37     ` Cleber Rosa
2019-01-31 10:23       ` Philippe Mathieu-Daudé
2019-01-17 18:56 ` [Qemu-devel] [PATCH 15/18] Boot Linux Console Test: add a test for aarch64 + virt Cleber Rosa
2019-01-21 20:32   ` Caio Carrara
2019-01-31 20:02   ` Wainer dos Santos Moschetta
2019-01-31 20:21     ` Cleber Rosa
2019-01-31 21:26       ` Cleber Rosa
2019-02-01 16:10         ` Cleber Rosa
2019-06-07  3:26           ` Eduardo Habkost
2019-06-07  3:42             ` Eduardo Habkost
2019-06-07 15:44               ` Cleber Rosa
2019-06-07 18:58                 ` Eduardo Habkost
2019-06-10  8:53                   ` Daniel P. Berrangé [this message]
2019-06-10 16:50                     ` Cleber Rosa
2019-06-07  7:41             ` Laszlo Ersek
2019-06-07 15:33             ` Cleber Rosa
2019-01-17 18:56 ` [Qemu-devel] [PATCH 16/18] Boot Linux Console Test: add a test for arm " Cleber Rosa
2019-01-21 20:33   ` Caio Carrara
2019-01-17 18:56 ` [Qemu-devel] [PATCH 17/18] Boot Linux Console Test: add a test for s390x + s390-ccw-virtio Cleber Rosa
2019-01-18  8:58   ` Cornelia Huck
2019-01-18 13:45     ` Cleber Rosa
2019-01-21 20:34   ` Caio Carrara
2019-01-17 18:56 ` [Qemu-devel] [PATCH 18/18] Boot Linux Console Test: add a test for alpha + clipper Cleber Rosa
2019-01-21 20:34   ` Caio Carrara
2019-01-22 10:52   ` Philippe Mathieu-Daudé
2019-01-31  2:53     ` Cleber Rosa
2019-01-31 10:30       ` Philippe Mathieu-Daudé
2019-01-31 20:23         ` Cleber Rosa
2019-01-21 22:15 ` [Qemu-devel] [PATCH 00/18] Acceptance Tests: target architecture support Aleksandar Markovic
2019-01-22 10:48   ` Philippe Mathieu-Daudé
2019-01-31 15:01     ` Cleber Rosa
2019-02-01  5:32       ` Aleksandar Markovic
2019-02-01 16:17         ` Cleber Rosa
2019-01-31 18:09 ` no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190610085303.GA7809@redhat.com \
    --to=berrange@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=amarkovic@wavecomp.com \
    --cc=arikalo@wavecomp.com \
    --cc=aurelien@aurel32.net \
    --cc=ccarrara@redhat.com \
    --cc=claudio.fontana@huawei.com \
    --cc=cohuck@redhat.com \
    --cc=crosa@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=fam@euphon.net \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=smarkovic@wavecomp.com \
    --cc=wainersm@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.