All of lore.kernel.org
 help / color / mirror / Atom feed
* Bug / Suspected regression. Multiple block group profiles detected on newly created raid1.
@ 2021-10-09 11:44 FireFish5000
  2021-10-09 12:19 ` Qu Wenruo
  0 siblings, 1 reply; 5+ messages in thread
From: FireFish5000 @ 2021-10-09 11:44 UTC (permalink / raw)
  To: linux-btrfs

[-- Attachment #1: Type: text/plain, Size: 1260 bytes --]

After creating a new btrfs raid1 and was surprised to be greeted with
the warning

WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
WARNING:   Metadata: single, raid1

I asked on the IRC, and darkling directed me to the mailing list
suspecting this was a regression.
I am on 5.14.8-gentoo-dist with btrfs-progs v5.14.1

I have attached a script to reproduce this with temporary images/loop devices,
Along with the full output I received when running the script.

A shortened version of the commands that I ran on my *real drives* and
the relevant output is also provided below for convenience. P at the
end of the device path was inserted incase sleepy joe copies it
thinking its the reproduction script:

# mkfs.btrfs --force -R free-space-tree -L BtrfsRaid1Test -d raid1 -m
raid1 /dev/sdaP /dev/sdbP; mount /dev/sda /mnt/tmp; btrfs filesystem
df /mnt/tmp
btrfs-progs v5.14.1
....truncated....
....truncated....
Data, RAID1: total=1.00GiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=176.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=3.25MiB, used=0.00B
WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
WARNING:   Metadata: single, raid1

[-- Attachment #2: btrfsRaid1Test.sh - output.txt --]
[-- Type: text/plain, Size: 2367 bytes --]

# Get System Info
uname -r
+ uname -r
5.14.8-gentoo-dist
btrfs version
+ btrfs version
btrfs-progs v5.14.1 

##########
# Create blank images
fallocate -l 2G /tmp/tmpImgA
+ fallocate -l 2G /tmp/tmpImgA
fallocate -l 2G /tmp/tmpImgB
+ fallocate -l 2G /tmp/tmpImgB

##########
# Prepare loopback devices
modprobe loop
+ modprobe loop
LOOP_A="$(losetup --show -fP /tmp/tmpImgA)"
++ losetup --show -fP /tmp/tmpImgA
+ LOOP_A=/dev/loop0
LOOP_B="$(losetup --show -fP /tmp/tmpImgB)"
++ losetup --show -fP /tmp/tmpImgB
+ LOOP_B=/dev/loop1

##########
# Create raid1
mkfs.btrfs --force -R free-space-tree -L TmpRaid1 -d raid1 -m raid1 "$LOOP_A" "$LOOP_B"
+ mkfs.btrfs --force -R free-space-tree -L TmpRaid1 -d raid1 -m raid1 /dev/loop0 /dev/loop1
btrfs-progs v5.14.1 
See http://btrfs.wiki.kernel.org for more information.

Label:              TmpRaid1
UUID:               96f6a82c-e80f-4560-9045-0229e63f5d66
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID1           204.75MiB
  Metadata:         RAID1           264.00MiB
  System:           RAID1             8.00MiB
SSD detected:       yes
Zoned device:       no
Incompat features:  extref, skinny-metadata
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1     2.00GiB  /dev/loop0
    2     2.00GiB  /dev/loop1


##########
# Mount temp raid1
mkdir /tmp/tmpRaid1
+ mkdir /tmp/tmpRaid1
mount "$LOOP_A" /tmp/tmpRaid1
+ mount /dev/loop0 /tmp/tmpRaid1

##########
# Run btrfs df
btrfs filesystem df /tmp/tmpRaid1
+ btrfs filesystem df /tmp/tmpRaid1
Data, RAID1: total=204.75MiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=128.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=3.25MiB, used=0.00B
WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
WARNING:   Metadata: single, raid1

##########
# cleanup
umount /tmp/tmpRaid1
+ umount /tmp/tmpRaid1

losetup --detach "$LOOP_A"
+ losetup --detach /dev/loop0
losetup --detach "$LOOP_B"
+ losetup --detach /dev/loop1

sync
+ sync
rmdir /tmp/tmpRaid1/
+ rmdir /tmp/tmpRaid1/
rm /tmp/tmpImgA
+ rm /tmp/tmpImgA
rm /tmp/tmpImgB
+ rm /tmp/tmpImgB

[-- Attachment #3: btrfsRaid1Test.sh --]
[-- Type: application/x-sh, Size: 847 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug / Suspected regression. Multiple block group profiles detected on newly created raid1.
  2021-10-09 11:44 Bug / Suspected regression. Multiple block group profiles detected on newly created raid1 FireFish5000
@ 2021-10-09 12:19 ` Qu Wenruo
  2021-10-09 13:24   ` FireFish5000
  2021-10-10  9:21   ` Qu Wenruo
  0 siblings, 2 replies; 5+ messages in thread
From: Qu Wenruo @ 2021-10-09 12:19 UTC (permalink / raw)
  To: FireFish5000, linux-btrfs



On 2021/10/9 19:44, FireFish5000 wrote:
> After creating a new btrfs raid1 and was surprised to be greeted with
> the warning
>
> WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> WARNING:   Metadata: single, raid1
>
> I asked on the IRC, and darkling directed me to the mailing list
> suspecting this was a regression.
> I am on 5.14.8-gentoo-dist with btrfs-progs v5.14.1
>
> I have attached a script to reproduce this with temporary images/loop devices,
> Along with the full output I received when running the script.
>
> A shortened version of the commands that I ran on my *real drives* and
> the relevant output is also provided below for convenience. P at the
> end of the device path was inserted incase sleepy joe copies it
> thinking its the reproduction script:
>
> # mkfs.btrfs --force -R free-space-tree -L BtrfsRaid1Test -d raid1 -m

This seems to be a recent bug in btrfs-progs which doesn't remove the
temporary chunk.

You can try the latest v5.14.2 to see if it's solved.

If you want to use the fs, just do a btrfs balance with "start
-musage=0" should remove that SINGLE metadata chunk.

Thanks,
Qu
> raid1 /dev/sdaP /dev/sdbP; mount /dev/sda /mnt/tmp; btrfs filesystem
> df /mnt/tmp
> btrfs-progs v5.14.1
> ....truncated....
> ....truncated....
> Data, RAID1: total=1.00GiB, used=0.00B
> System, RAID1: total=8.00MiB, used=16.00KiB
> Metadata, RAID1: total=1.00GiB, used=176.00KiB
> Metadata, single: total=8.00MiB, used=0.00B
> GlobalReserve, single: total=3.25MiB, used=0.00B
> WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> WARNING:   Metadata: single, raid1
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug / Suspected regression. Multiple block group profiles detected on newly created raid1.
  2021-10-09 12:19 ` Qu Wenruo
@ 2021-10-09 13:24   ` FireFish5000
  2021-10-09 13:42     ` Hugo Mills
  2021-10-10  9:21   ` Qu Wenruo
  1 sibling, 1 reply; 5+ messages in thread
From: FireFish5000 @ 2021-10-09 13:24 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs

[-- Attachment #1: Type: text/plain, Size: 2233 bytes --]

Same warning in v5.14.2. Output is mostly the same except that it
informs me it'd running a full device TRIM during mkfs.

>  If you want to use the fs, just do a btrfs balance with "start
-musage=0" should remove that SINGLE metadata chunk.

Earlier I ran
`btrfs balance start -mconvert=raid1,soft /mnt/tmp`
which seemed to have done the trick. Any notable difference between
the results of the two commands?

Sincerely,
A Fish on Fire


On Sat, Oct 9, 2021 at 7:19 AM Qu Wenruo <quwenruo.btrfs@gmx.com> wrote:
>
>
>
> On 2021/10/9 19:44, FireFish5000 wrote:
> > After creating a new btrfs raid1 and was surprised to be greeted with
> > the warning
> >
> > WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> > WARNING:   Metadata: single, raid1
> >
> > I asked on the IRC, and darkling directed me to the mailing list
> > suspecting this was a regression.
> > I am on 5.14.8-gentoo-dist with btrfs-progs v5.14.1
> >
> > I have attached a script to reproduce this with temporary images/loop devices,
> > Along with the full output I received when running the script.
> >
> > A shortened version of the commands that I ran on my *real drives* and
> > the relevant output is also provided below for convenience. P at the
> > end of the device path was inserted incase sleepy joe copies it
> > thinking its the reproduction script:
> >
> > # mkfs.btrfs --force -R free-space-tree -L BtrfsRaid1Test -d raid1 -m
>
> This seems to be a recent bug in btrfs-progs which doesn't remove the
> temporary chunk.
>
> You can try the latest v5.14.2 to see if it's solved.
>
> If you want to use the fs, just do a btrfs balance with "start
> -musage=0" should remove that SINGLE metadata chunk.
>
> Thanks,
> Qu
> > raid1 /dev/sdaP /dev/sdbP; mount /dev/sda /mnt/tmp; btrfs filesystem
> > df /mnt/tmp
> > btrfs-progs v5.14.1
> > ....truncated....
> > ....truncated....
> > Data, RAID1: total=1.00GiB, used=0.00B
> > System, RAID1: total=8.00MiB, used=16.00KiB
> > Metadata, RAID1: total=1.00GiB, used=176.00KiB
> > Metadata, single: total=8.00MiB, used=0.00B
> > GlobalReserve, single: total=3.25MiB, used=0.00B
> > WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> > WARNING:   Metadata: single, raid1
> >

[-- Attachment #2: output-v5.14.2.txt --]
[-- Type: text/plain, Size: 2396 bytes --]


##########
# Get System Info
uname -r
+ uname -r
5.14.8-gentoo-dist
btrfs version
+ btrfs version
btrfs-progs v5.14.2 

##########
# Create blank images
fallocate -l 2G /tmp/tmpImgA
+ fallocate -l 2G /tmp/tmpImgA
fallocate -l 2G /tmp/tmpImgB
+ fallocate -l 2G /tmp/tmpImgB

##########
# Prepare loopback devices
modprobe loop
+ modprobe loop
LOOP_A="$(losetup --show -fP /tmp/tmpImgA)"
++ losetup --show -fP /tmp/tmpImgA
+ LOOP_A=/dev/loop0
LOOP_B="$(losetup --show -fP /tmp/tmpImgB)"
++ losetup --show -fP /tmp/tmpImgB
+ LOOP_B=/dev/loop1

##########
# Create raid1
mkfs.btrfs --force -R free-space-tree -L TmpRaid1 -d raid1 -m raid1 "$LOOP_A" "$LOOP_B"
+ mkfs.btrfs --force -R free-space-tree -L TmpRaid1 -d raid1 -m raid1 /dev/loop0 /dev/loop1
btrfs-progs v5.14.2 
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM /dev/loop0 (2.00GiB) ...
Performing full device TRIM /dev/loop1 (2.00GiB) ...
Label:              TmpRaid1
UUID:               eae631be-d48f-484b-af09-8d65a291bbf1
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID1           204.75MiB
  Metadata:         RAID1           264.00MiB
  System:           RAID1             8.00MiB
SSD detected:       yes
Zoned device:       no
Incompat features:  extref, skinny-metadata
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1     2.00GiB  /dev/loop0
    2     2.00GiB  /dev/loop1


##########
# Mount temp raid1
mkdir /tmp/tmpRaid1
+ mkdir /tmp/tmpRaid1
mount "$LOOP_A" /tmp/tmpRaid1
+ mount /dev/loop0 /tmp/tmpRaid1

##########
# Run btrfs df
btrfs filesystem df /tmp/tmpRaid1
+ btrfs filesystem df /tmp/tmpRaid1
WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
WARNING:   Metadata: single, raid1
Data, RAID1: total=204.75MiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=128.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=3.25MiB, used=0.00B

##########
# cleanup
umount /tmp/tmpRaid1
+ umount /tmp/tmpRaid1

losetup --detach "$LOOP_A"
+ losetup --detach /dev/loop0
losetup --detach "$LOOP_B"
+ losetup --detach /dev/loop1

sync
+ sync
rmdir /tmp/tmpRaid1/
+ rmdir /tmp/tmpRaid1/
rm /tmp/tmpImgA
+ rm /tmp/tmpImgA
rm /tmp/tmpImgB
+ rm /tmp/tmpImgB

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug / Suspected regression. Multiple block group profiles detected on newly created raid1.
  2021-10-09 13:24   ` FireFish5000
@ 2021-10-09 13:42     ` Hugo Mills
  0 siblings, 0 replies; 5+ messages in thread
From: Hugo Mills @ 2021-10-09 13:42 UTC (permalink / raw)
  To: FireFish5000; +Cc: Qu Wenruo, linux-btrfs

On Sat, Oct 09, 2021 at 08:24:51AM -0500, FireFish5000 wrote:
> Same warning in v5.14.2. Output is mostly the same except that it
> informs me it'd running a full device TRIM during mkfs.
> 
> >  If you want to use the fs, just do a btrfs balance with "start
> -musage=0" should remove that SINGLE metadata chunk.
> 
> Earlier I ran
> `btrfs balance start -mconvert=raid1,soft /mnt/tmp`
> which seemed to have done the trick. Any notable difference between
> the results of the two commands?

   Qu's takes all the empty metadata chunks and removes them. Mine
(from IRC) takes all the non-RAID-1 chunks and converts them to
RAID-1, whether they're empty or not.

   In this case, all the non-RAID-1 chunks are empty, so they have the
same practical result. If some of the single chunks had metadata in
them, then the convert= version would be the right thing to do.

   Hugo.

> Sincerely,
> A Fish on Fire
> 
> 
> On Sat, Oct 9, 2021 at 7:19 AM Qu Wenruo <quwenruo.btrfs@gmx.com> wrote:
> >
> >
> >
> > On 2021/10/9 19:44, FireFish5000 wrote:
> > > After creating a new btrfs raid1 and was surprised to be greeted with
> > > the warning
> > >
> > > WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> > > WARNING:   Metadata: single, raid1
> > >
> > > I asked on the IRC, and darkling directed me to the mailing list
> > > suspecting this was a regression.
> > > I am on 5.14.8-gentoo-dist with btrfs-progs v5.14.1
> > >
> > > I have attached a script to reproduce this with temporary images/loop devices,
> > > Along with the full output I received when running the script.
> > >
> > > A shortened version of the commands that I ran on my *real drives* and
> > > the relevant output is also provided below for convenience. P at the
> > > end of the device path was inserted incase sleepy joe copies it
> > > thinking its the reproduction script:
> > >
> > > # mkfs.btrfs --force -R free-space-tree -L BtrfsRaid1Test -d raid1 -m
> >
> > This seems to be a recent bug in btrfs-progs which doesn't remove the
> > temporary chunk.
> >
> > You can try the latest v5.14.2 to see if it's solved.
> >
> > If you want to use the fs, just do a btrfs balance with "start
> > -musage=0" should remove that SINGLE metadata chunk.
> >
> > Thanks,
> > Qu
> > > raid1 /dev/sdaP /dev/sdbP; mount /dev/sda /mnt/tmp; btrfs filesystem
> > > df /mnt/tmp
> > > btrfs-progs v5.14.1
> > > ....truncated....
> > > ....truncated....
> > > Data, RAID1: total=1.00GiB, used=0.00B
> > > System, RAID1: total=8.00MiB, used=16.00KiB
> > > Metadata, RAID1: total=1.00GiB, used=176.00KiB
> > > Metadata, single: total=8.00MiB, used=0.00B
> > > GlobalReserve, single: total=3.25MiB, used=0.00B
> > > WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> > > WARNING:   Metadata: single, raid1
> > >

> 
> ##########
> # Get System Info
> uname -r
> + uname -r
> 5.14.8-gentoo-dist
> btrfs version
> + btrfs version
> btrfs-progs v5.14.2 
> 
> ##########
> # Create blank images
> fallocate -l 2G /tmp/tmpImgA
> + fallocate -l 2G /tmp/tmpImgA
> fallocate -l 2G /tmp/tmpImgB
> + fallocate -l 2G /tmp/tmpImgB
> 
> ##########
> # Prepare loopback devices
> modprobe loop
> + modprobe loop
> LOOP_A="$(losetup --show -fP /tmp/tmpImgA)"
> ++ losetup --show -fP /tmp/tmpImgA
> + LOOP_A=/dev/loop0
> LOOP_B="$(losetup --show -fP /tmp/tmpImgB)"
> ++ losetup --show -fP /tmp/tmpImgB
> + LOOP_B=/dev/loop1
> 
> ##########
> # Create raid1
> mkfs.btrfs --force -R free-space-tree -L TmpRaid1 -d raid1 -m raid1 "$LOOP_A" "$LOOP_B"
> + mkfs.btrfs --force -R free-space-tree -L TmpRaid1 -d raid1 -m raid1 /dev/loop0 /dev/loop1
> btrfs-progs v5.14.2 
> See http://btrfs.wiki.kernel.org for more information.
> 
> Performing full device TRIM /dev/loop0 (2.00GiB) ...
> Performing full device TRIM /dev/loop1 (2.00GiB) ...
> Label:              TmpRaid1
> UUID:               eae631be-d48f-484b-af09-8d65a291bbf1
> Node size:          16384
> Sector size:        4096
> Filesystem size:    4.00GiB
> Block group profiles:
>   Data:             RAID1           204.75MiB
>   Metadata:         RAID1           264.00MiB
>   System:           RAID1             8.00MiB
> SSD detected:       yes
> Zoned device:       no
> Incompat features:  extref, skinny-metadata
> Runtime features:   free-space-tree
> Checksum:           crc32c
> Number of devices:  2
> Devices:
>    ID        SIZE  PATH
>     1     2.00GiB  /dev/loop0
>     2     2.00GiB  /dev/loop1
> 
> 
> ##########
> # Mount temp raid1
> mkdir /tmp/tmpRaid1
> + mkdir /tmp/tmpRaid1
> mount "$LOOP_A" /tmp/tmpRaid1
> + mount /dev/loop0 /tmp/tmpRaid1
> 
> ##########
> # Run btrfs df
> btrfs filesystem df /tmp/tmpRaid1
> + btrfs filesystem df /tmp/tmpRaid1
> WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
> WARNING:   Metadata: single, raid1
> Data, RAID1: total=204.75MiB, used=0.00B
> System, RAID1: total=8.00MiB, used=16.00KiB
> Metadata, RAID1: total=256.00MiB, used=128.00KiB
> Metadata, single: total=8.00MiB, used=0.00B
> GlobalReserve, single: total=3.25MiB, used=0.00B
> 
> ##########
> # cleanup
> umount /tmp/tmpRaid1
> + umount /tmp/tmpRaid1
> 
> losetup --detach "$LOOP_A"
> + losetup --detach /dev/loop0
> losetup --detach "$LOOP_B"
> + losetup --detach /dev/loop1
> 
> sync
> + sync
> rmdir /tmp/tmpRaid1/
> + rmdir /tmp/tmpRaid1/
> rm /tmp/tmpImgA
> + rm /tmp/tmpImgA
> rm /tmp/tmpImgB
> + rm /tmp/tmpImgB


-- 
Hugo Mills             | Great films about cricket: Crease
hugo@... carfax.org.uk |
http://carfax.org.uk/  |
PGP: E2AB1DE4          |

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug / Suspected regression. Multiple block group profiles detected on newly created raid1.
  2021-10-09 12:19 ` Qu Wenruo
  2021-10-09 13:24   ` FireFish5000
@ 2021-10-10  9:21   ` Qu Wenruo
  1 sibling, 0 replies; 5+ messages in thread
From: Qu Wenruo @ 2021-10-10  9:21 UTC (permalink / raw)
  To: FireFish5000, linux-btrfs



On 2021/10/9 20:19, Qu Wenruo wrote:
>
>
> On 2021/10/9 19:44, FireFish5000 wrote:
>> After creating a new btrfs raid1 and was surprised to be greeted with
>> the warning
>>
>> WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
>> WARNING:   Metadata: single, raid1
>>
>> I asked on the IRC, and darkling directed me to the mailing list
>> suspecting this was a regression.
>> I am on 5.14.8-gentoo-dist with btrfs-progs v5.14.1
>>
>> I have attached a script to reproduce this with temporary images/loop
>> devices,
>> Along with the full output I received when running the script.
>>
>> A shortened version of the commands that I ran on my *real drives* and
>> the relevant output is also provided below for convenience. P at the
>> end of the device path was inserted incase sleepy joe copies it
>> thinking its the reproduction script:
>>
>> # mkfs.btrfs --force -R free-space-tree -L BtrfsRaid1Test -d raid1 -m
>
> This seems to be a recent bug in btrfs-progs which doesn't remove the
> temporary chunk.
>
> You can try the latest v5.14.2 to see if it's solved.
>
> If you want to use the fs, just do a btrfs balance with "start
> -musage=0" should remove that SINGLE metadata chunk.

OK, I also confirmed the bug locally.

My initial suspect is the recent rework on free-space-tree creation, but
simple "-R free-space-cache -m raid1" won't create it.

Surprisingly it needs both metadata and data to be another profile to
trigger it.

With it reproduced, it should be pretty soon for me to find the root cause.

Thanks,
Qu
>
> Thanks,
> Qu
>> raid1 /dev/sdaP /dev/sdbP; mount /dev/sda /mnt/tmp; btrfs filesystem
>> df /mnt/tmp
>> btrfs-progs v5.14.1
>> ....truncated....
>> ....truncated....
>> Data, RAID1: total=1.00GiB, used=0.00B
>> System, RAID1: total=8.00MiB, used=16.00KiB
>> Metadata, RAID1: total=1.00GiB, used=176.00KiB
>> Metadata, single: total=8.00MiB, used=0.00B
>> GlobalReserve, single: total=3.25MiB, used=0.00B
>> WARNING: Multiple block group profiles detected, see 'man btrfs(5)'.
>> WARNING:   Metadata: single, raid1
>>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-10-10  9:21 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-09 11:44 Bug / Suspected regression. Multiple block group profiles detected on newly created raid1 FireFish5000
2021-10-09 12:19 ` Qu Wenruo
2021-10-09 13:24   ` FireFish5000
2021-10-09 13:42     ` Hugo Mills
2021-10-10  9:21   ` Qu Wenruo

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.