Long gen_server init question (not about order of messages :)

Ali Sabil ali.sabil@REDACTED
Sun May 16 11:57:42 CEST 2021


Did you consider changing the overall architecture and use 1 process for
each request?

On Sun, 16 May 2021 at 07:53, Stanislav Ledenev <s.ledenev@REDACTED> wrote:

> I know about hanle_continue but my question is not about long init()
> function.
> To make it simpler it is about long-running functions inside of
> handle_continue.
> It may be possible to spawn those functions in different processes but it
> is not
> desirable because of requirements.
>
> mod_func is quite general (general like a library) and should not know
> about
> anything specific outside of it. Passing to mod_func something like
> 'reply_to' reference
> could be possible but it is fragile - response side could be not ready at
> the
>  moment of replying and this *single* notification would just vanish.
> So notification from mod_func to mod_api is the same problem but from the
> other side.
>
> вс, 16 мая 2021 г. в 02:50, Leonard B <leonard.boyce@REDACTED>:
>
>> Why not notify mod_api from mod_func once it's initialized. If you wanted
>> mod_func initialization to be non-blocking you could use handle_continue.
>>
>> Kind regards,
>> Leonard
>>
>>
>> On Sat, May 15, 2021, 14:55 Stanislav Ledenev <s.ledenev@REDACTED>
>> wrote:
>>
>>> Hi!
>>> Need advice from an experienced community about synchronizing long
>>> initializing gen_server with other parts of application.
>>>
>>> Let's say we have 4 gen_servers:
>>> * mod_api       - accept requests;
>>> * mod_func      - real job;
>>> * mod_x, mod_y  - users of mod_func.
>>>
>>> mod_api accepts requests and transforms them to calls to mod_x, mod_y.
>>> mod_func is crucial for the application but it needs a time consuming
>>> procedure
>>> of initialization. IRL it is some cryptography related stuff.
>>> While mod_func is in the initialization state, mod_api must return
>>> 'not_ready' for all requests.
>>> While mod_func initializing it is not available for any requests.
>>>
>>> I was thinking about options of notification mechanism implementation
>>> and see two of them:
>>> 1. Some kind of polling from mod_api to mod_func with gen_server:call
>>> with timeout: mod_api after initialization begin send_after loop with
>>> timeout call to mod_func;
>>> 2. gen_event based solution. Run up gen_event and wait for notification
>>> about readiness of mod_func.
>>>
>>> Am I missing something? Are there any better solutions for such a task?
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20210516/36405ec2/attachment.htm>


More information about the erlang-questions mailing list