FSM хорош, но если что-то попроще на уровне gen_server, то в init назначаете в State status:starting, запускаете через spawn_monitor процесс инициализации (c self(), ref и параметрами инициализации), завершаете init. На все запросы во время инициализации проверяете State на status starting, сообщаете, что извини, пока не готов. Этот отдельный процесс после инициализации отдает через месседж запустившему все параметры состояния вплоть до ets (для этого есть спец функция). Зпустивший получает их через hadle_info, назначает параметры State, status назанчает в состояние working. Останавливать можно точно так же.