Skip to main content

How I Spent My Perl Toolchain Summit v2024

·3582 words·17 mins·
metacpan perl Programming Perl Toolchain Summit
Table of Contents
❀️ It's great to see you here! I'm currently available on evenings and weekends for consulting and freelance work. Let's chat about how I can help you achieve your goals.

PTS 2024 in Lisbon

The Perl Toolchain Summit (PTS) is an annual event, held in Europe, where work on improving the Perl toolchain takes place. I was fortunate to be able to attend PTS once again this year. This year we gathered in Lisbon, Portugal from Thursday, April 25 to Sunday, April 28. This was my 1st trip to Lisbon and my 10th PTS in total.

Lisbon at night

Getting There

Last year, I took my little travel companion along for the ride. That didn’t work out for us this year, so I flew solo, but I missed the company.

On the Monday evening I flew out from YYZ. Early Tuesday morning I had breakfast in Paris at CDG and then continued on to Lisbon.

CanelΓ© in Paris

[CanelΓ© in Paris. The stop at CDG was worth it]

Getting Settled

Beaches of Lisbon

[On the descent into Lisbon, the view of the sandy beaches was incredible.]

My initial plan had been to spend Monday or Tuesday at the beach at Cascais, since I had never swum in the ocean before, but INGY had thrown out the idea of renting some road bikes in Lisbon and doing some cycling. The choices were a 40km route with some tough climbs and an 80 km route with less climbing. I had never gone on a ride of more than 65 km, but after some discussion we decided on the 80 km route as that seemed like the easier option.

After checking in at the hotel, Ingy and I picked up our rental bikes and rode them back to the hotel. It was my first time on cobblestones with a road bike and I experienced almost immediately how much fun that is. After I picked myself up off the ground I was decidedly less enthusiastic about riding, but the rest of the way back to the hotel was not so eventful.



In the evening, Ingy and Tina and I went out to dinner with some local friends of Ingy who had kindly booked us all a table at a local restaurant which serves wonderful food with performances of Fado in between. The musicians were extremely skilled and the audience was very appreciative. This was complemented by the quality of the food and wine. It really was a night to remember. The only thing we didn’t remember was to get to bed early. I got back to my room at 1:30 AM and I needed to be on my bike 6 hours later. I hadn’t taken a proper nap or thought too much about jetlag as there hadn’t really been time.

To Ride or not to Ride

After getting back late, I decided I probably shouldn’t ride the next day. My leg was still a bit sore from my fall, I had a headache from riding on the cobblestones and (I’m not going to lie) I had had a fair amount to drink. I debated how I should cancel on Ingy. Should I send him a text now and let him know that I had made the safe, responsible, adult choice or should I casually mention at 7:00 AM breakfast that I wasn’t feeling up to it? I decided to let him know at breakfast.

By the time I was having my 7:00 AM breakfast, my headache was gone, my leg was healing nicely and I wasn’t so tired. Also, given how much I enjoyed the ride from the bike shop to the hotel, I wasn’t looking forward to returning the bike to the shop by myself. I figured I’d ride along and see how it all played out. How bad could it be? If at any point I wanted to bail on the ride, I could find a train and head back, so I headed out with a contingency plan.

After maybe one minute of riding it became obvious to me that I didn’t have the speed or the bike handling skills to keep up with Ingy and his local friend (who had taken us out for dinner just a few hours ago and was now very kindly taking us on one of his local routes). There was no way I was riding between two rows of stopped cars on the cobblestones, even with 30 mm tires. However, it was a “no drop” ride and they kindly waited for me at points along the way to ensure we stayed together. We had a really nice ride along the coast. The temperature was around 17 C and there was barely any wind. It really was optimal as far as conditions went. I didn’t even get a sunburn. Luckily we did make a stop for a delicious espresso and custard tart. I had lacked the foresight to bring any kind of food with me, so that made a real difference.

Espresso and a tart for everyone

[Espresso and a tart for everyone]

We rode for a long time. Like a really long time. There were long twisty climbs, long twisty descents and the occasional flat sections. No parts of my body let me down and I finished without picking up any new injuries (except for the limp which I sported for the next two days). The 80 km ride ended up being a 110 km ride, clocking in at 4 hours and 43 minutes.

My ride on Strava

After the longest bike ride of my life I was not really in the condition to go for a swim at the beach. Ingy and I headed out to the older part of town to get some Ginjinha.

ginjinha with cherries

I then struck out on my own in the older part of town, got myself some custard tarts and made it back in time to get to the arrival dinner as food was being ordered. It was nice to see old friends after a one year break and to meet some new faces as well. On the way home we stopped for ice cream at a shopping mall. I couldn’t wrap my head around the fact that the mall is open until midnight every night. I’m lucky when my local malls are open until 9. Some evenings they close at 6. The Portuguese way is better.

A Portuguese style burger from an Irish style pub

[A Portuguese style burger from an Irish style pub]

Day 0

On Thursday morning, we started with a short standup meeting and then people split into groups of one or more to make plans and get hacking.

Our plan was two-fold:

  1. Begin moving more of our infrastructure into the cloud, via Kubernetes
  2. Begin moving our Elasticsearch data from bare metal to the Elasticsearch hosted offering.

The reason we are able to move our data to a hosted offering by Elasticsearch is because Elastic is our newest sponsor. I had reached out to Elastic shortly before PTS to ask if they could help us out. They quickly responded by saying that they would like to support the Perl community. In the next day or so I had a meeting with their developer relations contact and we got immediate access to all of the resources which we required. This is a huge helping hand for us in keeping the project moving forward. It will allow us to have better uptime and also will give us better tools for migrating from our very old v2.4 Elasticsearch to a more modern v8 version. My personal thanks to Elastic for making this happen!

As Leo and Joel got to work on the kubernetes end of things, Graham made various code improvements around the indexing of Perl itself, which requires some special casing. Mickey began reworking the indexer code in order to make a future Elasticsearch upgrade easier.

I mostly got down to administrative things.

  • I had to submit a bunch of receipts to Open Collective so that they don’t suspend our virtual credit card.
  • I purged some very old data from our S3 buckets so that we’re no longer being billed for hosting it.
  • On this day we also became aware that the disk on our primary hosting machine was in read-only mode. Leo switched the cron jobs to another machine, but our Minion queue was not running. I spent much of the afternoon debugging this issue. I was successful and we shut down the old machine. Our 3 machine cluster at Bytemark was now reduced to 2, but we still had enough redundancy to get by.

After this I began looking at the Elasticsearch snapshot restore process, but I just couldn’t get it to work on my first attempts.

Day 1

We started with standup once again and then got to our various tasks. I began again with trying to restore an existing Elasticsearch snapshot from our production machine into the Elasticsearch cloud. I was aware that this could be tricky, since 2.4 is no longer a supported version of Elasticsearch. We were able to get a 2.4 Elasticsearch in the cloud provided to us, but the caveat was that it might be tricky to set up, given the amount of intervening years since it was released. That was entirely fair. I spent some time trying to find the correct incantation for registering our s3 bucket with Elasticsearch and I was coming up against slightly cryptic errors which were being proxied back from an AWS Java library. Leo also sat down with me to try to make some progress. Eventually we had to admit defeat on that for the day and move on to something else.

Unrelated to MetaCPAN, I merged a PR for p5-www-youtube-download. That library hasn’t worked in a while, but apparently it’s now less broken. However, since some of the tests are still broken, someone may need to look into that before I can release. I don’t use this software at all. I’m happy to merge and release but I don’t feel like it’s a good use of my time to be spending a lot of effort on it.

I sat down and spent some time with ABELTJE, who is moving into the MetaCPAN infrastructure so that he is no longer solely responsible for maintaining the site. He was in the process of Dockerizing the site and was 95% of the way there. Together we ironed out the final bit and got his Docker containers running locally.

There was also a discussion about settling the Perl logo question, which NEILB participated in via Zoom. I think we made some good headway. We had a number of stakeholders in the room and after some hearty debate, I’m hopeful we can move ahead with this in the near future. Watch this space.

I also did a fair bit of code review as Graham works at a furious pace and I didn’t want to slow him down.

Day 2

I believe this day may not have begun with standup. As is tradition, standup usually gets stood up somewhere along the way as jetlag and late nights catch up with attendees and they trickle in later and later on subsequent days.

Since we are looking at a fair amount of future code churn in the metacpan-api repository, I thought it would be helpful to get code coverage metrics going on it and metacpan-web. metacpan-web was fairly easy to set up as it runs in GitHub Actions. It has multiple builds, two of which do not use Docker. metacpan-api, on the other hand, was a different case. It only runs tests via docker compose and that all happens on CircleCI. We do this because CircleCI allows us to select a machine size (we want as large as possible) and it allows us to re-run failed builds with an open SSH connection to the container. To be honest, the SSH thing is a game changer. I absolutely love it and I’m not just saying that because CircleCI mailed me a shirt and socks recently. πŸ‘• 🧦 πŸ˜€

I did not finish this project, but it was a good start.

On this day ABELTJE sat with us and I worked with him on automating the build of his Docker images via GitHub Actions. The actions now push images to the MetaCPAN Docker Hub account, which is a vital step in deploying on his behalf.

Perhaps the most exciting news is that I finally got the Elasticsearch snapshot restore working. I had gotten some help via email from the Developer Relations person at Elastic and this set me on the right path. Basically I needed to provide an extra key in the JSON I was sending to register the bucket. I don’t think this key was specifically mentioned in the docs, but I stumbled over something that gave me the idea to try. I’m happy to say that we now have a very large amount of data in the Elastic cloud, which will make it much easier for us to move ahead with future upgrades.

My abject failure to meet the moment when it came to writing a few curl commands had left me wondering if I had any purpose at all being in the same room with people who are smart enough that they surely would never find themselves stymied by such a banal task. I try not to let my professional life define my self worth, but this one had been messing with my mind. However, now buoyed by my victory over AWS, Java and a possible gap in documentation, I was once more fighting fit. I was, indeed, The King of the World.

Soon it was time to celebrate with food. I like to make it a point to try local cuisine and, on this evening, a group of us headed out to for a traditional Portuguese dinner. Joel found us a venue using Google Maps, assuring us with great confidence that he was quite skilled in this regard. He did, in fact, lead us to a very nice restaurant. As we were seated it became clear that the restaurant was Spanish. As we pondered our options for paella, Joel helpfully pointed out that Spain was at least geographically quite close.

Day 3

On this day I began by revisiting the test coverage work. We could have moved on without it, but to be honest, it was really bugging me that I couldn’t figure it out. It took some messing around to get this to work. It’s essentially installing Devel::Cover inside a Docker container and then running the tests via docker compose. Once that is done we install Devel::Cover and some libraries required by Codecov outside of Docker. We then generate and upload the report from outside of the container. It’s easier to upload reports from outside of the container, because there we have all of the CircleCI environment variables which are required at upload time.

That’s all working nicely now and I’m quite happy with it. I’m also a little surprised at some of the code coverage gaps we have. πŸ˜… Kudos to PJCJ for continuing to make this one of the most helpful Perl modules ever.

A side effect of this work is that I was able to spend some time looking at the CircleCI docs, comparing their current open source offering with our current usage. I realized that we could bump our VM size from medium to large. This decreases the build time by about 30%, reducing the build from ~20 minutes to ~14 minutes. There may be some more speed gains to be had, but this was a great improvement to start with.

I also spent a bit of time on administrative work, reaching out to TPRF to secure email hosting for, as we don’t want to email in future when the domain name is transferred to TPRF. We had transferred the MetaCPAN domain name to TPRF a number of years ago in order to reduce the bus number on our project. I think that was a good approach.

I also began the work of configuring the API to talk to the new Elasticsearch in the cloud. Currently the API allows for the Elasticsearch connection to be set via:

  • a series of Apache-style config files which are merged via Config::ZOMG
  • a series of .pl files which are evaled and then merged into a HashRef
  • environment variables
  • some hardcoded defaults

That’s kind of fun. These things evolve organically over time and there are good reasons for all of them to exist, but that doesn’t make them easy to work with or necessarily easy to understand. I began tearing down a lot of this config and moving everything to the Apache-style configs which Catalyst is expecting. I don’t love this, but it’s better to have this logic in one place. I ended up with a giant “Work in Progress” commit which I pushed to GitHub. It breaks things and I haven’t figured all of it out yet. Over the next little while I’ll probably tease that apart into smaller chunks that can be committed as a series of pull requests. I wasn’t all that hopeful that a scorched earth approach would “just work”, but you never know. I’m generally encouraged by the progress of this work, though.

The Sponsors

This event wouldn’t take place without the financial backing of our wonderful sponsors. I’d like to thank the following donors for making this event a reality:, The Perl and Raku Foundation, Deriv, cPanel, Inc, Japan Perl Association, Perl-Services, Simplelists Ltd, Ctrl O Ltd, Findus Internet-OPAC, Harald Joerg, Steven Schubiger. In kind sponsors: Fastmail, Grant Street Group, Deft, Procura, Healex GmbH, SUSE, Zoopla.

The Attendees

As pictured below, this year we had Leo Lapworth, Graham Knop, Olaf Alders and Mickey Nasriachi in attendance to work on MetaCPAN. Not pictured is Joel Berger. He’s missing because this picture is from 2023. Β―\_(ツ)_/Β―

We once again missed Shawn Sorichetti very much, as he was unable to attend.

the MetaCPAN team

Photo Β© Salve J. Nilsen, 2023, CC-BY-NC-4.0

Welcome to Our Newest Sponsor

As mentioned above, Elastic recently joined us as a sponsor. If your company would like to help us continue to make finding Perl modules enjoyable, please do have a look at our sponsorship opportunities and reach out to us at with any questions.


The beach at Cascais

Around 5 PM on the Sunday evening I headed out to Cascais to go for a swim. I had seen the beach on our bike ride and I was excited to visit. The air and water temperature were 17 C. That’s still a bit chilly in the water, but sometimes that’s as good as it gets in Lake Ontario even on a summer day.

My swim on Strava

I hadn’t packed a wetsuit, but I managed around 35 minutes in the water before it became clear that it was time to get out. It was a great experience. I got to feel the salt water in my mouth and on my skin, in addition to taking in some lovely scenery from the water. I was a bit numb when I got out, but eventually the feeling completely returned to my feet. It only required about an hour of waiting, followed by a hot bath.

Heading Home

On Monday morning Leo and I headed across the street to buy a lot of custard tarts to take home. I should note that I ate custard tarts most days that I was there. I ate more than one per day. I even ate them fresh from the shop, when the pastry was particularly flaky and the custard had not yet fully set. It was a special kind of delicious and far better than the tarts I’ve been getting at home. I also learned that you can take them up to the next level by sprinkling a little bit of cinnamon on top. That’s possibly one of the most important things I learned on this trip.

Leo, ABELTJE, LEONT and I headed to the airport around 10 AM. I then got on a plane to CDG in Paris where I spent 3 hours eating pastries, chocolate mousse and browsing. After that it was on to YYZ, arriving around 9 PM and heading back to my normal routine, which included insisting that my kids eat custard tarts before going to bed.

Looking back on the week, I realized that I never had time to deal with (or even acknowledge) jetlag after arrival, because all of the days were filled with activities. On the return trip I started work the next morning and just got back to life as usual. For whatever reason it just worked out. I had one 45 minute nap, face down on my office floor, but other than that no issues. I have no idea why.

Wheels down

That’s a Wrap

I want to thank Breno, Philippe, Laurent and Neil, for all of their work in organising this event. It was incredibly well organized. Portugal had not been on my short list of places to visit, but I’m so glad that I was able to make this trip. It was well worth it.

Aside from having had a most excellent time, I’m mentally in a much better place than before I attended. I wasn’t in a bad place before, but I’m enjoying my work more right now and I’m enjoying chipping away at MetaCPAN. Collectively, we’ve maintained some momentum since PTS has ended and we’re continuing to get work done. It’s one of those side effects of conferences like these. Hopefully you get good work done at the conference, but sometimes the work leading up to and following on from the meetup can be just as important.


How I Spent My Perl Toolchain Summit v2023
·1824 words·9 mins
metacpan perl Programming Perl Toolchain Summit
How I Spent My Perl Toolchain Summit v2019
·3040 words·15 mins
metacpan perl Programming Perl Toolchain Summit
Perl Toolchain Summit 2018 Wrap-up Report
·1664 words·8 mins
metacpan perl Programming Perl Toolchain Summit