NameNode startup progress is supposed to be immutable after startup has completed. All methods are coded to ignore update attempts after startup has completed. However, StartupProgress#getCounter does not implement this correctly. If a caller attempts to get a counter for a new step that hasn't been seen before, then the method accidentally creates the step. This allocates additional space in the internal tracking data structures, so ultimately this is a memory leak.