Hi Jan,

Le 31/10/2015 23:35, Jan Henning Thorsen a écrit :
Not sure what other results you might expect in a "prefork-environment", vs a single process.
Typically a lack of consistency between workers' data.

Also, in the second case (i.e. specifying an url to run the tests) it would allow to test the product in a different context/setup, and test things like time-outs, or make sure the product has everything needed to work, etc.

--
boris



On Monday, October 26, 2015 at 2:11:03 PM UTC+1, Boris Baldassari wrote:

    Hi all,

    I finally got it working using File::ChangeNofity instead of
    AnyEvent::Filesys::Notify, since it needs less dependencies and is
    good
    enough for my needs. The idea of watching file changes was a
    really good
    one, thanks again to Jan.

    I still have one question to finish that: how could I test the
    thread-safe behaviour? When running the tests (e.g. with myapp.pl
    <http://myapp.pl> test)
    I make the assumption that Mojolicious is using something like morbo,
    that is a single-threaded version of the application. Is there any
    means
    to either:
    * test the app in a preforked context (by launching hypno or prefork
    server instead of a dev one)
    * tell the test run to use an existing web site instead of the
    current dev?

    The last option would be the best, since it would really test the
    app in
    a production context. But I could not find anywhere a way to tell the
    test agent to look for a specific url (where my dev is hosted)... Is
    there one?

    Thanks,

-- Boris



    Le 23/10/2015 21:10, Boris Baldassari a écrit :
    > Le 23/10/2015 12:22, Jan Henning Thorsen a écrit :
    >> If it's not critical that changes in the file is visible
    instantly, you
    >> could do something like this:
    > It's not critical if the changes appears after a few seconds, so
    the
    > idea is good, thank you -- and thanks for the code, which is
    helpful.
    >
    >
    >> This will make the application read the file every 30 second
    and update
    >> the "dashboard" config parameter. The code could also check if the
    >> timestamp of the json file has changed and simply not read the
    content
    >> if mtime is the same.
    > I didn't like the idea of checking a mtime each time I did a
    request
    > to the data -- which would be almost each time a user displays a
    page.
    > Feels like loosing the efficiency of having everything in memory.
    >
    >> Another idea is to use AnyEvent::Filesys::Notify instead of the
    >> recurring timer. (There might be similar solutions, but that
    was the one
    >> that came to mind first)
    > Oh, I didn't know of that one. And really like it, for it
    respects the
    > data/file paradigm for understandability.
    > It may indeed be the best solution, among other things for
    > portability. I will give it a try, and report back to the list
    next week.
    > Really good advice, thanks!
    >
    >
    >> About hot reloading: If you are running both the workers and
    manager as
    >> the same user, then the worker can do initiate hot reload using
    "kill
    >> USR2 => getppid".
    > Yes, smart! Still GTK (Good To Know (tm)).
    >
    > Thanks again,
    >
    >
    > --
    > Boris
    >
    >>
    >>
    >> On Friday, October 23, 2015 at 10:10:46 AM UTC+2, Boris Baldassari
    >> wrote:
    >>
    >>     Hi Jan,
    >>
    >>     The app is a kind of dashboard for sw project assessment,
    and it
    >>     maintains a set of data on software projects (metrics,
    >>     meta-information, etc.). There is an analysis (i.e. an
    update on
    >>     this data) started every day, plus occasional changes on
    user's
    >>     initiative. So the information is not changing *heavily*.
    >>
    >>     My point is I *want* to maintain the data on disk as json
    files,
    >>     because I believe that a data-based process (i.e. having a
    process
    >>     transforming data between known states) is easier to read and
    >>     understand for users and maintainers.
    >>     After giving some thoughts to memcache/redis/etc. I realise
    I would
    >>     have to synchronise the data on disk every time it changes,
    which is
    >>     quite cumbersome and not very reliable.
    >>
    >>     Maybe hot reloading hypnotoad would be the way to go. How
    could I do
    >>     that from the code itself, apart from executing shell
    commands?
    >>
    >>     Another option would be to load the data at startup, and
    write it
    >>     down to the disk on shutdown (through a END sub). Not sure
    about the
    >>     reliability of such a solution though.
    >>
    >>     Any idea would be welcome. Thanks!
    >>
    >>     --
    >>     Boris
    >>
    >>
    >>
    >>     Le jeudi 22 octobre 2015 12:52:07 UTC+2, Jan Henning Thorsen a
    >> écrit :
    >>
    >>         Could you give some more details/examples on what kind of
    >>         information that is changed during run? Also, how often
    does
    >>         this information change?
    >>
    >>         Reason for asking, is that you might come up with a far
    too
    >>         complicated solution for this.
    >>
    >>         In some cases, it would be enough to just change the
    config file
    >>         and then hot reload hypnotoad, but this won't work if
    you're
    >>         changing the config too often. On the other hand,
    reading data
    >>         from memcache/redis/something is probably a better idea
    than
    >>         trying to synchronise information internally between your
    >> workers.
    >>
    >>
    >>         On Wednesday, October 21, 2015 at 12:16:51 PM UTC+2, Boris
    >>         Baldassari wrote:
    >>
    >>             Hi Ben,
    >>
    >>             Thank you for the quick and to-the-point answer. I
    guess it
    >>             won't work either with prefork instead of hypnotoad.
    >>
    >>             I'll have a look at memcache and redis solutions.
    >>
    >>             Thanks again -- I've spent some time on this, so
    it's good
    >>             to have a confirmation/statement to settle the point.
    >>
    >>             Have a great day!
    >>
    >>             --
    >>             boris
    >>
    >>
    >>
    >>             Le mercredi 21 octobre 2015 11:14:42 UTC+2, Ben van
    Staveren
    >>             a écrit :
    >>
    >>                 That won't work - under Hypnotoad every worker
    would end
    >>                 up with it's own copy, and while you would be
    able to
    >>                 update values inside a single worker, it
    wouldn't work
    >>                 across the entire worker pool. Consider using
    memcache
    >>                 or another key/value store that's convenient
    (redis,
    >>                 perhaps) to store information like that, and
    fetch it
    >>                 when required.
    >>
    >>
    >>                 On 10/21/2015 11:10 AM, Boris Baldassari wrote:
    >>>                 Hiho dear Mojo folks,
    >>>
    >>>                 This is my first post here, so I'd like to
    start with
    >>>                 a big thank you all for the work put on
    mojolicious.
    >>>                 It just rocks. :-)
    >>>
    >>>                 I am building a full (not light) app which needs
    >>>                 access to a set of variables (say config)
    stored in a
    >>>                 dedicated module (MyApp::Model::Config). These
    values
    >>>                 do change during the run, and I want all the
    workers
    >>>                 to access the new values. This works very well in
    >>>                 morbo, but as soon as I start using hypnotoad the
    >>>                 values are not updated for all workers. As a
    >>>                 consequence, depending on the worker serving your
    >>>                 request you get either old or new values
    randomly.
    >>>
    >>>                 I started with a singleton helper put directly
    in the
    >>>                 startup method:
    >>>                 |
    >>>                 $app->helper(repo =>sub{state $config
    >>>                 =MyApp::Model::Config->new($app)});
    >>>                 |
    >>>                 This doesn't resolve the issue.
    >>>
    >>>                 Then I read about similar problems with db
    connection
    >>>                 handles, and I decided to move them out of the
    startup
    >>>                 method and I added some has attributes, still
    in the
    >>>                 MyApp.pl class:
    >>>                 |
    >>>                 has my_config =>sub{state $config
    >>>                 =MyApp::Model::Config->new($app);};
    >>>                 |
    >>>                 But it still doesn't work.
    >>>
    >>>                 So, how should I do that? Any advice on the
    design or
    >>>                 code itself is welcome...
    >>>
    >>>                 Thanks in advance,
    >>>
    >>>                 --
    >>>                 Boris
    >>>                 --
    >>>                 You received this message because you are
    subscribed
    >>>                 to the Google Groups "Mojolicious" group.
    >>>                 To unsubscribe from this group and stop receiving
    >>>                 emails from it, send an email to
    >>> [email protected].
    >>>                 To post to this group, send email to
    >>> [email protected].
    >>>                 Visit this group at
    >>> http://groups.google.com/group/mojolicious
    <http://groups.google.com/group/mojolicious>
    >>> <http://groups.google.com/group/mojolicious
    <http://groups.google.com/group/mojolicious>>.
    >>>                 For more options, visit
    >>> https://groups.google.com/d/optout
    <https://groups.google.com/d/optout>
    >>>                 <https://groups.google.com/d/optout
    <https://groups.google.com/d/optout>>.
    >>
    >> --
    >> You received this message because you are subscribed to a topic
    in the
    >> Google Groups "Mojolicious" group.
    >> To unsubscribe from this topic, visit
    >>
    https://groups.google.com/d/topic/mojolicious/T9uH9a14CHM/unsubscribe
    <https://groups.google.com/d/topic/mojolicious/T9uH9a14CHM/unsubscribe>.

    >> To unsubscribe from this group and all its topics, send an
    email to
    >> [email protected]
    <mailto:mojolicious%[email protected]>
    >> <mailto:[email protected]
    <mailto:mojolicious%[email protected]>>.
    >> To post to this group, send email to
    [email protected] <mailto:[email protected]>
    >> <mailto:[email protected]
    <mailto:[email protected]>>.
    >> Visit this group at http://groups.google.com/group/mojolicious
    <http://groups.google.com/group/mojolicious>.
    >> For more options, visit https://groups.google.com/d/optout
    <https://groups.google.com/d/optout>.

--
You received this message because you are subscribed to a topic in the Google Groups "Mojolicious" group. To unsubscribe from this topic, visit https://groups.google.com/d/topic/mojolicious/T9uH9a14CHM/unsubscribe. To unsubscribe from this group and all its topics, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.
Visit this group at http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to