An error occurred fetching the project authors.
  1. 05 Jun, 2020 1 commit
  2. 25 May, 2020 1 commit
  3. 26 Dec, 2019 1 commit
    • Vincent Pelletier's avatar
      CMFActivity.ActivityTool: Use uid for identity check instead of oid. · 06aee0c2
      Vincent Pelletier authored
      uids are a way one can signal that different objects (from a ZODB point of
      view, and hence an oid point of view) are actually to be considered as the
      same objet (from a higher abstration point of view). For example, another
      variant of the same object, as imported over an older variant.
      In turn, this allows extending the protection to activities spawned from
      brains, and not just from live objects.
      06aee0c2
  4. 14 Nov, 2019 1 commit
  5. 13 Nov, 2019 1 commit
  6. 13 Sep, 2019 2 commits
  7. 25 Jul, 2019 1 commit
    • Vincent Pelletier's avatar
      CMFActivity.ActivityTool: Set exc_type default value. · 3123e1a9
      Vincent Pelletier authored
      This property is only conditionally set, which causes distracting error
      when something goes wrong. If we really want to check that the expected
      code path was followed there has to be a better check and a more debugging-
      friendly error than an AttributeError.
      3123e1a9
  8. 28 Jun, 2019 1 commit
  9. 24 Jun, 2019 2 commits
  10. 24 May, 2019 1 commit
  11. 22 May, 2019 2 commits
  12. 21 May, 2019 2 commits
  13. 13 Mar, 2019 1 commit
  14. 21 Feb, 2019 2 commits
    • Julien Muchembled's avatar
    • Julien Muchembled's avatar
      CMFActivity: new activate() parameter to prefer executing on the same node · 301962ad
      Julien Muchembled authored
      The goal is to make better use of the ZODB Storage cache. It is common to do
      processing on a data set in several sequential transactions: in such case, by
      continuing execution of these messages on the same node, data is loaded from
      ZODB only once. Without this, and if there are many other messages to process,
      processing always continue on a random node, causing much more load from ZODB.
      
      To prevent nodes from having too much work to do, or too little compared to
      other nodes, this new parameter is only a hint for CMFActivity. It remains
      possible for a node to execute a message that was intended for another node.
      
      Before this commit, a processing node selects the first message(s) according to
      the following ordering:
      
        priority, date
      
      and now:
      
        priority, node_preference, date
      
      where node_preference is:
      
        -1 -> same node
         0 -> no preferred node
         1 -> another node
      
      The implementation is tricky for 2 reasons:
      - MariaDB can't order this way in a single simple query, so we have 1
        subquery for each case, potentially getting 3 times the wanted maximum of
        messages, then order/filter on the resulting union.
      - MariaDB also can't filter efficiently messages for other nodes, so the 3rd
        subquery returns messages for any node, potentially duplicating results from
        the first 2 subqueries. This works because they'll be ordered last.
        Unfortunately, this requires extra indices.
      
      In any case, message reservation must be very efficient, or MariaDB deadlocks
      quickly happen, and locking an activity table during reservation reduces
      parallelism too much.
      
      In addition to better cache efficiency, this new feature can be used as a
      workaround for a bug affecting serialiation_tag, causing IntegrityError when
      reindexing many new objects. If you have 2 recursive reindexations for both a
      document and one of its lines, and if you have so many messages than grouping
      is split between these 2 messages, then you end up with 2 nodes indexing the
      same line in parallel: for some tables, the pattern DELETE+INSERT conflicts
      since InnoDB does not take any lock when deleting a non-existent row.
      
      If you have many activities creating such documents, you can combine with
      grouping and appropriate priority to make sure that such pair of messages won't
      be executed on different nodes, except maybe at the end (when there's no
      document to create anymore; then activity reexecution may be enough).
      For example:
      
        from Products.CMFActivity.ActivityTool import getCurrentNode
        portal.setPlacelessDefaultReindexParameters(
          activate_kw={'node': 'same', 'priority': priority},
          group_id=getCurrentNode())
      
      where `priority` is the same as the activity containing the above code, which
      can also use grouping without increasing the probability of IntegrityError.
      301962ad
  15. 05 Feb, 2019 4 commits
    • Julien Muchembled's avatar
      CMFActivity: remove old skin if any · afaa9d19
      Julien Muchembled authored
      afaa9d19
    • Julien Muchembled's avatar
      CMFActivity: remove processing/processing_date columns and improve watchers · 499d8f8b
      Julien Muchembled authored
      The original goal was to improve performance by removing the
      `processing_node_processing` index and the queries that modified
      these 2 useless columns.
      499d8f8b
    • Julien Muchembled's avatar
    • Julien Muchembled's avatar
      CMFActivity: validate a message with a single SQL request per queue · 7e387bcb
      Julien Muchembled authored
      As shown in the following example, on a big catalog table,
      MariaDB is able to use several indices at the same time
      ('...' are obfuscated unique values):
      
        > analyze select SQL_NO_CACHE uid, relative_url from catalog where reference='...' OR relative_url='...';
        +------+-------------+---------+-------------+------------------------+------------------------+---------+------+------+--------+----------+------------+--------------------------------------------------+
        | id   | select_type | table   | type        | possible_keys          | key                    | key_len | ref  | rows | r_rows | filtered | r_filtered | Extra                                            |
        +------+-------------+---------+-------------+------------------------+------------------------+---------+------+------+--------+----------+------------+--------------------------------------------------+
        |    1 | SIMPLE      | catalog | index_merge | Reference,relative_url | Reference,relative_url | 768,767 | NULL |    2 |   2.00 |   100.00 |     100.00 | Using union(Reference,relative_url); Using where |
        +------+-------------+---------+-------------+------------------------+------------------------+---------+------+------+--------+----------+------------+--------------------------------------------------+
        1 row in set (0.00 sec)
      
      So mixing different dependency types with OR should be fine
      (no need to split into more subqueries and join with UNION).
      7e387bcb
  16. 18 Jan, 2019 2 commits
  17. 03 Jul, 2018 2 commits
  18. 20 Jun, 2018 1 commit
  19. 16 May, 2018 1 commit
  20. 26 Apr, 2018 1 commit
  21. 06 Mar, 2018 2 commits
  22. 19 Feb, 2018 1 commit
  23. 29 Jun, 2017 1 commit
  24. 21 Apr, 2017 1 commit
  25. 23 Dec, 2016 1 commit
  26. 12 Jan, 2016 3 commits
  27. 28 Oct, 2015 1 commit