For the first time in five years, Leinster end the season empty-handed.

This time two weeks ago, the vieux port in Marseille was thronged with blue fans on the eve of the Champions Cup final, most of whom felt the double was more probable than possible.

But 13 days on from their painful defeat to La Rochelle, they have been once again humbled and deservingly so by a Bulls team that outplayed them at the RDS.

Eight months ago, the prospect of the Bulls doing this seemed laughable, swatted aside by Leinster in Round 1 before a hammering by Connacht at the Sportsground.

The fact that 12 of tonight's starting line-up began that opening URC game against Leinster speaks volumes for the their growth through the season.

Leinster struggled to deal with their relentless physicality in both carry and tackle, with their phenomenal back row of Marcell Coetzee, Arno Botha and Elrigh Louw, as well as hooker Johan Grobbelaar tormenting the defending champions all day.

The home side played some lovely rugby at times, and their third try in the 70th minute from Rory O'Loughlin saw all seven backs touch the ball in a single phase, but it was a performance riddled with inaccuracies.

Two failed lineouts close to the Bulls line in the space of a couple of minutes midway through the second half killed their momentum, while Morne Steyn's penalty to ice the game on 74 minutes summed up the inaccuracies in Leinster's display, Ross Molony knocking on the simplest of passes, before being penalised for holding onto the ball on the ground.

For most sides, a final and a semi-final would be a solid campaign, but not for Leinster, who now go back to the drawing board.

The bigger fear is that the Bulls, not to mention the other South African franchises, are likely to be even better next year.

In last week's quarter-final Leinster were sluggish in the early stages, but they set their stall out early this evening, and went hard at the Bulls line for the opening five minutes, having gained territory through an offside from former Munster man Arno Botha.

After their maul was stopped in the 22, Leinster kept things simple with multiple phases of pick-and-go, but when Joe McCarthy was knocked back with a big tackle, Henshaw found himself stripped of the ball by Coetzee, before scrum-half Zak Burger cleared the danger.

It was a big defensive stop that seemed to buoy the Bulls, but on eight minutes Leinster got the breakthrough, albeit with a touch of fortune.

Ross Byrne pierced a lovely grubber kick to the corner from the centre of the pitch, and as he chased it back winger Madosh Tambwe slipped, giving O'Loughlin just enough of an edge in the race.

O'Loughlin couldn't win the ball clean, but disrupted things just enough for it to slip through the legs of the scrambling full-back David Kriel, and Sheehan pounced to score his 10th try of the season.

Byrne converted, but the Bulls pegged it back to 7-3 on 13 minutes with a Chris Smith penalty, after Caelan Doris was penalised for not releasing the ball-carrier.

Six minutes later, the visitors hit the front, despite needing two swings of the bat to do it.

It looked like they'd got in for a try initially when 19-year-old Canan Moodie dived over after a sustained period of big carries from Coetzee, Louw and Botha, but the wing's unnecessary one-handed touchdown was knocked on over the line, despite being under no pressure. Luckily for him, his forwards came to the rescue.

With the try disallowed, play came back for a Bulls penalty, and after opting to tap-and-go from five metres out, a wonderfully worked switch from Louw to Johan Grobbelaar saw the hooker crash over to score.

Smith converted to put the Bulls 10-7 in front, and it was becoming clear that Leinster were struggling to deal with the visitors' power.

Another penalty, this time conceded by O'Loughlin, led to another attacking platform in the 22 for the South Africans, and moments later they barged in for their second try, as Coetzee dived in from close range, with Smith's conversion making it 17-7 as the clock hit 24 minutes.

It was just what the game needed, Leinster taking that hit on the chin and coming back for more.

They struck back on 31 minutes in a move started and finished by Henshaw, the centre showing off the beautiful and the brutal elements of his game inside a wonderful 30-second spell.

It started as he carried to the gainline before sweeping a blind pass behind his back to send Jordan Larmour coursing around the corner to bring them within 10 metres of the line.

Two phases later the Ireland international took the direct route, crashing onto a Gibson-Park pass to force his way over the line, with a second Byrne conversion cutting the deficit back to 17-14.

Both sides were up for the fight, and just to ratchet up the tension a bit more the blue skies turned dark and the rain bucketed down for the final minutes of an enthralling first half, which ended with Byrne tapping a kick into touch, Josh van der Flier's turnover getting Leinster out of a hole after a mistake from Jimmy O'Brien.

By the time the second half started, the rain had cleared but it had left its mark, Henshaw spilling the ball straight off the restart to hand the Bulls an instant possession deep in the 22.

Leinster held firm in the scrum, before the visitors set about the pick-and-go game, edging their way towards what looked like being an inevitable try.

But after close to 20 phases of disciplined defence, Leinster made a crucial stop, a combination of Joe McCarthy and Andrew Porter winning them a penalty under their own posts.

It was a penalty that was greeted as loudly by the RDS crowd as either of the Leinster tries, and when the Bulls infringed a minute later, the hosts found themselves on the attack. But just like the hosts, the visitors' defence stood tall, eventually killing the Leinster territory with a scrum penalty on 50 minutes.

Penalties were becoming the most valuable currency, and when Van der Flier put in a high tackle, it ultimately resulted in a third Bulls try. Kicking to the corner, they instantly set their maul to work, and stampeded its way to the line before being hauled down, referee Andrew Piardi having no hesitation in awarding a penalty try, and sending James Ryan to the sin-bin.

24-14 down and reduced to 14 men, Leo Cullen sent up the bat-signal, calling in Johnny Sexton from the replacements bench on 53 minutes.

They were almost further behind shortly after, O'Brien's clearing kick was blocked down by Harold Vorster, but the centre slipped on the greasy pitch, as the Leinster full-back scampered back to cover.

Sexton's introduction turned up the heat, and the Ireland captain soon found himself trading shoves with two of his old Munster and Leinster opponents Botha and Coetzee. But while Leinster's physicality went up a notch, the Bulls matched it.

Just like the Champions Cup final, they were ruing inaccuracies, as Sheehan failed to find Ross Molony and Ryan at consecutive five metre lineouts, scuppering two golden opportunities in the space of two minutes.

With 10 minutes to go, just as the game seemed to be drifting away, they gave themselves a lifeline.

Hitting the tail of the lineout in midfield, Sexton found Henshaw whose lovely inside pass set Larmour through a gap, before passes between Ringrose and O'Brien led to O'Loughlin diving over in the corner, all seven members of the backline touching the ball in one marvelous phase of play.

Sexton's conversion drifted wide, but Leinster were back in with a chance, trailing 24-19, and with just under 10 minutes to chase it down.

The grandstand finish never arrived. When Molony knocked on a simple pass, and then held onto the ball on the ground it allowed Morne Steyn put two scores between the sides, his penalty sending the Bulls 27-19 in front.

And while Leinster kept fighting, Cian Healy's late try was just a consolation, the clock already in the red, and the Bulls already secure in the final.

Jake White's side could be back in Ireland again next week, pending the outcome of tomorrow's semi between the Stormers and Ulster. If they play like this, it's hard to see past them winning.

Leinster: Jimmy O'Brien; Jordan Larmour, Garry Ringrose, Robbie Henshaw, Rory O'Loughlin; Ross Byrne, Jamison Gibson-Park; Andrew Porter, Dan Sheehan, Tadhg Furlong; Joe McCarthy, James Ryan (capt), Caelan Doris, Josh van der Flier, Jack Conan.

Replacements: Seán Cronin, Cian Healy, Michael Ala’alatoa, Ross Molony, Rhys Ruddock, Luke McGrath, Johnny Sexton, Ciarán Frawley.

Vodacom Bulls: Canan Moodie; David Kriel, Cornal Hendricks, Harold Vorster, Madosh Tambwe; Chris Smith, Zak Burger; Gerhard Steenekamp, Johan Grobbelaar, Mornay Smith; Walt Steenkamp, Ruan Nortje; Marcell Coetzee (capt), Arno Botha, Elrigh Louw.

Replacements: Bismarck du Plessis, Simphiwe Matanzima, Robert Hunt, Janko Swanepoel, WJ Steenkamp; Embrose Papier, Morne Steyn, Kurt-Lee Arendse.

Referee: Andrea Piardi (FIR)