undo_retention = x is like you saying to us,
"As a guide, I'm letting you know two things
- I'm unlikely to ask for data older than 'x'
- Once undo is older than 'x', I dont mind if you ditch/resuse it"
So if your undo retention is set to 900, whilst we wont *aggresively* go hunting around for anything older than that...BUT at the same time, we'll have no compunction to hang on it to either. We wont create/consume *more* undo space, because its generally quicker and more efficient for us to recycle stuff that is now out of date ... because after all, you *told* us we could reuse it :-)
So it *might* take only a few small new transactions to grab (and reuse) some older undo information that just happened to be important to your datapump job. By the same token, those few transactions might have just as likely grabbed some other undo slots and left the ones you needed untouched. Bit of a lottery there - so if your export runs for 'n' seconds, and you *always* want it to work, you'd strongly consider having undo_retention of at least that.
There's somewhat of an irony here - because datapump jobs themselves perform transactions :-)
A nice Oracle magazine article on the topic here
https://asktom.oracle.com/magazine-archive.htm