1. 17 Jul, 2023 1 commit
  2. 26 May, 2023 1 commit
  3. 24 May, 2023 1 commit
    • Kirill Smelkov's avatar
      Remove unused ZODB.tests.warnhook · 8a7e3162
      Kirill Smelkov authored
      The last usage of WarningsHook was removed in 2011 in f1b04dd8 (Lots of
      code cleanups.). And when we need to capture warnings there is
      `warnings.catch_warnings` that is available out of the box from stdlib
      on both py2 and py3.
      8a7e3162
  4. 04 May, 2023 1 commit
  5. 18 Apr, 2023 3 commits
    • Dieter Maurer's avatar
      Merge pull request #380 from zopefoundation/racetest · 30c861dc
      Dieter Maurer authored
      `racetest` improvement
      30c861dc
    • dieter's avatar
      ca41ccd1
    • Kirill Smelkov's avatar
      racetest: Review 2 · 2d456463
      Kirill Smelkov authored
      - Rename `TestGroup` -> `TestWorkGroup`. I originally named it as just
        WorkGroup similarly to sync.WorkGroup in pygolang, but later added
        "Test" prefix to highlight the difference that this class manages
        working group of threads that take part in tests, instead of group of
        arbitrary threads. However in that process I dropped the "Work" part
        which turned the name to be somewhat ambiguous: it is not clear whether
        "TestGroup" is a group of threads serving one test, or a group of
        separate tests without any relation to threading. To remove the
        ambiguity let's restore the "Work" in the name so that both "Test" and
        "WorkGroup" are there.
      
      - Review test_racetest.py a bit:
      
        * make it a bit more robust by increasing "ok" timeout from 0.1s to 10s.
          in my experience 0.1s is too little and will regularly hit "timeout"
          when CI machines are overloaded. I'm still somewhat uncomfortable
          with 0.1s timeout we left in tests that exercise timeout handling,
          but let's leave it as is for now and see how it goes.
      
        * add test for cases when only one thread fails out of many, and when
          several threads fail too.
      
        * minor cosmetics.
      
      - spellcheck.
      2d456463
  6. 17 Apr, 2023 3 commits
  7. 15 Apr, 2023 1 commit
  8. 14 Apr, 2023 1 commit
    • Kirill Smelkov's avatar
      racetest: Review · f2335127
      Kirill Smelkov authored
      - Factor common logic to spawn and run group of test threads into
        TestGroup. This way the extra checks and robustness improvements, that
        Dieter just added to check_race_external_invalidate_vs_disconnect,
        become available to all tests in racetest module.
      
        Rework moved code so that nwork is not fixed beforehand and test threads
        can be added dynamically.
      
      - fix waiting logic in Finished:
        * on py2 Condition.wait does not return True/False as it does on py3 -
          we need to manually inspect the state.
        * fix race for when wait is called with already met condition:
          previously in such case it was waiting indefinitely and reporting
          failure on timeout
      
      - rename Finished to well-established concept of WaitGroup and adjust
        its interface accordingly (see
        https://pkg.go.dev/sync#WaitGroup,
        https://lab.nexedi.com/nexedi/pygolang/blob/master/golang/sync.py and
        https://lab.nexedi.com/nexedi/pygolang/blob/39dde7eb/golang/sync.cpp#L153-200)
      
      - no need to wrap try/except with additional try/finally, as
        try/except/finally works out of the box.
      f2335127
  9. 13 Apr, 2023 4 commits
  10. 28 Mar, 2023 1 commit
  11. 12 Mar, 2023 2 commits
  12. 06 Feb, 2023 1 commit
  13. 03 Feb, 2023 5 commits
  14. 09 Nov, 2022 4 commits
  15. 08 Nov, 2022 4 commits
  16. 02 Sep, 2022 1 commit
  17. 01 Sep, 2022 1 commit
  18. 31 Aug, 2022 3 commits
  19. 18 Aug, 2022 1 commit
  20. 15 Aug, 2022 1 commit
    • Kirill Smelkov's avatar
      racetest: Add test for disconnect / invalidation race · fc20f3aa
      Kirill Smelkov authored
      This currently fails for ZEO (see Bug2 in
      https://github.com/zopefoundation/ZEO/issues/209 for details):
      
          (z-dev) kirr@deca:~/src/wendelin/z/ZEO5$ ZEO_MTACCEPTOR=1 zope-testrunner -fvvvx --test-path=src -t check_race_external_invalidate_vs_disconnect
          /home/kirr/src/wendelin/venv/z-dev/bin/zope-testrunner traceio=True
          /home/kirr/src/wendelin/z/ZEO5/src/ZEO/StorageServer.py:51: DeprecationWarning: The mtacceptor module is deprecated and will be removed in ZEO version 6.
            'in ZEO version 6.', DeprecationWarning)
          Running tests at level 1
          Running .BlobAdaptedFileStorageTests tests:
            Set up .BlobAdaptedFileStorageTests in 0.000 seconds.
            Running:
           check_race_external_invalidate_vs_disconnect (ZEO.tests.testZEO.BlobAdaptedFileStorageTests) (1.889 s)
      
          Failure in test check_race_external_invalidate_vs_disconnect (ZEO.tests.testZEO.BlobAdaptedFileStorageTests)
          Traceback (most recent call last):
            File "/usr/lib/python2.7/unittest/case.py", line 329, in run
              testMethod()
            File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/racetest.py", line 357, in check_race_external_invalidate_vs_disconnect
              T2ObjectsInc2Phase())
            File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/util.py", line 400, in _
              return f(*argv, **kw)
            File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/racetest.py", line 446, in _check_race_xxx_vs_external_disconnect
              self.fail('\n\n'.join([_ for _ in failure if _]))
            File "/usr/lib/python2.7/unittest/case.py", line 410, in fail
              raise self.failureException(msg)
          AssertionError: T15: obj1 (6) - obj2(4) != phase (1)
          obj1._p_serial: 0x03ea4cc505486777  obj2._p_serial: 0x03ea4cc503413799  phase._p_serial: 0x03ea4cc505486777
          zconn_at: 0x03ea4cc505486777  # approximated as max(serials)
          zstor.loadBefore(obj1, @zconn.at)       ->  serial: 0x03ea4cc505486777  next_serial: None
          zstor.loadBefore(obj2, @zconn.at)       ->  serial: 0x03ea4cc504a74099  next_serial: None
          zstor.loadBefore(phase, @zconn.at)      ->  serial: 0x03ea4cc505486777  next_serial: None
          zstor._cache.clear()
          zstor.loadBefore(obj1, @zconn.at)       ->  serial: 0x03ea4cc505486777  next_serial: None
          zstor.loadBefore(obj2, @zconn.at)       ->  serial: 0x03ea4cc504a74099  next_serial: 0x03ea4cc506104155
          zstor.loadBefore(phase, @zconn.at)      ->  serial: 0x03ea4cc505486777  next_serial: 0x03ea4cc506104155
      
          T51: obj1 (6) - obj2(4) != phase (1)
          obj1._p_serial: 0x03ea4cc505486777  obj2._p_serial: 0x03ea4cc503413799  phase._p_serial: 0x03ea4cc505486777
          zconn_at: 0x03ea4cc505486777  # approximated as max(serials)
          zstor.loadBefore(obj1, @zconn.at)       ->  serial: 0x03ea4cc505486777  next_serial: None
          zstor.loadBefore(obj2, @zconn.at)       ->  serial: 0x03ea4cc503413799  next_serial: None
          zstor.loadBefore(phase, @zconn.at)      ->  serial: 0x03ea4cc505486777  next_serial: None
          zstor._cache.clear()
          zstor.loadBefore(obj1, @zconn.at)       ->  serial: 0x03ea4cc505486777  next_serial: None
          zstor.loadBefore(obj2, @zconn.at)       ->  serial: 0x03ea4cc504a74099  next_serial: None
          zstor.loadBefore(phase, @zconn.at)      ->  serial: 0x03ea4cc505486777  next_serial: None
      fc20f3aa