TimeoutError from EpicsSignal

One of the chronic problems that plague the APS beam lines from relying on Bluesky for user operations is TimeoutError: Failed to read {some PV} within None sec that happens, seemingly at random.  When this happens, the exception stops the running plans completely.  Keep in mind, such timeouts are not on initial connection but happen after innumerable previous successful EPICS CA monitor updates on the same.  For example, sometimes it fails on the engineering units of an EPICS motor (motor.EGU) that, on point number 47 of a step scan, raises a TimeoutError.  The previous steps did not raise this error.
In [15]: si3.hgap
Out[15]: EpicsMotor(prefix='8idi:Slit3Hsize', name='si3_hgap', parent='si3', settle_time=0.0, timeout=None, read_attrs=['user_readback', 'user_setpoint'], configuration_attrs=['user_offset', 'user_offset_dir', 'velocity', 'acceleration', 'motor_egu'])

In [16]: si3.hgapCA.Client.Exception...............................................
    Warning: "Virtual circuit unresponsive"
    Context: "lambda.xray.aps.anl.gov:5064"
    Source File: ../tcpiiu.cpp line 920
    Current Time: Tue Nov 19 2019 15:02:30.072242898
..................................................................
Unexpected problem with CA circuit to server "lambda.xray.aps.anl.gov:5064" was "Connection reset by peer" - disconnecting
CA.Client.Exception...............................................
    Warning: "Virtual circuit disconnect"
    Context: "lambda.xray.aps.anl.gov:5064"
    Source File: ../cac.cpp line 1225
    Current Time: Tue Nov 19 2019 15:03:52.569633839
..................................................................
In [16]: si3.hgap
Out[16]: EpicsMotor(prefix='8idi:Slit3Hsize', name='si3_hgap', parent='si3', settle_time=0.0, timeout=None, read_attrs=['user_readback', 'user_setpoint'], configuration_attrs=['user_offset', 'user_offset_dir', 'velocity', 'acceleration', 'motor_egu'])

/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/epics/ca.py:1459: UserWarning: ca.get('8idi:m54.TDIR') timed out after 1.00 seconds.
  warnings.warn(msg % (name(chid), timeout))
Subscription value callback exception (EpicsSignalRO(read_pv='8idi:m54.DMOV', name='samplestage_x_motor_done_move', parent='samplestage_x', value=1, timestamp=1574696427.776781, auto_monitor=True, string=False))
Traceback (most recent call last):
  File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/ophydobj.py", line 471, in inner
    cb(*args, **kwargs)
  File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/device.py", line 1603, in wrapped
    ret = func(self, *args, **kwargs)
  File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/epics_motor.py", line 246, in _move_changed
    if self.direction_of_travel.get() == 0:
  File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/signal.py", line 830, in get
    raise TimeoutError(f'Failed to read {self._read_pvname} within '
TimeoutError: Failed to read 8idi:m54.TDIR within None sec
In [17]: si3.hgap
Out[17]: EpicsMotor(prefix='8idi:Slit3Hsize', name='si3_hgap', parent='si3', settle_time=0.0, timeout=None, read_attrs=['user_readback', 'user_setpoint'], configuration_attrs=['user_offset', 'user_offset_dir', 'velocity', 'acceleration', 'motor_egu'])

Here is an example from interactive use where the .TDIR (motor target direction changed sign, went the other way) raised a TimeoutError.  ironically, this field is of no use to the bluesky user so this failure is unnecessary, at best (that's an ophyd device configuration issue).  Of concern is the timeout with None sec and why a timeout at all.
By the way,
In [21]: print(APS_utils.print_RE_md(printing=False))
=========== ================================
key         value
=========== ================================
beamline_id APS TRR 8-ID-I
login_id<EMAIL_ADDRESS>pid         7116
proposal_id None
scan_id     210
versions    =========== ========
            key         value
            =========== ========
            apstools    1.1.14
            bluesky     1.5.4
            databroker  0.13.0
            epics       3.4.0
            matplotlib  3.1.0
            numpy       1.16.4
            ophyd       1.4.0rc1
            pyRestTable 2020.0.2
            spec2nexus  2021.1.3
            =========== ========
=========== ================================
In [22]: print(APS_utils.device_read2table(si3.hgap))
====================== ================== ==========================
name                   value              timestamp
====================== ================== ==========================
si3_hgap               15.000060000000001 2019-11-19 14:00:00.379946
si3_hgap_user_setpoint 15.000000000000002 2019-11-19 14:00:00.379946
====================== ================== ==========================

And, another example during a scan:
In [1]:

In [1]: samplestage.x
Out[1]: EpicsMotor(prefix='8idi:m54', name='samplestage_x', parent='samplestage', settle_time=0.0, timeout=None, read_attrs=['user_readback', 'user_setpoint'], configuration_attrs=['user_offset', 'user_offset_dir', 'velocity', 'acceleration', 'motor_egu'])

In [2]: mov scaler1.preset_time 0.1
   ...:

In [3]: RE(bp.rel_scan([scaler1,lakeshore],samplestage.x,-2.0, 2.0, 41))
Transient Scan ID: 211     Time: 2019-11-25 10:14:47
Persistent Unique Scan ID: 'c278bc5b-76ac-4ae5-952c-7a949d036975'
New stream: 'baseline'
Start-of-run baseline readings:
+--------------------------------+--------------------------------+
+--------------------------------+--------------------------------+
New stream: 'aps_current_monitor'
New stream: 'primary'
+-----------+------------+---------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
|   seq_num |       time | samplestage_x |   Timebase |      pind1 |      pind2 | pind3_APD_ |      pind4 |       pdbs |      I_APS |      I0Mon |        APD |    cstar_l |    cstar_h |     oxygen |
+-----------+------------+---------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
|         1 | 10:14:54.4 |      7.584250 |    1000000 |        104 |         77 |          1 |        266 |         59 |      50979 |          2 |          1 |          2 |          0 |          1 |
|         2 | 10:14:55.6 |      7.684250 |    1000000 |        104 |         78 |          1 |        265 |         60 |      50964 |          2 |          1 |          2 |          0 |          1 |
|         3 | 10:14:56.7 |      7.784250 |    1000000 |        104 |         78 |          1 |        266 |         59 |      50960 |          1 |          1 |          1 |          0 |          1 |
|         4 | 10:14:57.9 |      7.884250 |    1000000 |        104 |         78 |          1 |        266 |         60 |      50954 |          3 |          1 |          3 |          0 |          1 |
|         5 | 10:14:59.0 |      7.984250 |    1000000 |        104 |         78 |          1 |        265 |         60 |      50954 |          2 |          1 |          2 |          0 |          1 |
|         6 | 10:15:00.2 |      8.084250 |    1000000 |        104 |         78 |          1 |        265 |         59 |      50953 |          4 |          1 |          5 |          1 |          1 |
|         7 | 10:15:01.3 |      8.184250 |    1000000 |        104 |         78 |          1 |        265 |         60 |      50952 |          0 |          1 |          0 |          0 |          1 |
|         8 | 10:15:02.5 |      8.284250 |    1000000 |        104 |         78 |          1 |        265 |         60 |      50952 |          3 |          1 |          3 |          0 |          1 |
|         9 | 10:15:03.6 |      8.384250 |    1000000 |        104 |         78 |          1 |        265 |         59 |      50952 |          0 |          1 |          0 |          0 |          1 |
|        10 | 10:15:04.7 |      8.484250 |    1000000 |        104 |         78 |          1 |        265 |         59 |      50952 |          0 |          1 |          0 |          0 |          1 |
/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/epics/ca.py:1459: UserWarning: ca.get('8idi:m54.EGU') timed out after 1.00 seconds.
  warnings.warn(msg % (name(chid), timeout))
[E 10:15:08.818 run_engine:1261] Run aborted
    Traceback (most recent call last):
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py", line 1150, in _run
        msg = self._plan_stack[-1].send(resp)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1294, in __call__
        return (yield from plan)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1149, in baseline_wrapper
        return (yield from plan_mutator(plan, insert_baseline))
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 790, in monitor_during_wrapper
        return (yield from plan2)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 848, in fly_during_wrapper
        return (yield from plan2)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 169, in plan_mutator
        raise ex
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 122, in plan_mutator
        msg = plan_stack[-1].send(ret)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/plans.py", line 1023, in rel_scan
        return (yield from inner_rel_scan())
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/utils.py", line 1011, in dec_inner
        return (yield from plan)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1107, in reset_positions_wrapper
        reset()))
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 500, in finalize_wrapper
        ret = yield from plan
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 77, in plan_mutator
        msg = plan_stack[-1].throw(exception)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/utils.py", line 1011, in dec_inner
        return (yield from plan)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 1062, in relative_set_wrapper
        return (yield from plan)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 244, in msg_mutator
        ret = yield msg
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py", line 194, in plan_mutator
        inner_ret = yield msg
      [Previous line repeated 3 more times]
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py", line 1208, in _run
        new_response = yield from coro(msg)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/asyncio/coroutines.py", line 120, in coro
        res = func(*args, **kw)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py", line 1955, in _set
        ret = msg.obj.set(*msg.args, **kwargs)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/positioner.py", line 88, in set
        timeout=timeout)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/utils/epics_pvs.py", line 198, in wrapper
        return fcn(self, *args, **kwargs)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/epics_motor.py", line 149, in move
        status = super().move(position, **kwargs)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/positioner.py", line 189, in move
        settle_time=self._settle_time)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/status.py", line 437, in __init__
        self._unit = getattr(self.pos, 'egu', None)
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/epics_motor.py", line 94, in egu
        return self.motor_egu.get()
      File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/signal.py", line 830, in get
        raise TimeoutError(f'Failed to read {self._read_pvname} within '
    TimeoutError: Failed to read 8idi:m54.EGU within None sec
+-----------+------------+---------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
generator rel_scan ['c278bc5b'] (scan num: 211)

---------------------------------------------------------------------------
TimeoutError                              Traceback (most recent call last)
<ipython-input-3-64bd7e33779e> in <module>
----> 1 RE(bp.rel_scan([scaler1,lakeshore],samplestage.x,-2.0, 2.0, 41))

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    751                     # it (unless it is a canceled error)
    752                     if exc is not None:
--> 753                         raise exc
    754
    755             if self._interrupted:

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1260             self._reason = str(err)
   1261             self.log.exception("Run aborted")
-> 1262             raise err
   1263         finally:
   1264             # Some done_callbacks may still be alive in other threads.

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1148                     else:
   1149                         try:
-> 1150                             msg = self._plan_stack[-1].send(resp)
   1151                         # We have exhausted the top generator
   1152                         except StopIteration:

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in __call__(self, plan)
   1292         plan = monitor_during_wrapper(plan, self.monitors)
   1293         plan = baseline_wrapper(plan, self.baseline)
-> 1294         return (yield from plan)

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in baseline_wrapper(plan, devices, name)
   1147         return (yield from plan)
   1148     else:
-> 1149         return (yield from plan_mutator(plan, insert_baseline))
   1150
   1151

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in monitor_during_wrapper(plan, signals)
    788     plan1 = plan_mutator(plan, insert_after_open)
    789     plan2 = plan_mutator(plan1, insert_before_close)
--> 790     return (yield from plan2)
    791
    792

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in fly_during_wrapper(plan, flyers)
    846     plan1 = plan_mutator(plan, insert_after_open)
    847     plan2 = plan_mutator(plan1, insert_before_close)
--> 848     return (yield from plan2)
    849
    850

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    167                     continue
    168                 else:
--> 169                     raise ex
    170         # if inserting / mutating, put new generator on the stack
    171         # and replace the current msg with the first element from the

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    120             ret = result_stack.pop()
    121             try:
--> 122                 msg = plan_stack[-1].send(ret)
    123             except StopIteration as e:
    124                 # discard the exhausted generator

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/plans.py in rel_scan(detectors, num, per_step, md, *args)
   1021                                 per_step=per_step, md=_md))
   1022
-> 1023     return (yield from inner_rel_scan())
   1024
   1025

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/utils.py in dec_inner(*inner_args, **inner_kwargs)
   1009                 plan = gen_func(*inner_args, **inner_kwargs)
   1010                 plan = wrapper(plan, *args, **kwargs)
-> 1011                 return (yield from plan)
   1012             return dec_inner
   1013         return dec

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in reset_positions_wrapper(plan, devices)
   1105
   1106     return (yield from finalize_wrapper(plan_mutator(plan, insert_reads),
-> 1107                                         reset()))
   1108
   1109

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in finalize_wrapper(plan, final_plan, pause_for_debug)
    498     cleanup = True
    499     try:
--> 500         ret = yield from plan
    501     except GeneratorExit:
    502         cleanup = False

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     75             # if we have a stashed exception, pass it along
     76             try:
---> 77                 msg = plan_stack[-1].throw(exception)
     78             except StopIteration as e:
     79                 # discard the exhausted generator

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/utils.py in dec_inner(*inner_args, **inner_kwargs)
   1009                 plan = gen_func(*inner_args, **inner_kwargs)
   1010                 plan = wrapper(plan, *args, **kwargs)
-> 1011                 return (yield from plan)
   1012             return dec_inner
   1013         return dec

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in relative_set_wrapper(plan, devices)
   1060     plan = plan_mutator(plan, insert_reads)
   1061     plan = msg_mutator(plan, rewrite_pos)
-> 1062     return (yield from plan)
   1063
   1064

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in msg_mutator(plan, msg_proc)
    242                 ret = None
    243                 continue
--> 244             ret = yield msg
    245         except StopIteration as e:
    246             return e.value

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    192         try:
    193             # yield out the 'current message' and collect the return
--> 194             inner_ret = yield msg
    195         except GeneratorExit:
    196             # special case GeneratorExit.  We must clean up all of our plans

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py in _run(self)
   1206                         # exceptions (coming in via throw) can be
   1207                         # raised
-> 1208                         new_response = yield from coro(msg)
   1209
   1210                     # special case `CancelledError` and let the outer

~/.conda/envs/bluesky/lib/python3.7/asyncio/coroutines.py in coro(*args, **kw)
    118         @functools.wraps(func)
    119         def coro(*args, **kw):
--> 120             res = func(*args, **kw)
    121             if (base_futures.isfuture(res) or inspect.isgenerator(res) or
    122                     isinstance(res, CoroWrapper)):

~/.conda/envs/bluesky/lib/python3.7/site-packages/bluesky/run_engine.py in _set(self, msg)
   1953         group = kwargs.pop('group', None)
   1954         self._movable_objs_touched.add(msg.obj)
-> 1955         ret = msg.obj.set(*msg.args, **kwargs)
   1956         p_event = asyncio.Event(loop=self.loop)
   1957         pardon_failures = self._pardon_failures

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/positioner.py in set(self, new_position, timeout, moved_cb, wait)
     86         """
     87         return self.move(new_position, wait=wait, moved_cb=moved_cb,
---> 88                          timeout=timeout)
     89
     90     def stop(self, *, success: bool =False):

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/utils/epics_pvs.py in wrapper(self, *args, **kwargs)
    196     def wrapper(self, *args, **kwargs):
    197         if self.connected:
--> 198             return fcn(self, *args, **kwargs)
    199         else:
    200             raise DisconnectedError('{} is not connected'.format(self.name))

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/epics_motor.py in move(self, position, wait, **kwargs)
    147         self._started_moving = False
    148
--> 149         status = super().move(position, **kwargs)
    150         self.user_setpoint.put(position, wait=False)
    151         try:

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/positioner.py in move(self, position, moved_cb, timeout)
    187
    188         status = MoveStatus(self, position, timeout=timeout,
--> 189                             settle_time=self._settle_time)
    190
    191         if moved_cb is not None:

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/status.py in __init__(self, positioner, target, start_ts, **kwargs)
    435         self.finish_pos = None
    436
--> 437         self._unit = getattr(self.pos, 'egu', None)
    438         self._precision = getattr(self.pos, 'precision', None)
    439         self._name = self.pos.name

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/epics_motor.py in egu(self)
     92     def egu(self):
     93         '''The engineering units (EGU) for a position'''
---> 94         return self.motor_egu.get()
     95
     96     @property

~/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/signal.py in get(self, as_string, connection_timeout, form, **kwargs)
    828         if info is None:
    829             timeout = kwargs.get('timeout', None)
--> 830             raise TimeoutError(f'Failed to read {self._read_pvname} within '
    831                                f'{timeout} sec')
    832

TimeoutError: Failed to read 8idi:m54.EGU within None sec

In [4]:

I suspect this is a bug in ophyd, pyepics, or more specifically the integration between the two (which lives in ophyd). I notice you are running on an ophyd prerelease, 1.4.0rc1. Have you ever seen this on a version in the 1.3.x series?

Yes.  It's time to document this and catch the root cause
On Mon, Nov 25, 2019, 12:45 PM Dan Allan<EMAIL_ADDRESS>wrote:

I suspect this is a bug in ophyd, pyepics, or more specifically the
integration between the two (which lives in ophyd). I notice you are
running on an ophyd prerelease, 1.4.0rc1. Have you ever seen this on a
version in the 1.3.x series?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/bluesky/ophyd/issues/776?email_source=notifications&email_token=AARMUMDUW4EATHSYCCTPR2DQVQMK5A5CNFSM4JRLGCSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEFDMYQI#issuecomment-558287937,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AARMUMBXE7HFB6K2AJZYPADQVQMK5ANCNFSM4JRLGCSA
.

Timeout=None sounds like it comes from ophyd, agree?
On Mon, Nov 25, 2019, 12:53 PM Pete Jemian<EMAIL_ADDRESS>wrote:

Yes.  It's time to document this and catch the root cause
On Mon, Nov 25, 2019, 12:45 PM Dan Allan<EMAIL_ADDRESS>wrote:

I suspect this is a bug in ophyd, pyepics, or more specifically the
integration between the two (which lives in ophyd). I notice you are
running on an ophyd prerelease, 1.4.0rc1. Have you ever seen this on a
version in the 1.3.x series?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/bluesky/ophyd/issues/776?email_source=notifications&email_token=AARMUMDUW4EATHSYCCTPR2DQVQMK5A5CNFSM4JRLGCSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEFDMYQI#issuecomment-558287937,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AARMUMBXE7HFB6K2AJZYPADQVQMK5ANCNFSM4JRLGCSA
.

BUT, this line in the error dump:
  File "/home/beams/8IDIUSER/.conda/envs/bluesky/lib/python3.7/site-packages/ophyd/epics_motor.py", line 246, in _move_changed

calls .get() (from if self.direction_of_travel.get() == 0:) from the underlying pyepics support.  That support should supply a valid default for the timeout kwarg according to this documentation: timeout: maximum time to wait for value to be received.  (default = 0.5 + log10(count) seconds)
Within PyEpics, there are PV objects and Motor objects.  This is a PV object.  The call chain appears to be:

PV.get()     # (no timeout kwarg, becomes  None by default)
-> PV.get_with_metadata()     # (timeout None input)
-> ca.get_with_metadata()     # (timeout=None input)
-> ca.get_complete_with_metadata()    #  (timeout=None input)

Here, timeout is None is handled:
if timeout is None:
    timeout = 1.0 + log10(max(1, count))

and then watches for a timeout.
Is there code in ophyd that raises the TimeoutError exception?  Not seeing that exception from PyEpics.  see this table:

repo
TimeoutError in code

PyEpics
0 instances

ophyd
17 instances

Time to look for the relevant TimeoutError in ophyd.

TimeoutError not raised in ophyd/epics_motor.py, only passed along.  It comes from this set of lines: https://github.com/bluesky/ophyd/blob/9da7884fb764327d2ba3532302b75bb49b7e5872/ophyd/signal.py#L824-L831
In the wrong set of circumstances that trigger our problem, the info object is set to None.  Then, on this line: timeout = kwargs.get('timeout', None) the timeout (not specified) will be reported incorrectly as None.  Shouldn't it be reported based on the actual time waited (since PyEpics has default for timeout=None)?  Could be done with an actual timer here.
The value of the timeout is not the real problem, though, only a symptom.  Why do we get a timeout at all?  First off, though, we don't know how long we have waited.

Actually, why is None being returned from self._read_pv.get_with_metadata()?  PyEpics has called warnings with this code:
    if time.time()-t0 > timeout:
        msg = "ca.get('%s') timed out after %.2f seconds."
        warnings.warn(msg % (name(chid), timeout))
        return None

This code should handle a possible result from warnings.  One way is outlined in the SO post  I suspect this change will help to reveal the underlying problem where self._read_pv.get_with_metadata() returns None.

Here's the simple example from SO:
import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

Using warnings.catch_warnings(record=True) comes at a price we cannot pay while waiting for EPICS PV values to come in from the network environment:

The catch_warnings() manager works by replacing and then later restoring the module’s showwarning() function and internal list of filter specifications. This means the context manager is modifying global state and therefore is not thread-safe.

Perhaps converting these warnings to UserWarning exceptions is thread-safe:
code:
import warnings

def function1():
    for action in ("error", "default"):
        print("-"*20)
        warnings.filterwarnings(action)
        try:
            function2()
            print(f"no exception from action {action}")
        except UserWarning as exc:
            print(f"caught: {exc}")

def function2():
    warnings.warn("example warning message")

function2()
function1()

output:
In [2]: function2()
/home/mintadmin/Apps/anaconda/envs/db-test/bin/ipython:14: UserWarning: example warning message

In [3]: function1()
--------------------
caught: example warning message
--------------------
/home/mintadmin/Apps/anaconda/envs/db-test/bin/ipython:14: UserWarning: example warning message
no exception from action default

In [4]:

One possible revision of https://github.com/bluesky/ophyd/blob/9da7884fb764327d2ba3532302b75bb49b7e5872/ophyd/signal.py#L824-L831 is as follows:
    self.wait_for_connection(timeout=connection_timeout)
    try:
        warnings.filterwarnings("error")
        t0 = time.time()
        info = self._read_pv.get_with_metadata(
                    as_string=as_string, form=form, **kwargs)
    except UserWarning as exc:
        print(f"while getting from {self._read_pvname}, caught '{exc}'")
    finally:
        dt = time.time() - t0
        warnings.filterwarnings("default")

    if info is None:
        timeout = kwargs.get('timeout', None)
        raise TimeoutError(f'Failed to read {self._read_pvname} in '
                           f'{dt:.3f} sec (with timeout={timeout})')

As commented for APS 8-ID-I XPCS, a ...

combination of [connect() or get()] retries and direct ophyd handling of the various timeouts (connection, get, put) is the first hypothesis to resolve this issue.

@kmpeters reported similar experience with PyEpics (not bluesky):

I've seen TimeoutError exceptions in fly-scan python code using pyepics running on Windows at (APS) 34ID-E. The problem occurred infrequently (less frequently than once every few weeks). The PV that was being accessed at the time of the timeout would change each time. Sometimes the timeout was on a get and other times it was on put. The PV that was being accessed when the exception occurred was always available via the command line immediately after the exception occurred. I wrote safer put and get functions that handled the timeout exception and printed info about the problem and I haven't heard from users about the problem since then.
I don't remember the python, pyepics3, and EPICS lib versions. I can look them up on the next shutdown day.

@kmpeters - Can you post a snippet of the safer put() and get() codes?  That would make a great starting point for this issue.

It looks like the latest version of my fly-scan code only has a safer put():
	#
	# Debugging
	#

	def debugPut(self, pv, val, wait=False, use_complete=False, timeout=30.0):
		#
		exitFlag = False

		while ( not exitFlag ):
			try:
				pv.put(val, wait=wait, use_complete=use_complete, timeout=timeout)
			except WindowsError as e:
				print
				print "EPICS put FAILED:"
				print "\tPV =", pv.pvname
				print "\tval =", val
				print "\twait =", wait, "; use_complete =", use_complete, "; timeout =", timeout
				print "\tconnected =", pv.connected, "; host =", pv.host
				print
				print "A WindowsError occurred:"
				# The following line results in an AttributeError. Apparently e.type doesn't exist
				#!print "\t", e.type
				print "\t", e
				print "\t", e.args
				print
				print "Backtrace:"
				traceback.print_stack()
				print
				time.sleep(15.00)
			else:
				exitFlag = True

Thanks!
On Tue, Dec 10, 2019, 1:13 PM Kevin Peterson<EMAIL_ADDRESS>wrote:

It looks like the latest version of my fly-scan code only has a safer
put():

Debugging

def debugPut(self, pv, val, wait=False, use_complete=False, timeout=30.0):
#
exitFlag = False
  while ( not exitFlag ):
  	try:
  		pv.put(val, wait=wait, use_complete=use_complete, timeout=timeout)
  	except WindowsError as e:
  		print
  		print "EPICS put FAILED:"
  		print "\tPV =", pv.pvname
  		print "\tval =", val
  		print "\twait =", wait, "; use_complete =", use_complete, "; timeout =", timeout
  		print "\tconnected =", pv.connected, "; host =", pv.host
  		print
  		print "A WindowsError occurred:"
  		# The following line results in an AttributeError. Apparently e.type doesn't exist
  		#!print "\t", e.type
  		print "\t", e
  		print "\t", e.args
  		print
  		print "Backtrace:"
  		traceback.print_stack()
  		print
  		time.sleep(15.00)
  	else:
  		exitFlag = True

—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/bluesky/ophyd/issues/776?email_source=notifications&email_token=AARMUMFCVRDHZAMON6EJNZ3QX7S5LA5CNFSM4JRLGCSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEGQNICY#issuecomment-564188171,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AARMUMAJVPHCSMYNYULWQ4LQX7S5LANCNFSM4JRLGCSA
.

The safer get() function I was remembering was much older.  It was used to handle exceptions on read timeouts using CaChannel.

@kmpeters : Looking over the code you supplied to make a safer put(), it seems somewhat similar to the method I described above, which converts the warnings posted by PyEpics into an actual UserError which can be trapped.  In your code, a WindowsError is trapped.
I'll begin testing the idea of trapping a warnings call as an exception (UserError).

@kmpeters: Trapping the warnings call from PyEpics as a UserException was successful.  Then, implementing the safer_get() including retries with shorter, but escalating, timeout was successfule as well.  Thanks, again, for the assist!

I think bandaid_get is a better name than safer_get.  I left a long comment over at https://github.com/aps-8id-trr/ipython-8idiuser/issues/114#issuecomment-567945638 about why I am not sure re-trying is the best solution.

The first item to resolve in this issue is to capture the warnings content from PyEpics when it is posted.  I'll file a PR on this specifically as resolution to this issue.  That won't stop the FailedStatus exception noted in https://github.com/aps-8id-trr/ipython-8idiuser/issues/114 but at least we'll know for sure that PyEpics has given us a timeout.

note:  not seeing this on my VM, need to try at APS beam line 8-ID-I, it seems
test code: https://github.com/prjemian/bstesting/blob/master/test4.py
test database when not at APS 8-ID-I: https://github.com/prjemian/bstesting/blob/master/8idi.db
softIoc -d 8idi.db


[Kogito 8699] Deploy the Operator on the New Cluster

Description of the change:
Motivation for the change:
Checklist

[ ] Add or Modify a unit test for your change
[ ] Have you verified that tall the tests are passing?

How to backport a pull request to a different branch?

In order to automatically create a backporting pull request please add one or more labels having the following format backport-<branch-name>, where <branch-name> is the name of the branch where the pull request must be backported to (e.g., backport-7.67.x to backport the original PR to the 7.67.x branch).

NOTE: backporting is an action aiming to move a change (usually a commit) from a branch (usually the main one) to another one, which is generally referring to a still maintained release branch. Keeping it simple: it is about to move a specific change or a set of them from one branch to another.

Once the original pull request is successfully merged, the automated action will create one backporting pull request per each label (with the previous format) that has been added.
If something goes wrong, the author will be notified and at this point a manual backporting is needed.

NOTE: this automated backporting is triggered whenever a pull request on main branch is labeled or closed, but both conditions must be satisfied to get the new PR created.

Isn't it better to followthe current conventions and put everythin into the .ci/tekton folder?

Isn't it better to follow the current conventions and put everythin into the .ci/tekton folder?

It's mainly documentation, not scripts to be executed on github

I agree with @davidesalerno, better to put it into a specific directory.

+1 for .ci/tekton

As pointed out by Davide and Filippe, I would also move that documentation to another folder.
What about .ci/docs/ ?

@radtriste if you clone the repo every folder named with a dot in the name is hidden, not a great solution to move the documentation in a hidden folder

/jenkins test this


Updating to address current manifest schema V#

What are you changing in this pull request and why?
Adding updated version content for the manifest schemas - changing current version to v7 for 1.3 and lower and v8 for 1.4
Checklist

[X] Review the Content style guide and About versioning so my content adheres to these guidelines.
[X] Add a checklist item for anything that needs to happen before this PR is merged, such as "needs technical review" or "change base branch."

Adding new pages (delete if not applicable):

[ ] Add page to website/sidebars.js
[ ] Provide a unique filename for the new page

Removing or renaming existing pages (delete if not applicable):

[ ] Remove page from website/sidebars.js
[ ] Add an entry _redirects
[ ] Ran link testing to update the links that point to the deleted page

@jtcohen6 Would it be preferable to version block the Resource Details section to hide root_path for 1.4+ or simply add a note that it has been deprecated from 1.4+ beside the text?


How to open urls with a mouse?

I just want to click an url and open it in my browser. How can I do it?

Not supported yet. We are planning to support this via #922. You may want to subscribe to that and #113 (url recognition, not necessarily going to implement that half).

@yevhen-m, if you use tmux you can use https://github.com/tmux-plugins/tmux-open


AppBar Component

#307
I left the built-in refresh button out since there isn't yet a consistent way to refresh an app, seems like that is a different story and the standard button can be added to AppBar once that mechanism is decided on.
I also updated the Admin app to put the TabSwitcher in the AppBar.
See https://github.com/exhi/toolbox/pull/18 for toolbox usage of the new component

Thanks John - looking forwards to checking this out shortly.  I was thinking I would take a run through the current hoist-react apps and migrate them to a remote switcher, but I think it makes more sense to see if we can take an even deeper standardization / cleanup with this component.  Will post any comments or questions shortly.

Merging this now to include it in 7.0 release this evening or tomorrow.  Lee I am sorry if this rushes a second review - of course we can loop back but I think the updates John made are ones we all generally agreed upon.


recipes-bsp/uefi: make UefiUpdateSecurityKeys optional

I took a stab at making this optional.  It builds with a db key and cert locally defined, but it is untested as I'm not quite setup to test that yet.

I think there is more work to do here.  I see that tegra_bootcontrol_overlay_list was recently re-worked and I think there is more cleanup that can be done.

I think this is ready for review now.

I will review it and will share my thoughts

I have manually merged this with a small tweak to the overlay inclusion logic in image_types_tegra so the update key overlay still only gets included for update payloads.

Thanks, @Lexmark-chad !


Make it possible to access the "parent" http.Request or at least http.Request.Headers

Why: I am using Hasura as a primary access to a database and graphql-go as a secondary set of queries and mutations (via the Hasura remote API feature). I'd like to be able to use the authorization header to verify a caller's JWT and extract information about them.
How: You could for example use context.WithValue() to "stash" these values on a context you pass through.
Alternatives: Use an HTTP middleware that "stashes" values somewhere stateful and then let the graphl-go compatible resolver pull from that stash.

I am not convinced that this is needed. The library can process GraphQL requests but the fact that you host it on an HTTP server is just an implementation detail. The resolvers should never be aware of this implementation detail. Indeed you could pass anything through the context and verify if the user is verified or not. Please, use the context of the query to pass anything you want with context.WithValue()

We disagree, but thanks for the prompt response, it's great to have active maintainers!
For those who tread here in the future, this will have to suffice
type stashKey struct{}

opts := []graphql.SchemaOpt{graphql.UseFieldResolvers()}
schema, err := graphql.ParseSchema(schemaString, resolver, opts...)
// ... err handling
baseHandler := &relay.Handler{Schema: schema}

handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
	ctx := r.Context()
	wrapped := context.WithValue(ctx, stashKey{}, "put stuff here")
	r2 := r.WithContext(wrapped)
	baseHandler.ServeHTTP(w, r2)
})


Fix issue with internal classes in SDK

Task
Resolves: #41
Description
I changed three constructors in abstract classes from internal to protected (all resources in our provider SDKs inherit from these classes, so the constructors have to be available to them). I also changed the opts method in resources from this:
  public suspend fun opts(block: suspend CustomResourceOptionsBuilder.() -> Unit) {
    val builder = CustomResourceOptionsBuilder()
    block(builder)
    this.opts = builder.build()
  }

to this:
  public suspend fun opts(block: suspend CustomResourceOptionsBuilder.() -> Unit) {
    this.opts = com.pulumi.kotlin.options.opts(block)
  }

I also had to change the modifier of the underlying javaResource in resources to protected, because otherwise there were problems in subclasses, but that caused issues with the Alias class, so I added another property (underLyingJavaResource) that's exposed only as internal (it's also used in tests).

...
also changed the opts method in resources from this:
  public suspend fun opts(block: suspend CustomResourceOptionsBuilder.() -> Unit) {
    val builder = CustomResourceOptionsBuilder()
    block(builder)
    this.opts = builder.build()
  }

...

Is this done to prevent making the build method public?

...
also changed the opts method in resources from this:
  public suspend fun opts(block: suspend CustomResourceOptionsBuilder.() -> Unit) {
    val builder = CustomResourceOptionsBuilder()
    block(builder)
    this.opts = builder.build()
  }

...

Is this done to prevent making the build method public?

Yes


Multus tests, refactor NetworkAttachmentDefinition's creation

What this PR does / why we need it:
The logic for creating NetworkAttachmentDefinition is all over.
This PR refactors the code to be in once place and reused where needed.
Which issue(s) this PR fixes (optional, in fixes #<issue number>(, fixes #<issue_number>, ...) format, will close the issue(s) when PR gets merged):
Fixes #
Special notes for your reviewer:
This PR is needed as preparation for removing BeforeAll usage from linux-bridge and SRIOV tests suite.
Release note:

NONE

/cc @alonSadan

first time i see all the tests fails like this
https://prow.ci.kubevirt.io/view/gs/kubevirt-prow/pr-logs/pull/kubevirt_kubevirt/6504/pull-kubevirt-e2e-kind-1.19-sriov/1444941257393573888

first time i see all the tests fails like this https://prow.ci.kubevirt.io/view/gs/kubevirt-prow/pr-logs/pull/kubevirt_kubevirt/6504/pull-kubevirt-e2e-kind-1.19-sriov/1444941257393573888

I probably did something bad, looking..

Changes:

Reuse new create-NAD function on SRIOV tests  suite
Squashed all commits to make it more atomic

Most lanes failed due to network issue on CI, it is resolved now.

/retest
/lgtm
All good from my side.

/approve


fix(graphql): rds import errors due to primary key and index

Fixes generate schema issue if a table doesn't contain a primary key.
Fixes an issue with index directive assigning incorrect datasource for the resolver.
Fixes use of mysql2 package in RDS lambda.

Description of how you validated changes

Manual test

Checklist

[x] PR description included
[x] yarn test passes
[ ] Tests are changed or added
[ ] Relevant documentation is changed or added (and PR referenced)
[ ] New AWS SDK calls or CloudFormation actions have been added to relevant test and service IAM policies
[ ] Any CDK or CloudFormation parameter changes are called out explicitly

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

Codecov Report

Merging #1237 (dbb8efe) into feature/rds-support (e0820f0) will increase coverage by 0.00%.
The diff coverage is 88.88%.

:exclamation: Current head dbb8efe differs from pull request most recent head db356ce. Consider uploading reports for the commit db356ce to get more accurate results

:mega: This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more
@@                 Coverage Diff                  @@
##           feature/rds-support    #1237   +/-   ##
====================================================
  Coverage                63.18%   63.19%
====================================================
  Files                      302      302
  Lines                    19065    19075   +10
  Branches                  4598     4602    +4
====================================================
+ Hits                     12047    12055    +8
- Misses                    6395     6397    +2
  Partials                   623      623

Impacted Files
Coverage Δ

...-generator/src/schema-generator/generate-schema.ts
96.20% <80.00%> (-1.17%)
:arrow_down:

...aphql-index-transformer/src/resolvers/resolvers.ts
94.78% <92.30%> (-0.22%)
:arrow_down:

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more


[Feat] - Updated Contribution Overview

Description:
This PR updates the contribution overview at https://wasmedge.org/docs/contribute/overview

Thanks for your contribution!


__type being applied to non-null nullable generics

Hi!
I have the following core class:
@MappableClass()
class Snapshot<T> with SnapshotMappable<T> {
  const Snapshot({
    required this.data,
    required this.source,
  });

  final T data;
  final String source;
}

and this business one:
@MappableClass()
class CreditCard with CreditCardMappable {
  const CreditCard({
    required this.apr,
    });
    final Snapshot<Decimal?> apr;
}

In runtime, at one point apr is being assigned a Snapshot<Decimal> - not null.
This causes my json request to include
"__type": "Snapshot<Decimal>"
which seems redundant.
Is there an option to ignore it?

I assume you do creditCard.toMap() or .toJson().
To fix this right now you can do CreditCardMapper.ensureInitialized().encodeMap(creditCard, EncodingOptions(includeTypeId: false))); or .encodeJson(...)
The __type is added in certain cases where it is needed so that x == X.fromMap(x.toMap()). However this should disregard type mismatches that only differ in nullability. So I consider this a bug and work on a fix.

Thanks for the reply.
I am encoding to json, but I'm using a mix of freezed and mappable (slowly migrating to your solution), plus the credit card is one of many types of products, so I don't see an easy way to pass those exclusions. It doesn't hurt that bad, so I will wait for the fix.
Thanks!

Already landed in 4.2.2 😁✌

Amazing!

🙌


[OTHER]: Want to chage Twitter logo

What would you like to share?
As Twitter logo is changed it is good to change twitter logo now in our website too XD
Additional information
No response
Checklist

[X] I have read the Contributing Guidelines
[X] I have checked the existing issues
[X] I am willing to work on this issue (optional)
[X] I am a GSSoC'23 contributor

@Anmol-Baranwal

OK i assign you! Do you have the new X logo ?

I want to work on this Issue


--dumpsettings option to see what config settings celeryd has loaded

I've spent a lot of time configuring celeryd over the past few days and it would have been great to have a way to see what it was actually loading up.
I'd like to see what config files it reads, and then the results of this on all the settings.
(alternatively it could just log what was going on while it was booting - right now it doesn't seem to write much to the logs - I'm thinking just things like "read configuration file " would help to reduce problems.

Would you like to whip up a patch? :)


Dynamic Skin Support

As title describes, there needs to be a added feature for dynamic skins which would allow for skins to be defined by placeholders values

Should work in the latest dev build. You can use placeholders by PlaceholderAPI


Revert back to /progress.html working

My last PR was making progress.html to stop working.

oh finally, the commit a21ffc7 makes GroupXFade working again. yay!


Enable Exporting Leases to JSON

Handles SIG{INT,ALRM,TERM,HUP} to dump out the leases object to --saveleases file as json. On start with --saveleases the self.leases object is updated with the contents, so non-expired (BUG we don't check, will fix) (fixed in 2936162) leases are used
The keys are translated to human readable (and json compatible) mac addresses on export, and back on import.
I've also moved self.leases[client_mac]['options'] to a separate object. It means we don't have to clean up the self.leases dict every time we save it.

@psychomario looks like you didn't use pickle? Also, this looks good but I just wanted to point out the variable and function naming should maybe be more inline with PEP8 (def export_leases rather than def exportLeases).

I don't really like pickle, it leaves a completely opaque binary file on disk, it would have worked significantly better for storing the binary data from options, but given that I've moved that elsewhere it isn't an issue anymore.. This method leaves a nice json file which, for whatever reason, is editable and viewable.

I've pushed a new commit with the style improvements you suggested.

@psychomario sorry to be a pest but I made a few line comment where variable names should still be modified to conform with PEP8. Give it a look once more? Thanks.

As ever, you're correct. I'm not able to make these changes for the next few days but I will do so when I can.

@psychomario since #111 was just merged you're going to need to do a rebase anyway lol

@mmattioli I think I've got all your changes, I almost made a mess of the branch in the process.

:+1: LGTM


[MINOR] Add parallel listing of existing partitions

Change Logs
Currently, the Glue sync works next way(simplified for particular problem explanation):

Read partitions which were upserted(create/update is indistinguishable) and deleted from the commitline(since previous sync time).
Read existing partitions from Glue.
Iterate to understand which AWS call should be done for the changed partition(create/update/delete).

To facilitate this, there are 2 clients, 1 is AWSGlueCatalogSyncClient, second is HoodieHiveSyncClient. In the Spark-EMR case, the second relies on the AWS's Hive-Glue interface implementation. There is no public code of the actual version, but there is of some previous, the interesting part is this.
Saying short for AWS Glue exists a mechanism of segments which allows to query long lists in parallel. I added code similar to what exists in AWS Hive-Glue implementation.
The real use-case for us was that we have been using HiveSyncTool (table with ~200k partitions) - and it was behaving slow when a lot of partitions were changing/in case of resync - so we decided to try out AWSGlueCatalogSyncClient which gave about 2x boost in write speed, but after we noticed a significant degradation in speed of listing(roughly 40 sec vs 210 on the ~same amount of partitions - 200k).
This improvement should bring the same listing speed to the tool.
Impact
There is a new config added with the default value from AWS Glue-Hive(parallelism of 5) - while before it was sequential, so I don't expect it to be failing, but we may set parallelism to 1 to be backward-compatible for whatever reasons.
Risk level (write none, low medium or high below)
Low
Documentation Update
Describe any necessary documentation update if there is any new feature, config, or user-facing change
Need to adjust the website, but please let me know if you are ok with the changes, I'll proceed then.

The config description must be updated if new configs are added or the default value of the configs are changed
Any new feature or user-facing change requires updating the Hudi website. Please create a Jira ticket, attach the
ticket number here and follow the instruction to make
changes to the website.

Contributor's checklist

[ ] Read through contributor's guide
[ ] Change Logs and Impact were stated clearly
[ ] Adequate tests were added if applicable
[ ] CI passed

@hudi-bot run azure

@yihua will you review this if I fix conflicts?

@yihua @nsivabalan is there any chance you'll be able to take a look on it? It's a significant improvement and makes sync much faster... We've been running it in production for a month already and there are no issues.

@yihua @nsivabalan

@VitoMakarevich Thanks for the contribution.  Could you rebase the PR on the latest master and resolve the conflicts?

cc @VitoMakarevich for updating and I think it is a valuable contribution.

Thanks for the review, will take a look this week.

@yihua I found that functionality I'm trying to bring heavily collides with https://github.com/apache/hudi/pull/10572.
So for the case of loading a list of partitions, there are now the following mechanisms:

Get all - was present always, simply get everything - does not well scale with a lot of partitions - in particular our case can spend 10+ minutes in each commit just getting partitions.
Try to generate the pushdown filter(quite recent addition with improvements recently) - if approximately it can fit 2048 characters - generate a list of all partitions, otherwise get min/max from changed partitions and read within range. This again has an error in 2048 limit - as it depends on partition depth/name length and so on, and min/max is better than nothing but suffers from entropy.
Mechanism I use - simply call batchGetPartition with all partitions changed - scales almost indefinitely.

And basically 1st and 2nd are what is in master branch - but with my approach, we don't need it at all, since get all will be needed only initially(when creating the Glue database), then we can use incremental only. But since it's in master, we may need to have backward compatibility, can you suggest a course forward? I can make a feature flag to use this behavior under certain feature flags - but would like to use it only for HiveSyncTool - where it makes more sense, and for AWS's implementation use my mechanism.
As for the rest - such as improvement of all partitions listing/parallelized update/create/delete - it does not collide with anything.
Waiting for your advice, I'm now stuck because of falling IT - but I need to know the direction we go.

@parisni can you take a look at this PR if it addresses your concerns? We are operating 2M+ partition syncs with this code within seconds.

@parisni I will add improvements in the following PR. The list I plan to add:

IT as you mentioned
.excludeColumnSchema(true) - although as I remember seeing AWS Glue -there was no schema in partitions, anyway it's one line so I will add it.
Add documentation to the web page so that new parameters are covered.
If there is something besides it, please comment, will work on it next week.

thanks @VitoMakarevich

although as I remember seeing AWS Glue -there was no schema in partitions, anyway it's one line so I will add it.

indeed in glue, any partition is associated with it's own schema. When one create a partition, glue picks up the current table schema and associates it with the partition. Then when you fetch partition, default is to also fetch the associated schema, which adds resource overhead AFAIK

@danny0405 small follow-up just to confirm - config changes will be picked up automatically right? I opened asf-site branch and it looks like if I just add a new parameter to an existing class - it should be visible once someone rebuilds a site

yeah, the web-site would rebuild in minutes.


Get rid of need for -T /dev/null with picolibc

Picolibc's linker flags includes -T /dev/null, which won't work on non-POSIX systems. This is used because the picolibc gcc .specs file looks to see if the linker command line includes a linker script. If it doesn't, the specs file inserts the picolibc linker script. This allows simple applications as are often used in build scripts to not need a linker script of their own.
Zephyr provides a linker script itself, but because clang doesn't support the -T option, it used -Wl,-T to pass the script file name through the compiler driver to the linker. This meant that picolibc's heuristic for detecting whether a script file has been provided fails and the picolibc linker script gets added to the linker command line. This was kludged around by adding -T /dev/null in the picolibc zephyr cmake bits.
Fix this by using -T for gcc while leaving other compilers continuing to use -Wl,-T when specifying the Zephyr linker script. This allows us to remove the -T /dev/null from the picolibc bits.
This should be a reasonable replacement for #60042
Fixes: #60040

Let’s address the rest as a follow-up since this is a hotfix


Invoice rounding problem

Hi!
It seems there is rounding problem with the xml generator:
[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
example data input:
$line = new InvoiceLine();
$line->setPrice(0.25)
    ->setQuantity(26935.78)
    ->setVatRate(19)

Which generates this nodes:
<cac:TaxTotal>
<cbc:TaxableAmount currencyID="RON">6733.95</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="RON">1279.45</cbc:TaxAmount>
...
<cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="RON">6733.95</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="RON">6733.95</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="RON">8013.39</cbc:TaxInclusiveAmount>
    <cbc:PayableAmount currencyID="RON">8013.39</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

The final amounts should be 8013.40, not 8013.39
And here is the generated xml:
factura-102-o2u-2022-e-ron-00066.txt

@andras-minicrm 6733,945×1,19=8013,39455. Rounding this will lead to 8013,39. How did you determine it should be 8013.40?

@quamis
Yea, you are probably right, based on the error message 6733.95 + 1279.45 = (8013.40) should be equal cbc:TaxInclusiveAmount (8013.39) . Probably the TaxAmount should be 1279.44 to get the correct 8013.39 value.

Hello @andras-minicrm,
Hmm, given BR-CO-15 is a Business Rule from the EN 16931, I'm guessing the final roundings performed by this library need to be updated to comply with the standard.
I'll investigate further and prepare a new implementation as soon as I have some spare time.

Hello @andras-minicrm,
This should be fixed now. Give it a try to make sure it works:
composer require josemmo/einvoicing:dev-develop

Hello @josemmo,
It seems the fix works, thanks!


Properly fixing #70

This fixes the find command to properly scan only for files not having elasticsearch user in specific folders

Hello @dn0! As the bug reporter, can you please review?

Btw. What is the motivation behind this?
I understand that before starting a fresh node it is needed.
But for restarts and upgrades I don't see the benefit.
Maybe we could go back to chown -R, but only when started for the first time, e.g.:
if [ ! -d /data/data/nodes ]; then
    chown -R elasticsearch:elasticsearch /data
fi

And the ownership of the /elasticsearch ($BASE) folder and subfolder could be handled in the Dockerfile during build time.

@dn0 why don't you own a PR that addresses all of this properly? I'd like to include it as part of 6.4.2.

@pires @nick-pap https://github.com/pires/docker-elasticsearch/pull/75


Query regarding the graphical design interface

I have flashed my sd card with the provided image and followed the script design interface steps for the the vivado. Now I want to know that the Graphical design interface says to use "make compile_graphical" command but where to use it? secondly the pdf report for the project says to open the CNN_BLOCK_DESIGN project in vivado but I can't find any file with such name.

Hi,
For the first question, in a terminal go to hw/graphical_design_flow/CIFAR-10. Then make compile_graphical for compiling a CIFAR-10 example.
For the second question, the report was referring to an older version. "CNN_BLOCK_DESIGN" has now been replaced with a "sketchpad" project which will be auto-generated when you run `make compile_graphical.

Do I need to use the vivado command prompt for the make compile-graphical?

What is the next step step after implementing this command? How do I upload this on my board?

I am getting this error. Kindly help me out with this.

Hi,
Sorry this is an error in the very last line of sketchpad.tcl -- it is using the absolute path which is not applicable to your file system. I believe that the sketchpad project has been successfully created in your PC. The only thing you need to do next is to package this project into an IP block -- go to tools -> create and package IP. This IP block is the logic for a CIFAR-10 CNN model.

Yes. Up to this stage the HLS only generates the RTL codes -- which is whatever that have been packaged in the "sketchpad" IP. For bitstream, you need to go to the base project, which is a Vivado project, and import the "sketchpad" IP into it, then synthesise the base project to get a bitstream.

How can we import the sketchpad IP to the vivado project?

In base project, on its block diagram, right click, then add ip? The base project should’ve automatically linked the repo containing sketchpad ip block

I am really thankful to you in helping me out with the implementation of CNN. I have got a question that   how can we modify this so that it can identify images taken from a usb camera attached to the pynq?

I want to identify a number plate image taken from my usb camera. Kindly guide me with that.
Thanks.

There is one open source project, FINN by Xilinx, that did something very similar to what you described.
https://github.com/Xilinx/BNN-PYNQ/blob/master/notebooks/BNN-from-webcam.ipynb

Guide here:
https://github.com/awai54st/PYNQ-Classification/tree/master/hw
Please be more specific on what step do you need help with.

Hey Erwei!
Just wanted to know If you have used the QNN repository for real time
object detection on pynq? I basically want to use the yolo script for real
time video detection from my usb camera. Can you help me with the code
please?
https://github.com/Xilinx/QNN-MO-PYNQ/tree/master/notebooks
Thanks.
On Sun, May 6, 2018 at 2:44 PM, Erwei Wang<EMAIL_ADDRESS>wrote:

Guide here:
https://github.com/awai54st/PYNQ-Classification/tree/master/hw
Please be more specific on what step do you need help with.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/awai54st/PYNQ-Classification/issues/13#issuecomment-386867083,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AgqLlQbtha7TRUTHSl_NQx_NVbJrsttrks5tvsXzgaJpZM4TTXfq
.

Hi,
I haven't tried it yet, so unfortunately I cannot provide any guide on how to use that framework. However, I suggest that you have a look at another Xilinx framework named BNN on PYNQ (or FINN). That one also has a real time usb camera-based detection example. Both FINN and QNN are created mainly by the same author.
Please try to leave an issue on the QNN repo.

hi
in script_design_flow,i can find axi_dma_slave/master and they connect the first  SCIG layer and the last FC layer  ,but in graphic_design_flow,i cant find them.why ?thank you!

Erwei
thanks for your answer, i can achieve the same design without  AXI_DMA_SLAVE/MASTER,right? And in
script_design_flow ,i didnt find the testbench files. Without those files, can the program be carried out correctly? thank you very much!

Yes, and yes. The testbench is for simulation and debug only, not for hardware synthesis.


tracr lines can have >0 loss in plots

See for example kl--trained--random_ablation--kl_edges.pdf

You fixed this right?


Dynamic subscription to new topic #81

This pull request adds new Config in KafkaConsumer class as disused in https://github.com/cakesolutions/scala-kafka-client/issues/81

👍


fix: default json-file log size to 100MB

#3661
This commit makes the json-file logger to default logrotate maxBytes configuration of 100MB.
It is a temporary fix to a bug addressed by this logrotate PR.
Setting the default values in the config passed to logrotate fixes the issue temporarily but having unlimited size for container logs will be available when the issue is addressed upstream.
Testing done :
Verified that the logging mechanism works and appends the logs to the same log file and doesn't create a new log file.

Could this fix be backported to nerdctl 1.7.x, considering containerd 2.0 is not yet LTS. @AkihiroSuda @djdongjin

LTS

For nerdctl we do not have any LTS (yet)


Cloud Heights error?

Hi,
I'm reading your code to compute cloud shadows, I've noticed that the cloudHeight list is initialized with a repeated value 500. https://github.com/gee-community/geeViz/blob/06e4e3b4cff09d43d2af525606a4d034ab257345/getImagesLib.py#L771 (also in line L2364) is this intended? Additionally, are these heights in meters? (I guess it depends on the CRS of the images used to project the shadows which would be meters in the case of Landsat and Sentinel-2 images right?)
Thank you

I'm just seeing this. Since this method is intended to work with Sentinel 2, which lacks thermal data, it is difficult to model the cloud height. This method therefore takes a set of possible cloud heights (in meters). The default is not a repeated list, but rather a sequence from 500 to 10000 meters every 500 meters. The function then identifies clouds, and then shifts them for each of these heights based on the solar zenith and azimuth looking for dark pixels in those areas. This method does result in false positives in dark pixels that happen to fall within any area that the clouds are projected to cover at the provided cloud heights. This does get a bit weird with geographic projections. This is not currently handled well, but is a bit here
https://github.com/gee-community/geeViz/blob/06e4e3b4cff09d43d2af525606a4d034ab257345/getImagesLib.py#L719
Hope this helps a bit.


fatal error: src/lib/greeting_lib.h: No such file or directory  in clion

Description of the bug:
when I am trying to execute the hello_world.cc I am getting the error.

What's the simplest, easiest way to reproduce this bug? Please provide a minimal example if possible.
No response
Which Intellij IDE are you using? Please provide the specific version.
v2023.12.19
What programming languages and tools are you using? Please provide specific versions.
No response
What Bazel plugin version are you using?
No response
Have you found anything relevant by searching the web?
No response
Any other information, logs, or outputs that you want to share?
No response

From the screenshot, this seems to be not a Bazel run configuration, I cannot reproduce the issue.

This issue is reproduced only on Clion 2022.3.3 Version.

But we should be testing 2023.2 and 2023.3, can you please check again?

Tested successfully in 2023.2 and 2023.3

We have tested this in the latest Clion version 2023.3.2 with both  Bazel plugin version  v2023.12.19, v2024.01.02 and its working fine. Hence we can close this issue. Thanks for the support.


Roll engine 72c7a7567228..7375a0f414bd (1 commits)

https://github.com/flutter/engine/compare/72c7a7567228...7375a0f414bd
git log 72c7a7567228..7375a0f414bd --no-merges --oneline
7375a0f41 Roll Skia to 57d29eaf2ed7518983d9e91fd5219f4cfc181f88 (flutter/engine#7024)
The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll
Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+/master/autoroll/README.md
If the roll is causing failures, please contact the current sheriff (liyuqian@google.com), and stop
the roller if necessary.

@liyuqian : New roll has been created by https://autoroll.skia.org/r/flutter-engine-flutter-autoroll

Auto-roller completed checks. About to merge.


Feedback about the docs

First of all, congrats on the lib, some of the functions are even mind blowing :)
Just reviewing the doc. Not sure if the repo is public but i don't see it so here i go :)

Ctrl + C in windows  does the equivalent to ctrl + K, so i'm unable to copy text

Boil => Not sure about its naming 🤔

I would probably use an array with 6 items so it is easier to understand the way this function packages items

counting =>  I would call it groupCount

flat => Not sure why having this one. Radash is supposed to be "modern". What is the advantage agains native [].flat()?

Should include Zues, and i guess it's a typo should be Zeus 🤔

output should be: //[{name: "Marlin" weight: 105}, {name: "Trout", weight: 13}]
[...]
Checking the rest of the docs there are a lot of little issues like this. Specially in the output.
Also the playground is loading an older version of radish and not working!

@lveillard thanks for the feedback! The repo is public you can check it out here.

some of the functions are even mind blowing :)
I might have to quote you on this 😉 It's very kind!

The name boil could be totally misleading, I'm open to that possible reality. In my mind, I think of it like 'cooking off' all unwanted values. Do you have an other ideas?
Good point on the cluster example, I'll make this change
For counting I'm using this as a noun. I actually call the object returned a 'counting'. It could be just me that does this but it should be everyone :p this is such a common object to work with as engineers I want a name for it.
Ya great point about flat, in the beginning, I had a single file I would copy and paste from project to project with all these functions (well most of them, it's grown a bit) that I would use. One team wanted to use it as a package but only if they could replace Lodash completely. They used Lodash a lot. So, I had to make some concessions to get Radash in. This was one of them.
I will fix the typo!
I was trying to be brief. I should find a better way to provide examples. I'd like to have an in browser REPL soon. I'll write out the full value.

On the matter of little issues and typos, ya... all I can say is I did not expect this much enthusiasm and did not prepare Radash to be presented to the entire community 😅 I genuinely appreciate all the help from everyone to clean it up!
I'll also be fixing the playground link today.


[Question] RAID setup

I have 2 SSDs that are configured to be part of a RAID 1 array through my UEFI bios, however when I try to install Harvester (as described here, I see both drives show up as individual drives.
Which drive do I need to select during the harvester installation?

Also, maybe as a feature request, It would be nice if the installation docs had some instructions regarding this, so that others with the same issue wouldn't have to ask the same question.

@CC007 Thanks for the report. Are you using Intel RST (which needs mdadm) to create the RAID device? Harvester only supports hardware RAID as the installation disk currently.

I am using an AMD threadripper cpu with a Gigabyte Aorus Pro motherboard. I'm using it's provided RAID configuration in the UEFI bios.

As far I know and also I am user of AMD Threadripper, in order to get "fake" hardware RAID working on Linux a driver is required "AMD RAIDXpert" or "AMD RAIDXpert 2" which Linux source tree does not provide any support for it.
A ZFS support would be great :)

I found the AMD raid drivers and RaidXpert2 utility download link here: https://www.amd.com/en/support/chipsets/amd-socket-strx4/trx40
It specifies that it supports RHEL and Ubuntu. I don't know what harvester uses, so I don't know if it will work for Harvester.


[Hotels] Orientation for mobile, possible to change from portrait to lanscape

For iOS, this is deactivated by the native app itself, and I supposed it was the same for android. But maybe it is not?
Could you investigate, and fix if there is something we need to do?

If you want to have only portrait, the Android activity that uses rnkiwmobile can just set up this:
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

Like we do in our playground https://github.com/kiwicom/mobile/blob/master/android/playground/src/main/java/com/kiwi/mobile/rnandroidplayground/HotelsActivity.kt#L16.


Possible problem with multi-IP setups

After fixing https://github.com/nozel-org/freebsd-apache-sparry/issues/11 I think there might be another problem of the sort in the future. Sparry works perfectly fine as long as the default gateway IP address is also the IP address that is used in the DNS records of the domain.
Relevant code:
# check whether DNS records have been properly set
    echo '     > Performing external IP address lookup'
    EXTERNAL_IP_ADDRESS="$(curl --silent ipecho.net/plain)"
    echo "     > External IP address is ${EXTERNAL_IP_ADDRESS}"
    echo '     > Checking if DNS records have been set correctly'
    if [ "${CHOICE_SUBDOMAIN}" = '1' ]; then
        validate_dns_records "${DOMAIN_NAME}"
    elif [ "${CHOICE_SUBDOMAIN}" = '2' ]; then
        validate_dns_records "www.${DOMAIN_NAME}"
    elif [ "${CHOICE_SUBDOMAIN}" = '3' ]; then
        validate_dns_records "${DOMAIN_NAME}"
        validate_dns_records "www.${DOMAIN_NAME}"
    fi

This won't work when the default gateway IP differs from the Listen IP of the Apache HTTP server. I need to refactor this.

One solution might be to compare the DNS record address to all IP addresses on the server. Another might be to let users overrule the DNS check in sparry.conf.


OCamlformat version makes the analysis fail

Context
I opened PRs with the next unreleased version of OCamlformat applied. The version field in .ocamlformat contains an invalid value.
Step(s) to reproduce
echo "version = 0.99.0" > .ocamlformat

Expected behaviour
The version of OCamlformat seems to be resolved for every compilers and every compilers fail to resolve due to that.
I would expect:

OCamlformat is only resolved for the "fmt" job.
If the "fmt" job fails to be resolved, other jobs are not interrupted and the CI run with an always failing "fmt" job.

Additional context
For example, in Odoc on this PR: https://github.com/ocaml/odoc/pull/979
CI result: https://ocaml.ci.dev/github/ocaml/odoc/commit/f42fd067a329da36ef64f1f2cdac75967da60885/variant/(analysis)

The fix for this issue is deployed, would you like to validate the result observed here https://ocaml.ci.dev/github/moyodiallo/odoc/commit/28c31b974605701babfd0c645d0b8de5c68d6591 (same link as above).
@Julow

That fixes my issue, thanks :)
Though the error message isn't nice:

Error: Program ocamlformat not found in the tree or in PATH

The job might as well fail immediately with a clearer message.

The job might as well fail immediately with a clearer message.

You're right, verifying if the ocamlformat version is available from the analysis result.

Is this fixed by #865 @moyodiallo?

After the merge of #877, we can close this.

We still observe this on ocamlformat's repository: https://github.com/ocaml-ppx/ocamlformat/runs/17517278251
(we don't have a set version in the .ocamlformat file because we use the version of the same commit to format ocamlformat's codebase)

Keep in mind those 2 issues are different. what you're describing is ocamlformat without version. I think It could be preferable to open another issue.

@moyodiallo you're right, I've opened another issue.


created regions, saved the whole genome, loaded back, no cortical areas in the region

as title
but the cortical area still exist in the genome but just not in the region

I cant repo this. @jenz512 I may need more information on how you caused this

fixed