Allow Python 3.9 as minimum and update CI.

Run CI scripts on Python versions 3.9 - 3.12 and updated pyproject.toml accordingly.

It seems that it passes on 3.10 but fails on 3.9.
Looking at the test log, it is probably only due to the annotations with the PEP604 style. This should pass also on 3.0 after adding
from __future__ import annotations

Hi @joeced I've added support for Python 3.9 in #44


OpenAI Assistants

To use this API version pass a beta HTTP Header:
OpenAI-Beta: assistants=v2
Do we have this feature yet?

When "openai": "^3.3.0", support this, yes, "we have" this feature.
By the way - what is "this feature"?

When "openai": "^3.3.0", support this, yes, "we have" this feature.
By the way - what is "this feature"?

https://platform.openai.com/docs/assistants/overview?context=with-streaming

No, we haven't.


Unpin pachyderm-sdk version for LabelStudio tests

We should be testing against the latest builds of the pachyderm-sdk package.

I merged this into #10315.  Works well!


[SPARK-21696][SS] HDFSBackedStateStoreProvider to handle corrupted snapshots

What changes were proposed in this pull request?
State Store should handle corrupted snapshots because it still can recover from delta files.
How was this patch tested?
Unit test; Manual environment.

Can one of the admins verify this patch?

This issue has already been resolved in #18928 (the JIRA already showed as resolved).
If possible, can you please test out the current master, whether it solves the problem in your case.

@tdas #18928 solves my problem, thanks.

Can one of the admins verify this patch?

any estimate on when this will get into mainline? regards


window.open freezes fixed qTip

Not sure if this is considered a bug for you, or if it's just the default behavior of a browser, so I apologize if this is unnecessary.
Take this example: there is a textarea, and a qTip set up to be fixed, using my:"bottom center" and at:"bottom center". The content.text is an HTML link that uses window.open to open a smaller window, onclick, for viewing the textarea's contents (not the important part). When the qTip's link is clicked, the window is obviously opened (important to know that I've found the problem to occur when the popup opens above where the link was clicked). But when I look back at the parent window, the qTip remains shown. It remains shown until I mouse over and out of the specific textarea. No other event on the page (unless the page is navigated away from) causes the qTip to go away. The onclick actually references a function, so I tried calling .qtip("hide"), but that didn't do it (I verified it references the correct element).
The only way to avoid this, that I've found, is after you click the link, the mouse must be moved away from the textarea (to hide the qTip) before the window is shown...otherwise the qTip is frozen in the textarea. But I can't expect users of the website to know/understand to do this to receive MY expected results. Again, if this isn't the qTip's fault, that's fine...I just wanted to at least point it out and find out if this can be fixed.
Thanks!

Can you please setup a test case demonstrating this? http://jsfiddle.net/fDavN/

Sorry it took so long to respond. But I updated the jsFiddle. Here's the link: http://jsfiddle.net/hoodedperson70/fDavN/2089/
The point is that when you hover over the textarea and click the link in the tooltip, don't move your mouse until the new window is rendered. If you have your browser open new windows in a new tab, this will work perfectly. If you have your browser open new windows in a new window, the new window must be on top of the textarea/tooltip. What you should see is that the tooltip isn't hidden when you click the link. It seems like this "problem" is only related to window.open, probably because when the parent window loses focus (because of the popup), the onmouseout never occurs for the textarea. Let me know how it goes :)

Ahh nice! Did you fix it since I updated the jsfiddle or was it something already fixed? Anyways, thanks for looking into it :)

The problem was I wasn't applying a blur event to the window along with the mouseout event! This should now be a catch-all for hiding the tooltip when opening a new window either via tab or in a new dialog.

Ahh I see, well I'm glad you got it figured out :) Thanks for looking into it!


[Refactor] simpilified Operator.Builder implement

What type of PR is this：

[ ] BugFix
[ ] Feature
[ ] Enhancement
[x] Refactor
[ ] UT
[ ] Doc
[ ] Tool

Which issues of this PR fixes ：

Fixes #
Refactor Operator.Builder, because I need modify 30+ child-class construct method when I want to add a member variables in LogicalOperator！！！ I need modify 10+ child-class construct method when I want add a member variables in LogicalScanOperator！！！
before:
class operator {
    //... Member variables
    A
    B
    C

    operator(builder) {
        super(....., ...All member variables)
    }

    class Builder {
        //... once again: same Member variables

        //... set function
        //... set function
        Builder setXXX(xxx) {
            this.xxx = xxx
        }

        operator builder() {
            return new operator(builder)
        }
    }
}

after:
class operator {
    //... Member variables
    A
    B
    C

    operator() {
        super(TYPE)
    }

    class Builder {
        protected operator builder = new operator();

        //... set function
        Builder setXXX(xxx) {
            builder.xxx = xxx
        }

        operator builder() {
            return builder;
            builder = null;
        }
    }
}

Problem Summary(Required) ：

Checklist:

[ ] I have added test cases for my bug fix or my new feature
[ ] This pr will affect users' behaviors
[ ] This pr needs user documentation (for new or modified features or behaviors)

[ ] I have added documentation for my new feature or new function

Bugfix cherry-pick branch check:

[ ] I have checked the version labels which the pr will be auto backported to target branch

[ ] 3.0
[ ] 2.5
[ ] 2.4
[ ] 2.3

[FE PR Coverage Check]
:heart_eyes: pass : 189 / 236 (80.08%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalTreeAnchorOperator.java
0
2
00.00%
[55, 59]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalAssertOneRowOperator.java
0
5
00.00%
[46, 104, 110, 111, 112]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalEsScanOperator.java
0
6
00.00%
[35, 53, 74, 80, 81, 82]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalHudiScanOperator.java
0
4
00.00%
[51, 82, 89, 90]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalIcebergScanOperator.java
0
3
00.00%
[48, 71, 78]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalFileScanOperator.java
0
3
00.00%
[49, 80, 87]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalLimitOperator.java
0
7
00.00%
[51, 52, 139, 145, 146, 151, 155]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalCTEProduceOperator.java
0
6
00.00%
[92, 96, 100, 101, 105, 106]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalDeltaLakeScanOperator.java
0
3
00.00%
[42, 65, 71]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/OperatorBuilderFactory.java
3
4
75.00%
[27]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/Operator.java
12
14
85.71%
[177, 181]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalScanOperator.java
8
9
88.89%
[190]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalAggregationOperator.java
23
25
92.00%
[305, 309]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalTopNOperator.java
15
16
93.75%
[218]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalOlapScanOperator.java
14
15
93.33%
[198]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalSchemaScanOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalJoinOperator.java
13
13
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalValuesOperator.java
4
4
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalMysqlScanOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalExceptOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalUnionOperator.java
4
4
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalWindowOperator.java
18
18
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalCTEConsumeOperator.java
6
6
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalHiveScanOperator.java
4
4
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalFilterOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalIntersectOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalMetaScanOperator.java
3
3
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalCTEAnchorOperator.java
3
3
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/stream/LogicalBinlogScanOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalSetOperator.java
6
6
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalRepeatOperator.java
5
5
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalProjectOperator.java
5
5
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalTableFunctionOperator.java
7
7
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalJDBCScanOperator.java
2
2
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/rule/transformation/PruneScanColumnRule.java
4
4
100.00%
[]

:large_blue_circle:
com/starrocks/sql/optimizer/operator/logical/LogicalApplyOperator.java
18
18
100.00%
[]

I love this refactor. And I've noticed that you've put final to each operator's field, but some fields are of Collection type, which can be modified. Are you gonna to step further for replacing all the collections to it's immutable versions?

I love this refactor. And I've noticed that you've put key word final to each operator's field, but some fields are of collection type, which can still be modified. Are you gonna to step further for replacing all the collections to it's immutable versions?

emm, we can modify it later and step by step, i think will be easy than before


Document the integration with LetsEncrypt

LetsEncrypt has revolutionized SSL certificate generation, and is extremely easy to use (letsencrypt certonly -d mydomain) and automate. It would be fantastic if InfluxDB could use directly the .pem files that LetsEncrypt generates (it appears that some files need to be concatenated now, but it's unclear which). There's also an option to specify the private key separately, which is nice but confuses things for LetsEncrypt users.
LetsEncrypt generates the following files:
cert.pem  (not interesting)
chain.pem  (not interesting)
fullchain.pem  <-- full certificate chain
privkey.pem  <-- private key

The correct configuration in /etc/influxdb/influxdb/conf is:
https-certificate = "/etc/letsencrypt/live/yourdomain.com/fullchain.pem"
### Use a separate private key location.
https-private-key = "/etc/letsencrypt/live/yourdomain.com/privkey.pem"

This makes setting up SSL easy and something the user will never have to worry about, as LetsEncrypt will automatically renew the files before the certificate expiration date.

Below are potential errors, for SEO.
Trying to supply cert.pem to https-certificate results in the following error:

crypto/tls: found a certificate rather than a key in the PEM for the private key

even if https-private-key points to privkey.pem.
Not including the full chain can also result in unable to verify the first certificate when connecting with certain client libraries, even though the connection succeeds in the browser.

Turns out InfluxDB can actually already use the cert.pem and privkey.pem files, though only for the [admin] section, due to #7284.
This issue then becomes one of documenting how this can be done. Recommending a specific certificate tool may be a tiny bit beyond the scope of the docs, but given the lack of an example on that page, which has lead to use questions on the forum, I'm inclined to think it would help much more than it would harm.
Happy to submit a PR once #7284 is settled.

Since this is docs issue.  Can you re-open it here: https://github.com/influxdata/docs.influxdata.com

Will comment here and keeps looking, but LetsEncrypt also generate really short-living certs (3 months).
Is there a way to reload the certs without stop/start influxdb ?

@dandv I just want to say thanks for your insights... I was using the cert.pem for https-certificate rather than fullchain.pem. Also had to change some folder permissions (/etc/letsencrypt/archive and /etc/letsencrypt/live to 750) and added userinfluxdb to the root group to get it to work, but it works like a charm after that :+1:

Any solution for what @prune998 asked?
It will be good to force certificate reloading from point to point without having to restart the InfluxDB instance completely.
Has anyone got any way of doing it?

check Caddy, nginx-lego or traefik who implemented that in GO already... maybe it can help get it done faster (as this issue is more than a year old now :) )

@dandv I just want to say thanks for your insights... I was using the cert.pem for https-certificate rather than fullchain.pem. Also had to change some folder permissions (/etc/letsencrypt/archive and /etc/letsencrypt/live to 750) and added user influxdb to the root group to get it to work, but it works like a charm after that +1

For those viewing this thread now, please bear in mind that this is not necessarily secure if you run bare-metal installs of influx.
First, chmod 750 will prompt certbot to complain that there are unsafe permissions present. Furthermore I am weary of adding influxdb as a root member of my system and granting it broad access to directories and files it shouldn't normally see.
A necessary step that was not mentioned is exposing the influxdb user to your private keys, or else influx will not have necessary permissions to read the keys. This is the most sketchy.

A necessary step that was not mentioned is exposing the influxdb user to your private keys, or else influx will not have necessary permissions to read the keys. This is very sketchy.

probably a lot less painful approach is to add a new group, say 'letsencrypt' - chgrp the dirs 'live' and 'archive' to it and set the permission to 0710 - as you don't need read permission for path traversal. the dirs below live and archive already have 0755 permissions, so no need to touch them. the single thing that needs adjustment is the file privkey1.pem in archive/your.host.name. just chgrp the file to 'letsencrypt' and add group read to it (0640).
it doesn't matter if certbot will revert the permissions as a post-install hook script can fix them afterwards.
this way Influxdb has only access to its own cert and private key, and is not a member of the group root.


Window opens small

The Window opens very small now.
I think this is happening since https://github.com/pyedifice/pyedifice/commit/28c07eb6c8f00046fd1b8af3d42c607cde8f8bf5
Maybe because the Window now show()s before the other Qt commands are run for the component tree?

Usually, Windows application will remember the size when it was closed the last time and will be opened in the same size.
Isn't it possible to take that information from the registry?

Fixed in v2.1.0 https://pyedifice.github.io/versions.html#v2-1-0


fix: better handling of double decorations

v10.5.4 has been released and contains a fix for the issue. Feel free to reopen the issue or to submit a new one if you meet any problems.


Uncaught Error: The specified module could not be found./?~\AppData\Local\atom\app-1.22.1\res...

[Enter steps to reproduce:]

I pressed enter to create a new line after the second div
...

Atom: 1.22.1 x64
Electron: 1.6.15
OS: Microsoft Windows 10 Pro
Thrown From: Atom Core
Stack Trace
Uncaught Error: The specified module could not be found.
\?\C:\Users\SoC14\AppData\Local\atom\app-1.22.1\resources\app.asar.unpacked\node_modules\keyboard-layout\build\Release\keyboard-layout-manager.node
At ELECTRON_ASAR.js:173

Error: The specified module could not be found.
\\?\C:\Users\SoC14\AppData\Local\atom\app-1.22.1\resources\app.asar.unpacked\node_modules\keyboard-layout\build\Release\keyboard-layout-manager.node
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:173:20)
    at Object.Module._extensions..node (module.js:598:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:187:18)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.require (/app.asar/static/index.js:47:45)
    at require (internal/module.js:20:19)
    at customRequire (~/AppData/Local/atom/app-1.22.1/resources/app/static/<embedded>:96:26)
    at get_KeyboardLayoutManager (~/AppData/Local/atom/app-1.22.1/resources/app/node_modules/keyboard-layout/lib/keyboard-layout.js:7:65)
    at get_manager (~/AppData/Local/atom/app-1.22.1/resources/app/node_modules/keyboard-layout/lib/keyboard-layout.js:16:42)
    at Object.getCurrentKeyboardLayout (~/AppData/Local/atom/app-1.22.1/resources/app/node_modules/keyboard-layout/lib/keyboard-layout.js:32:17)
    at exports.keystrokeForKeyboardEvent (~/AppData/Local/atom/app-1.22.1/resources/app/node_modules/atom-keymap/lib/helpers.js:201:42)
    at KeymapManager.module.exports.KeymapManager.keystrokeForKeyboardEvent (~/AppData/Local/atom/app-1.22.1/resources/app/node_modules/atom-keymap/lib/keymap-manager.js:467:20)
    at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (~/AppData/Local/atom/app-1.22.1/resources/app/node_modules/atom-keymap/lib/keymap-manager.js:347:30)
    at WindowEventHandler.module.exports.WindowEventHandler.handleDocumentKeyEvent (~/AppData/Local/atom/app-1.22.1/resources/app/src/window-event-handler.js:100:42)
    at HTMLDocument.<anonymous> (~/AppData/Local/atom/app-1.22.1/resources/app/src/window-event-handler.js:3:65)

Commands
     -3:49.4.0 tree-view:show (atom-workspace.workspace.scrollbars-visible-always)

Non-Core Packages
atom-beautify 0.30.5
atom-ternjs 0.18.3
autoclose-html 0.23.0
busy-signal 1.4.3
color-picker 2.2.5
docblockr 0.11.0
file-icons 2.1.13
fonts 3.0.3
highlight-selected 0.13.1
intentions 1.1.5
language-babel 2.75.2
language-docker 1.1.8
linter 2.2.0
linter-ui-default 1.6.10
minimap 4.29.7
minimap-highlight-selected 4.6.1
multi-cursor 2.1.5
pigments 0.40.2
platformio-ide-terminal 2.7.0

Thanks for taking the time to contribute!
We noticed that this is a duplicate of #14461. You may want to subscribe there for updates.
Because we treat our issues list as the Atom team's backlog, we close duplicates to focus our work and not have to touch the same chunk of code for the same reason multiple times. This is also why we may mark something as duplicate that isn't an exact duplicate but is closely related.
For information on how to use GitHub's search feature to find out if something is a duplicate before filing, see the How Can I Contribute? section of the Atom CONTRIBUTING guide.


Warning PDC_FILE

Description
This is my config.tcl file which is not running properly

Expected Behavior
I got this report How can ı fix

Environment report
x

Reproduction material
z
Relevant log output
z

@srknkrdnz
Problem not related to warning... Real error in logs/synthesis/linter.log
Check the log and fix it.

Thanks for recommendation. I found error.


Common kernel object field for unifying kernel object stats reporting

Introduction
I am exploring an idea to unify kernel object stats reporting.
Problem description
There are multiple places in the kernel where we collect statistical data about various kernel objects (thread runtime stats, memory usage stats for memory blocks, heaps, memory slabs, ...). Each of these have their own method to report stats. I would like to simplify this with a new framework. I understand that there is currently a stats subsystem (subsys/stats). If I am following it correctly, it is great for permanent features (drivers), but not so good for kernel objects that may be reused or have a lifespan.
Proposed change
Kernel objects where possible, can be linked together and individually enabled to track statistical data. Linking them together can allow tools to walk the lists to automatically retrieve information in a structured way.
Detailed RFC
In this section of the document the target audience is the dev team. Upon
reading this section each engineer should have a rather clear picture of what
needs to be done in order to implement the described feature.
Proposed change (Detailed)
Before a kernel object can be linked to track that data, the object type must be registered during early system initialization. These registered object types will be tracked in a doubly linked to make it easier to cycle through them all.
Obj Type 1 <--> Obj Type 2 <--> Obj Type 3 <--> ....

To put it a little more concretely, this could be something like ...
Thread Objects <--> Memory Block Objects  <--> Heap Objects <--> ...

Each object type node would contain information such as  ...
struct k_obj_type {
    node  : doubly linked list node
    list   : list that contains all registered objects of this type
    stats  : pointer to descriptor that describes how to retrieve/report stats data (configurable)
   name / id : pointer to a string or unique ID to easily identify the object type (configurable)
}

The stats descriptor referenced above would follow the same pattern for each object type ...
struct stats_desc {
    raw_size  : size of structure used for internal tracking of statistics
    query_size : size of structure used for reporting the statistics
    raw : Function pointer to retrieve raw data
    query : Function pointer to retrieve reported data
    reset  : Function pointer to reset a kernel object's stats
    disable  : Function pointer to disable a specific kernel object from gathering stats
    enable  : Function pointer enable a specific kernel object to gather stats
}

Kernel objects would have embedded within them an optional struct k_obj  obj; field.
struct k_obj_core {
    node  : node in k_obj_type's list (doubly linked for fast insertion/removal)
    type  : a back pointer to the k_obj_type
    name  : optional pointer to a name (does not have to be unique)
    stats  : optional pointer to raw stats data (if NULL, stats are not tracked for it)
    .... future expansion ... ?
}

Dependencies
This should not have too much in the line of immediate dependencies on other components. However, it some aspects of it may touch upon other features (stats subsystem, tracing/tracking, other?)
Concerns and Unresolved Questions
I expect that there will be concerns around at least duplication, footprint and performance.
Why not use the stats subsystem? As far as I can tell (and I may be wrong) the stats subsystem is geared towards permanent things. It is not geared for items that may be re-used or dropped (such as threads). When it comes to resetting the stats, it assumes that the stats structure can be zeroed. This is not always ideal (for example when the stats for memory usage track peak usage, resetting the peak or current usage to zero does not make sense when memory is still in use). It also appears rather cumbersome to set up for individual kernel objects.
Footprint - Yes, it will increase footprint. However, this is configurable. I am currently thinking that there can be a core component that can be configured by kernel object (CONFIG_KOBJ, CONFIG_KOBJ_STATS, CONFIG_KOBJ_THREADS, CONFIG_KOBJ_MEM_BLOCKS, ...) so that we do not completely blow up the footprint. Just enable it for the parts that are wanted.
Does this duplicate tracing / tracking? Perhaps somewhat. Or, perhaps some of the tracing/tracking can be rolled into this in the future as this could link together the kernel objects that people want to track as well.
Performance - Enabling stats gathering will impact performance somewhat--hopefully not too much.
What are the APIs? This is not 100% settled yet, but they are going to focus around the k_obj and k_obj_type structures--initialization, links and unlinks. There may variations for stats linking as well since stats are a configurable sub-option to the K_OBJ.  The various stats routines are going to be accessed via macros--something like K_OBJ_STATS_xxx().
The major benefit that I see is that since all the stats objects (and potentially other objects) are linked together, 3rd party tools/debuggers can auto-extract their stats information.

Architecture WG:

Presentation by @peter-mitsis, slides to be attached.
@stephanosio asks how this is related to the kobj infrastructure for userspace. @peter-mitsis needs to look into it
@galak asks whether this would replace driver statistics. @peter-mitsis sees this as a parallel effort
@carlescufi and @mbolivar-nordic ask whether the feature can be turned off entirely, the answer is yes
@nashif points out that the name can be misleading, as @stephanosio already mentioned
@peter-mitsis will ping @andyross to ensure he reviews this RFC
@nashif asks how the actual stats will be retrieved from memory and out of the SoC. @microbuilder points out that right now mcumgr has the functionality to query stats, as well as using gdb.
@henrikbrixandersen thinks it does make sense to have two different stat systems, because one (this one) is more of a debugging tool and the other (driver stats) is about gathering info about hardware peripheral. The latter is much more restricted in scope and width.

Object Core.pptx
Slides uploaded.

I don't think I have many concerns other than the cosmetic one: "kernel object / kobj" is a term of art already appropriated by the userspace subsystem, so we need to untangle that somehow (though adding these stats to existing kobj structs makes perfect sense of course).
It also wouldn't hurt to write up a section on expected synchronization behavior.  This has been a persistent wart on all our tracing/enumerating APIs.   Some stats ("how many?") can be read atomically and don't need it, others only make sense in multi-word sets ("received" X "transmitted") and absolutely need it.  I don't know necessarily that the API needs to address this directly but we should have a best practices kind of story explaining how to do it correctly.
Also: the enumeration API for this almost certainly does need locking if the list of objects is going to be runtime-mutable, which it likely is.


assets.raise_runtime_errors can't be set when running the tests

With this setting in development.rb:
config.assets.raise_runtime_errors = true

Running rake spec:javascript fails with this error:
Sprockets::Rails::Helper::AbsoluteAssetPathError - Asset names passed to helpers should not include the "/assets/" prefix. Instead of "/assets/jasmine.css", use "jasmine.css":
  sprockets-rails (2.2.0) lib/sprockets/rails/helper.rb:200:in `check_errors_for'
  sprockets-rails (2.2.0) lib/sprockets/rails/helper.rb:89:in `asset_path'
  actionview (4.1.6) lib/action_view/helpers/asset_url_helper.rb:256:in `stylesheet_path'
  actionview (4.1.6) lib/action_view/helpers/asset_tag_helper.rb:100:in `block in stylesheet_link_tag'
  actionview (4.1.6) lib/action_view/helpers/asset_tag_helper.rb:96:in `stylesheet_link_tag'
  sprockets-rails (2.2.0) lib/sprockets/rails/helper.rb:162:in `block (2 levels) in stylesheet_link_tag'
  sprockets-rails (2.2.0) lib/sprockets/rails/helper.rb:161:in `block in stylesheet_link_tag'
  sprockets-rails (2.2.0) lib/sprockets/rails/helper.rb:158:in `stylesheet_link_tag'
  jasmine-rails (0.10.2) app/views/layouts/jasmine_rails/spec_runner.html.erb:7
  actionview (4.1.6) lib/action_view/template.rb:145:in `block in render'
  activesupport (4.1.6) lib/active_support/notifications.rb:161:in `instrument'
  actionview (4.1.6) lib/action_view/template.rb:339:in `instrument'
  actionview (4.1.6) lib/action_view/template.rb:143:in `render'
  rack-mini-profiler (0.9.2) lib/mini_profiler/profiling_methods.rb:108:in `block in profile_method'

It looks like check_errors_for is being run twice, once on jasmine.css (which succeeds), then later on /assets/jasmine.css (which fails). This might be a bug in Sprockets; I'm not sure.
This is only really an issue because the test suite is unexpectedly running in the development environment: #121
Note that this bug doesn't occur if I run the tests directly from my browser.

Took me a long time to find this, but I can confirm this issue still exists on master.

@seanlinsley safe to close now that #173 is landed?

I just confirmed that this has been resolved. Thanks @rudyjahchan and @searls :green_heart:


server/container_create: Mask /proc/keys

From Justin Cormack:

This leaks information about keyrings on the host.  Keyrings are not namespaced.

CC @runcom.

/test all

thanks @wking lgtm

/test e2e_fedora

LGTM


improvement limit segment cache by fd limit or memory

remove a useless config.
Proposed changes
Issue Number: close #xxx

run buildall


Split up the ddos_refs rule for improved accuracy

With this change, merely mentioning synflood is only a medium, not a critical.
While we solved datadog, I encountered other software packages that mentioned synflood in a healthy way, so I've split the queries up so that it's unlikely to have a critical hit any longer.

Closes: #289


Is it possible to start a substrate BABE blockchain with no Grandpa authorities and BABE validators?

Hello
I'm trying to implement a PoS network on substrate using substrate provided pallets - pallet_session, pallet_staking, pallet_babe, etc. The current Runtime and chain spec implementation is similar to what is found in the substrate repository. I've realized that I need to set Session keys for GenesisConfig before starting the blockchain. I also noticed that the Session keys set for SessionConfig are used to configure the grandpa authorities.
My questions are:
Is there a way to start the blockchain such that no session keys are set?
Do all grandpa authorities need to be hardcoded in the chain spec? If not, how are the authorities added after nodes have gone live?

I think this question is not directly related to this pallet. Please ask your question on Substrate StackExchange and you will be able to get an answer much faster - https://substrate.stackexchange.com/


Sending a message to an ongoing conversation outside of Post

What is the minimal amount of information that I need to populate a new Message object with in order to send a message to an ongoing conversation.
My code is outside of the Post([FromBody]Message message) method and looks similar to this:
var connector = new ConnectorClient();
Message message = new Message
{
Text = "Message"
// What else need to be provided to send the message?
};
await connector.Messages.SendMessageAsync(message);

I'm not exactly sure - Message.CreateReplyMessage seems to fill in To, ReplyToMessageId, Participants, and TotalParticipants, and then these fields if available: From, ConversationId, ChannelConversationId, ChannelMessageId.

Thx @willportnoy. I need to transfer all of the required parameters in the URL to a login page so I like to keep this as minimal as possible. It would be cool if ReplyToMessageId was enough information to send the reply.

@jakobpn Experimentally found necessary parameters for Slack, Skype, Telegram:
Message message = new Message
{
  ChannelConversationId = channelConversationId,
  From = new ChannelAccount
  {
    ChannelId = channelId,
    Address = botAddress,
    IsBot = true
  },
  To = new ChannelAccount
  {
    ChannelId = channelId,
    Address = userAddress
  },
  Text = text
};

ChannelConversationId only necessary Slack, otherwise the message will be added @userAddress.

The minimum information is to have the From,To fields filled out and  some sort of payload:

Text, Attachments, ChannelData

If you give no ConversationId/ChannelConversationId then it will be considered a new conversation.  If you provide a previous ConversationId/ChannelConversationId then it will be routed as a reply to the existing conversation.


AVRO-3093: Remove the Obsolete lang/py3 Codebase

Removing this code reduces confusion and cleans up the repository.
Jira

[x] Addresses AVRO-3093
[x] References it in the PR title
[x] Adds no dependencies

Tests
N/A
Commits

[x] Commits all reference the ticket.

Documentation
N/A

This "fixes" 88 confused findings by CodeQL.


Allow filtering of singleton file trees

This re-allows filtering of file trees which consist only of a single regular file. The path of the root file for filtering is its name.
Fixes #8077.

@lptr PTAL!


storage: cleanup

@ngaut @siddontang @disksing PTAL
We use dynamic dispatch already, so generic is redundant.

 Thank you for your submission, we really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.

LGTM

LGTM

LGTM. Amazing!


Database Is Locked

I use Monkey Cache to get data for two fragments that are displayed on a tab layout with a viewpager. Both fragments are loaded at the same time even though only one is visible at any given time. However, I get a "Database Is Locked" error in Crashlytics.
I quick workaround that came to mind was to just load one fragment at a time. However, both fragments have to be loaded for the sake of showing a sliding animation.
Perhaps using a singleton with locking for accessing Monkey Cache could also alleviate the problem.
Thank you for your help.

Which monkey cache are you using? Sqlite? You could use a lock around your own access to it, however I do lock on most implemenations.

Thank you @jamesmontemagno for your reply. Yes, I'm using the Sqlite implementation. I ended up writing code to access the MonkeyCache just when the the property UserVisibleHint in the fragment is set to true.
public override bool UserVisibleHint
        {
            get { return base.UserVisibleHint; }
            set
            {
                base.UserVisibleHint = value;
                if (UserVisibleHint)
                {
                   // call MonkeyCache
                }
            }
        }

Thanks a lot for MonkeyCache!

Do you have a sample before of what was causing issues?


Bring back paste button hide behavior 3

First Try
I wrote the original PR #54902 and merged it when it was green.
The integration test android_semantics_testing failed after it was merged, so it was reverted.  I ran the integration test locally and found that it did fail in the same way locally (using a physical Pixel 2).
Second Try
I fixed the integration test failure by updating the expected semantics options, and I added an extra case that specifically tests the behavior in this PR.  Then I created a new PR with this changed reverting the revert and merged it.
The integration test passed and the build went green after the merge. However, during the next roll, there were errors in google3 with a stacktrace pointing to my code, so it was reverted.
Third Try
I identified and fixed the problem in my code.  Then I created and merged a PR with this change reverting the previous reversion.
I didn't rerun the integration test at the time, because nothing should have changed related to it, but running it on this branch now I see that it fails again.  The failure seems to have nothing to do with the change that I made in this PR.  I'm guessing it is related to something that changed in master in the time between the two PRs.
This Fourth Try
I undid my original changes to the integration test since it now seems to pass without those changes.  I kept my extra case for this PR, though.  The integration test now passes locally.

Wondering: Maybe the previous run of the integration test is affecting the next? E.g. during the previous run you copied something into the text field. So during the next run, the clipboard doesn't appear empty anymore and the test (expecting it to be empty) fails.
With this change, the test will now fail if the clipboard happens to be empty at the start of the test. So, I think it is still flaky. Can we set the clipboard state to a known state at the beginning of the test? Ideally, we would clear it to test both cases: a full and an empty clipboard. Is there a command to clear the textfield that we could execute at the beginning of the test?

  It seemed to be flaky, but when I ran it over and over it again it always gave the same result (because the clipboard status didn't change between runs).  I assumed it would start empty like in the unit tests, but I'll look for a way to clear it manually.

@goderbauer I've updated it to copy some text into the clipboard for the relevant integration tests and it seems to work.  It passes whether or not the clipboard is empty before running the test.
I found no reliable way to clear the clipboard except for restarting the device.  So, I'm not testing the case where there is nothing in the clipboard, I'm just making sure there is definitely something pasteable on the clipboard.  When I do that, the integration tests pass without any further migration needed, as I would expect.

@justinmc @goderbauer
Can we please revert back this PR? This causes Flutter for Web to fail.
We caught it in our integration tests: https://ci.chromium.org/p/flutter/builders/try/Linux Web Engine/4099?
These tests only run on the engine side so we were able to catch it only now.
Overall getData means paste, reading the clipboard on web, which requires permission and should only be done with user permission. Calling getData will bring a browser popup window and will ask user for permission. It is not the best practice to ask user for their clipboard's access without an explicit event that might trigger it. Let's discuss a solution that will also work for web before remerging this PR.


Include local images with base64 encoded data uri

In order to make the generated presentation even more self-contained, this PR allows the user to specify an option to encode images present locally in base64 format and inserted as data uris in the presentation instead of a normal src reference which forces to always have the images next to the html presentation.
This works, for the moment, only for images that are on the machine where cleaver is run, and specified with a relative path.

This has been here for a while.  I would love this feature, are there plans to merge it?  Even without it being perfect.

Closing this PR for now. If you want to rebase from master and re-open, that would be lovely!


Install command does not support OUTNAME

Steps to Reproduce / Actual Behavior:

Build MPK using OUTNAME command/parameter: magic-script build
Make sure the OUTNAME parameter (from app.package) has different name than app.mpk
Install the MPK: magic-script install
error: error: File not found: '.out/app/app.mpk'

Example:
mlla1848:MxsTestRc10 jgrills$ magic-script build
Adding tail data
Tail data added successfully to 'digest.sha512.signed'built package: .out/custom/custom.mpk

mlla1848:MxsTestRc10 jgrills$ magic-script installmldb install .out/app/app.mpk
error: File not found: '.out/app/app.mpk'

Expected Behavior:
Magic-Script install should support OUTNAME command/parameter

When you type magic-script --help, the install command has 2 arguments, target & path. With path you can specify the path to the *.mpk file, where `.out/app/app.mpk' is the default path.
Can you try with magic-script install lumin .out/custom/custom.mpk ?

@grozdanov Do you have some feedback on this issue?

@panwrona the SCRIPT-742 has been closed.


Missing information on how to remove Guest members

Since guests have a User Principal Name constructed from the email address in the form:
<EMAIL_ADDRESS>The command doesn't run successfully please see below error output.
PS C:\Users\remotelearning_xxx> Remove-TeamUser -GroupId 5d558f85-bd09-40c9-8529-29dxxx16372 -User<EMAIL_ADDRESS>Remove-TeamUser : No account or login hint was passed to the AcquireTokenSilent call.
At line:1 char:1

Remove-TeamUser -GroupId 5d558f85-bd09-40c9-8529-29dxxx16372 -User p ...

  + CategoryInfo          : NotSpecified: (:) [Remove-TeamUser], AadAuthenticationFailedException
  + FullyQualifiedErrorId : Microsoft.TeamsCmdlets.Powershell.Connect.Exceptions.AadAuthenticationFailedException,Microsoft.TeamsCmdlets.PowerShell.Custom.RemoveTeamUser

PS C:\Users\remotelearning_xxx>

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 11d1eab6-ffac-e7a7-bc88-e61a74baba31
Version Independent ID: a8181f1a-e575-410a-d5a4-0214c427b92d
Content: Remove-TeamUser (MicrosoftTeamsPowerShell)
Content Source: teams/teams-ps/teams/Remove-TeamUser.md
Service: teams-powershell
GitHub Login: @SerdarSoysal
Microsoft Alias: serdars

@gemsfounders How are you?
I was able to remove a guest using the original email/identity used to invite him, for example
Remove-TeamUser -GroupId 8942159d-d08b-4c81-99a2-92535b8ecac8 -User<EMAIL_ADDRESS>Hope this helps you

@get-itips Thank you very much for the contribution and sharing this explanation. @gemsfounders Hope this comment is helpful for you. If you see a documentation update is required, please feel free to open an issue for the same. We proceed here to close it. Thanks for taking out some time to open the issue. Appreciate and encourage you to do the same in future also.


Offer manual controls to signal end of turn

For some applications, users may want to explicitly indicate start and end of the user's turn, instead of having it to be a natural conversation.
In this case, the flow might look like this:

to signal start of user's turn: unmute microphone
to signal end of user's turn: mute microphone

on the agent side, we would want an option like:

end_of_turn="manual"
agent.start_user_turn() and agent_end_user_turn()

while the user's turn is active, the mic's input will be fed into the agent's input. We would want this capability to work the same way between VoicePipelineAgent and MultimodelAgent

This will be super useful for me too!


Improve the performance of hashTreeRoot

In blockAssembly.test.ts unit test, this code block
block.stateRoot = hashTreeRoot(
    newState,
    config.types.BeaconState
  );

took 2143ms in travis on Oct 31, in my local environment it took 800ms to 1000ms.

As @mpetrunic suggestion, after we moved state transition, state transition stub stopped working and was causing long unit tests.
Need to look into that.

@mpetrunic  I modified packages/lodestar/src/chain/factory/block/index.ts like this:
let start = Date.now();
  const state = stateTransition(config, currentState, block, false, false);
  console.log('@@@ stateTransition took ', Date.now() - start);
  start = Date.now();

  block.stateRoot = hashTreeRoot(
    state,
    config.types.BeaconState
  );
  console.log('@@@ hashTreeRoot took ', Date.now() - start);

and run blockAssembly.test.ts unit test again. The result is
@@@ stateTransition took  0
@@@ hashTreeRoot took  904

It proves that stateTransition stub works well and there is a performance issue of hashTreeRoot.

I also made a simpler test which exclude state transition stuff:
it.only("test hashTreeRoot", async function () {
    let start = Date.now();
    const state = generateState();
    console.log('@@@ generateState took ', Date.now() - start);
    start = Date.now();
    hashTreeRoot(
      state,
      config.types.BeaconState
    );
    console.log('@@@ hashTreeRoot took ', Date.now() - start);
  });

The result is
@@@ generateState took  33
@@@ hashTreeRoot took  833

It means that this performance issue is nothing related to state .transition.


Update GitHub Actions versions for improved compatibility

Issue #535
This pull request updates the versions of various GitHub Actions used in our workflow to ensure compatibility and take advantage of the latest features. The changes include:
Upgraded actions/checkout from v3 to v4.
Updated actions/setup-dotnet from v3 to v4.
Transitioned github/codeql-action/init from v2 to v3.
Switched github/codeql-action/analyze from v2 to v3.
Upgraded actions/upload-artifact from v3 to v4.
I have tested these changes in a workflow run, and there were no errors encountered. This update aims to keep our workflow aligned with the latest improvements and best practices. Please review the changes
I want to emphasize that I have resolved any issues related to updating this branch. Earlier attempts may not have been reflected as expected, but now I have addressed the problem, and subsequent changes will be accurately applied to this branch.
Thank You

Some issues were arising, and my updates were not getting reflected in the pull request. It was a branch-related issue. I have now fixed that problem, and I assure you that it won't be repeated. I apologize for any inconvenience caused. I will maintain consistency in the conversation and use the same approach for any future changes

All good, I appreciate you working with us.


Document server data

Per request, we should document more specifically what happens when Security Fix Alerts and Error and Diagnostics Reporting settings are enabled.

Thanks! Agree -- as per discussion during offsite, this will be included prior to 3.7 release. Have a task for myself to add it so assigning this issue to myself

Completed with #912


Update CODEOWNERS for libraries and samples

Coverage remained the same at 82.026% when pulling 95a7f0f03af08150b09e39324c7d911834b87365 on codeowner-updates into 1ef8c3d670fc099047922542dbb9c0ad6ec0b511 on dev.


[RFE] Bump Harvester node driver to v0.6.1

Is your feature request related to a problem? Please describe.
Describe the solution you'd like
Bump Harvester node driver to v0.6.1 to suppot multi-nic and multi-disk
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
Additional context
Add any other context or screenshots about the feature request here.
Releated Harvester issue:  https://github.com/harvester/harvester/issues/2426

@TachunLin Could you please help with the testing?

Verified fixed on Rancher v2.7-head and v2.6-head with Harvester v1.1.2-rc1. Close this issue.
Result

[ ] Verified node driver v0.6.1 have already built into v2.7-head and v2.6-head
[ ] Verified Rancher v2.7-head and v2.6-head both pass the following RKE1 and RKE2 test cases

For RKE2

Can create new RKE2 guest cluster with multi-nics and multi-disks correctly

Can update RKE2 guest cluster setting correctly

Can delete RKE2 guest cluster correctly

For RKE1

Can create new RKE1 guest cluster with multi-nics and multi-disks correctly

Can delete RKE1 guest cluster correctly

Test Information

Test Environment: 1 node Harvester on local kvm machine
Harvester version: v1.1.2-rc1
Rancher version: v2.7-head (ab561bf), v2.6-head (5d91d1a)
RKE2 version: v1.25.9, v1.24.9, v1.24.10

RKE2 Verification Steps

Import Harvester to Rancher and create cloud credential

Check the default version of Harvester node driver is v0.6.1

Create a new RKE2 guest cluster with new node driver and new UI config

Add two new volume

Add two new networks

Add network data for multiple-nics in Advanced

network:
  version: 1
  config:
   - type: physical
     name: enp1s0
     subnets:
     - type: dhcp
   - type: physical
     name: enp2s0
     subnets:
     - type: dhcp

Check can create new RKE2 guest cluster correctly with multi-nics and multi-volumes
Edit RKE2 cluster config, change cpu, memory and disk size
Check can update RKE2 guest cluster correctly
Delete the RKE2 cluster
Check can delete RKE2 guest cluster correctly

RKE1 verification steps

Import Harvester to Rancher and create cloud credential
Check the default version of Harvester node driver is v0.6.1
Add two new volume
Add two new networks

Create a new RKE1 guest cluster with new node driver and new UI config
Delete the RKE1 cluster
Check can delete RKE1 guest cluster correctly


parameter.cache() will change an invalid cache to valid, even for parameters with get_cmd=None

Steps to reproduce
p = Parameter("name", set_cmd=None)
assert not p.cache.valid
p.cache()
assert not p.cache.valid

p = Parameter("name", set_cmd=None)
p.set(5)
assert p.cache.valid
p.cache.invalidate()
assert not p.cache.valid
p.cache()
assert not p.cache.valid

the last assert will fail in both cases
Expected behaviour
As we did not implement a get_cmd, parameter.cache() always returns the last cached value,even though it is not valid (this is fine).
Querying the cache should leave it marked as invalid, unless we get information about the parameter from another place, i.e. unless a get_cmd is implemented.
Actual behaviour
parameter.cache() will always update the cache, switching an invalid cache to valid. See the red path in the flow diagram:

Comment
It is possible that using both cache.invalidate() and get_cmd=None together is not intended and considered user error. In this case, this should be documented.
System
windows
qcodes 0.33.0

Hmn, this is tricky. In my opinion get_cmd=None means that that the parameter is fully defined by its cache so I would probably lean towards that the error is that it is possible to ever get a parameter with get_cmd=None into a state where the cache is invalid. Do you have a specific usecase for using get_cmd=None.
I would probably suggest:

get_cmd=None can only be used together with set_cmd=None -> ManualParameter. Otherwise warn and eventually an error
get_cmd=None + set_cmd=None the cache is always valid and invalidate raises

We stumbled upon this because we had an instrument driver where one parameter cannot be queried from the instrument. The person that wrote the parameter therefore only specified the set_cmd (an thus used the default get_cmd=None). This then led to errors downstream where the cache was valid, but no longer in sync with the actual instrument state. We will use get_cmd=False from now on, that is more explicit anyway.

good idea. I propose that the docstring should also be updated so that developers do not repeat our mistake
I tend to agree, but this might be tricky. cache.invalidate() and the cache itself know nothing about get_cmd and set_cmd.
It might be good to change the default to get_cmd=False, in line with set_cmd. That would prevent mistakes made by using the default settings.


Can't install from bower - no tags found

On running bower install --save prefix-free:
Additional error details:
No tags found in git://github.com/LeaVerou/prefixfree.git
Available branches: gh-pages

:)

@tdmalone Did you see #173 ?

No I didn't, thanks! I downloaded it manually, but agree with the comment in that issue that 'While the fix worked, this should be resolved to allow easier uptake via bower.' =)

@tdmalone I have a PR with steps to tag :) Lets hope it gets tagged so this won't occur in the future :)


[FAB-17535] Increase PushAckTimeout to prevent test flake

Signed-off-by: Wenjian Qiao<EMAIL_ADDRESS>Type of change

Test update

Description
Increase pvtdata dissemination PushAckTimeout to prevent test flake.
Related issues
https://jira.hyperledger.org/browse/FAB-17535

/ci-run


Helper Functions and God Mode when medic is on cooldown

Helperfunctions:
hasItem(itemId) // Boss drops etc.
isAbilityActive(abilityId) // check if a ability like cooldown-reduction or gold-rain is active
also add a object for abilitys / useables.

The correct spelling is "ABILITIES".
Having "ABILITYS" can/will cause confusion and future typos by other contributors

@coogie, thanks fixed :+1:


⚠ Bofrost.at has degraded performance

In ed7af86, Bofrost.at (https://www.bofrost.at) experienced degraded performance:

HTTP code: 200
Response time: 2257 ms

Resolved: Bofrost.at performance has improved in 6feaf3e after 22 minutes.


[match] add caching layer to significantly improve performance by up to 100x

Checklist

[x] I've run bundle exec rspec from the root directory to see all new and existing tests pass
[x] I've followed the fastlane code style and run bundle exec rubocop -a to ensure the code style is valid
[x] I see several green ci/circleci builds in the "All checks have passed" section of my PR (connect CircleCI to GitHub if not)
[x] I've read the Contribution Guidelines
[x] I've updated the documentation if necessary.
[x] I've added or updated relevant unit tests.

Hi.
Problem
We have 112 provisioning profiles. And running match not in readonly mode takes a lot of time for us.
I've made a Faraday middleware to count requests, fetch time, and the amount of passed data.
I saw many redundant fetches: profiles, certificates, bundle IDs, and devices fetched for each app_identifier and some of them several times.
tl;dr; The cached version of the match installs all 112 profiles with cert and device checks as fast as the current version manages to check and install just one development profile with the same parameters.
Description
Introduce cache and fetcher for match. We must save the state of profiles, certificates, bundle IDs, and devices. I've looked at what information changes when the match is executed and what is static.

Bundle IDs: static. match doesn't modify bundle identifiers.
Devices: static. match doesn't modify devices.
Provisioning: static. match just checks if the current provisioning is valid. After generating a new one, we don't need to update or reset the cache with a new provisioning profile because it's unused for the next app_identifier.
Certificates: dynamic but close to static. When the match generates a new certificate, it generates it only once for all app_identifiers, and resetting the cache once is not a big problem.
With this, I see that caching will not bring a lot of headaches, and there will be no cache inconsistency. And introducing cache on the instance level will probably bring more good than bad.

Another good thing is that the match is executed with strict parameters: type and platform. And we can write better filters for fetching certificates and profiles.
Results (x100 😅)

Before
After
%

calls count
1,894
21
0.011

duration in seconds
4,957.58
30.57
0.006

response size
2,702,427,979
16,945,609
0.006

Stats per url
Before:

{
  "https://api.appstoreconnect.apple.com/v1/bundleIds": {
    "duration": 85.95213599999997,
    "size": 285596,
    "calls_count": 112
  },
  "https://api.appstoreconnect.apple.com/v1/certificates": {
    "duration":<PHONE_NUMBER>000001,
    "size": 12128325,
    "calls_count": 244
  },
  "https://api.appstoreconnect.apple.com/v1/profiles": {
    "duration": 4370.683801999995,
    "size":<PHONE_NUMBER>,
    "calls_count": 1258
  },
  "https://api.appstoreconnect.apple.com/v1/devices": {
    "duration":<PHONE_NUMBER>0000005,
    "size": 2287600,
    "calls_count": 280
  }
}

After:

{
  "https://api.appstoreconnect.apple.com/v1/bundleIds": {
    "duration": 9.408271000000001,
    "size": 199607,
    "calls_count": 9
  },
  "https://api.appstoreconnect.apple.com/v1/certificates": {
    "duration": 5.092039,
    "size": 378884,
    "calls_count": 5
  },
  "https://api.appstoreconnect.apple.com/v1/profiles": {
    "duration": 14.223327999999999,
    "size": 16328383,
    "calls_count": 5
  },
  "https://api.appstoreconnect.apple.com/v1/devices": {
    "duration": 1.850342,
    "size": 38735,
    "calls_count": 2
  }
}

Solution
This PR.
To ease the review, I can split it into 5 smaller PRs:

Move device_count_different? and certificate_count_different? to a new file.
Slightly refactor sigh: move profile_type and certificate_types map functions to a module.
Create a Match::Portal::Fetcher to have a controlled entry point for API requests.
Add Match::Portal::Cache.
Inject cached data into the sigh when creating profiles.

As for me, making separate PRs into the main branch makes almost no sense. I'm a fan of a feature branch but not a maintainer 😅. If you are ready for one biggie, please let me know.
Please tell me if my solution can be merged into the fastlane, and what strategy of PRs you would like to use.
PS. I want to thank @PaulTaykalo for his #21016 PR, which I included in this one. Paul, I hope you don't mind 😉.

@rogerluan ,

Is the cache persistent (e.g. on disk)? If so, what's the persistency scope (e.g. is it valid throughout different fastlane action calls of a single lane, or different fastlane lane calls?
What is the cache bursting logic?

It's in-memory cache.

It works only in match. match action is responsible for its own cache.

There is an option to pass cached objects to the sigh from match.

Cache lifetime is a single match run.
It has two internal invalidation points:

The whole certificates cache is reset on cert generation.
"Forgetting" a single provision after a new one was created. Which now is redundant after fixing a @lacostej comment.

No long-term persistence lane or a whole fastlane run. And no headache on what to do if the lane runs 30 mins, and we have another Fastlane run on another computer which made changes to certs/profiles.
It doesn't fetch irrelevant info and utilizes available filters in the API — filter cert by types, fetch only active devices, only listed bundle ids.

🚀! Nice PR @nekrich. Thanks @milch @rogerluan :)

@nekrich I'm experiencing an issue with the error message "cached_profiles parameter must be a non-empty array of Spaceship::ConnectAPI::Profile" after upgrading to fastlane version 2.218.0. I had to revert to version 2.217.0 to resolve the issue.
Any suggestions on how to fix it?

@nekrich I'm experiencing an issue with the error message "cached_profiles parameter must be a non-empty array of Spaceship::ConnectAPI::Profile" after upgrading to fastlane version 2.218.0. I had to revert to version 2.217.0 to resolve the issue.
Any suggestions on how to fix it?

@thanhcuong1990 , I'll look into in in a couple of hours. Can you please tell what auth type you use: Keys or login and password?

@thanhcuong1990 , I'll look into in in a couple of hours. Can you please tell what auth type you use: Keys or login and password?

I used FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD for auth.

The same issue. I'm using *.p8 key
[11:57:22]: Error setting value '[]' for option 'cached_profiles'
+-----------------------------------------+
|              Lane Context               |
+------------------+----------------------+
| DEFAULT_PLATFORM | ios                  |
| PLATFORM_NAME    | ios                  |
| LANE_NAME        | ios certificates_dev |
+------------------+----------------------+
[11:57:22]: cached_profiles parameter must be a non-empty array of Spaceship::ConnectAPI::Profile

+---------------------------------------------------------------------------+
|                             fastlane summary                              |
+------+------------------------------------------------------+-------------+
| Step | Action                                               | Time (in s) |
+------+------------------------------------------------------+-------------+
| 1    | default_platform                                     | 0           |
| 2    | Switch to ios app_store_connect_api_key_creator lane | 0           |
| 3    | app_store_connect_api_key                            | 0           |
| 4    | register_devices                                     | 1           |
| 💥   | match                                                | 9           |
+------+------------------------------------------------------+-------------+

+-----------------------------------------------------------+
|                 Plugin updates available                  |
+---------------------------+--------------+----------------+
| Plugin                    | Your Version | Latest Version |
+---------------------------+--------------+----------------+
| firebase_app_distribution | 0.7.4        | 0.8.0          |
+---------------------------+--------------+----------------+
[11:57:22]: To update all plugins, just run
[11:57:22]: $ bundle exec fastlane update_plugins

[11:57:22]: fastlane finished with errors

[!] cached_profiles parameter must be a non-empty array of Spaceship::ConnectAPI::Profile
 ✘ viktor_savchik@onexoer  ~/path/to/project/ios   master  bundle install

@nekrich yes, it works

@nekrich but when repeating the same command, there is another issue.
12:59:12  🔗  You can ⌘ + double-click on links to open them directly in your browser.
12:59:12  bundler: failed to load command: fastlane (/Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bin/fastlane)
12:59:12  /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/profile_includes.rb:54:in `devices_differ?': \e[31m[!] undefined method `map' for nil:NilClass (NoMethodError)
12:59:12
12:59:12        profile_device_ids = profile_devices.map(&:id).sort
12:59:12                                            ^^^^\e[0m
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/profile_includes.rb:23:in `should_force_include_all_devices?'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:253:in `fetch_provisioning_profile'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:106:in `block (2 levels) in run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:105:in `loop'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:105:in `block in run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:104:in `each'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:104:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/actions/sync_code_signing.rb:19:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:263:in `block (2 levels) in execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/actions/actions_helper.rb:69:in `execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:255:in `block in execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:229:in `chdir'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:229:in `execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:157:in `trigger_action_by_name'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/fast_file.rb:159:in `method_missing'
12:59:12  	from Fastfile:40:in `block (2 levels) in parsing_binding'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/lane.rb:41:in `call'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:204:in `try_switch_to_lane'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:146:in `trigger_action_by_name'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/fast_file.rb:159:in `method_missing'
12:59:12  	from Fastfile:178:in `block (2 levels) in parsing_binding'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/lane.rb:41:in `call'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:49:in `block in execute'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:45:in `chdir'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:45:in `execute'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/lane_manager.rb:46:in `cruise_lane'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/command_line_handler.rb:34:in `handle'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/commands_generator.rb:110:in `block (2 levels) in run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/command.rb:187:in `call'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/command.rb:157:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/runner.rb:444:in `run_active_command'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:124:in `run!'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/delegates.rb:18:in `run!'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/commands_generator.rb:354:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/commands_generator.rb:43:in `start'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/cli_tools_distributor.rb:123:in `take_off'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/bin/fastlane:23:in `<top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bin/fastlane:25:in `load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bin/fastlane:25:in `<top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:58:in `load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:58:in `kernel_load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:23:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli.rb:492:in `exec'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli.rb:34:in `dispatch'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli.rb:28:in `start'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/exe/bundle:37:in `block in <top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/exe/bundle:29:in `<top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/bin/bundle:25:in `load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/bin/bundle:25:in `<main>'
12:59:12  /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/profile_includes.rb:54:in `devices_differ?': undefined method `map' for nil:NilClass (NoMethodError)
12:59:12
12:59:12        profile_device_ids = profile_devices.map(&:id).sort
12:59:12                                            ^^^^
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/profile_includes.rb:23:in `should_force_include_all_devices?'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:253:in `fetch_provisioning_profile'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:106:in `block (2 levels) in run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:105:in `loop'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:105:in `block in run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:104:in `each'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/match/lib/match/runner.rb:104:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/actions/sync_code_signing.rb:19:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:263:in `block (2 levels) in execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/actions/actions_helper.rb:69:in `execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:255:in `block in execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:229:in `chdir'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:229:in `execute_action'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:157:in `trigger_action_by_name'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/fast_file.rb:159:in `method_missing'
12:59:12  	from Fastfile:40:in `block (2 levels) in parsing_binding'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/lane.rb:41:in `call'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:204:in `try_switch_to_lane'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:146:in `trigger_action_by_name'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/fast_file.rb:159:in `method_missing'
12:59:12  	from Fastfile:178:in `block (2 levels) in parsing_binding'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/lane.rb:41:in `call'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:49:in `block in execute'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:45:in `chdir'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/runner.rb:45:in `execute'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/lane_manager.rb:46:in `cruise_lane'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/command_line_handler.rb:34:in `handle'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/commands_generator.rb:110:in `block (2 levels) in run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/command.rb:187:in `call'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/command.rb:157:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/runner.rb:444:in `run_active_command'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:124:in `run!'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/commander-4.6.0/lib/commander/delegates.rb:18:in `run!'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/commands_generator.rb:354:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/commands_generator.rb:43:in `start'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/fastlane/lib/fastlane/cli_tools_distributor.rb:123:in `take_off'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bundler/gems/fastlane-729fb915082d/bin/fastlane:23:in `<top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bin/fastlane:25:in `load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/bin/fastlane:25:in `<top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:58:in `load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:58:in `kernel_load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:23:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli.rb:492:in `exec'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli.rb:34:in `dispatch'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/cli.rb:28:in `start'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/exe/bundle:37:in `block in <top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.4.19/exe/bundle:29:in `<top (required)>'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/bin/bundle:25:in `load'
12:59:12  	from /Users/jenkins/.rbenv/versions/3.1.2/bin/bundle:25:in `<main>'

@viktor-savchik-idf , can you please share the options you use to run the match action? I'm interested in all force_* parameters, the readonly flag and profile type. Thanks.

We started recieving this error while trying to create apple profile via fastlane
using the command fastlane match appstore --api_key_path match_api_key.json --team_id $TEAM_ID && fastlane ios bootstrap

@viktor-savchik-idf , can you please share the options you use to run the match action? I'm interested in all force_* parameters, the readonly flag and profile type. Thanks.

Here is the complete action, the adhoc type also exhibits the same issue.
lane :certificates_dev do
    	api_key = app_store_connect_api_key_creator

        register_devices(devices_file: "./devices.txt", api_key: api_key)

        match(
    	        app_identifier: ["id.one", "id.two", "id.three"],
      		api_key: api_key,
		type: "development",
		force_for_new_devices: true,
		template_name: "ApplePay In-App Provisioning Distribution",
    	)
end

Hi,
I've upgrade fastlane today and I'm observing following error when trying to run iOS build:
/opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/profile_includes.rb:56:in `devices_differ?': [!] undefined method `map' for nil:NilClass (NoMethodError)

      profile_device_ids = profile_devices.map(&:id).sort
                                          ^^^^
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/profile_includes.rb:23:in `should_force_include_all_devices?'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/runner.rb:253:in `fetch_provisioning_profile'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/runner.rb:106:in `block (2 levels) in run'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/runner.rb:105:in `loop'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/runner.rb:105:in `block in run'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/runner.rb:104:in `each'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/match/lib/match/runner.rb:104:in `run'
	from /opt/homebrew/Cellar/fastlane/2.218.0/libexec/gems/fastlane-2.218.0/fastlane/lib/fastlane/actions/sync_code_signing.rb:19:in `run'
	```

Triggered by following action:

match(
  app_identifier: app_id,
  type: options[:profile_type], # adhoc
  readonly: false,
  verbose: false,
  force_for_new_devices: true,
)

@viktor-savchik-idf , @thanhcuong1990 can you please check if the fix works nekrich:fix/sigh-cache-parameters-validation?
Gemfile: gem 'fastlane', :git => 'https://github.com/nekrich/fastlane.git', :branch => 'fix/sigh-cache-parameters-validation')?

@nekrich Confirmed, it works for me.

Wow! I tried that right now with version 2.219.0 and for our 60+ apps this is a pure gamechanger 🎉 Thank you so much for this update 👍
Here are our benchmarks:
matrix-codesigning.sh is the script which runs fastlane match for development/appstore for each of our 60+ apps.
Before
matrix-codesigning.sh: 34s
matrix-codesigning.sh "do_refresh": 2h 9m
After
matrix-codesigning.sh: 30s
matrix-codesigning.sh "do_refresh": 7m  :exploding_head:


Add Brunc.io

Adds my yellow desktop to the list.

Love this Bruno! I'll add it to the list now!
Also thanks for the typo fix! ;)


Create build script to automate building, packaging, and deploying debug/release versions

Build script will be implemented using F# FAKE.


typo3 is getting wrong mail configuration

Is there an existing issue for this?

[X] I have searched the existing issues

Run a Diagnostic and Paste Link Here
https://gist.github.com/DavidBruchmann/392bfea3ecfade01afb51abcffdc906f
Expected Behavior
A fresh installed (minimal) TYPO3 v12 in ddev should have a working Mail configuration for mailhog.
Actual Behavior
Currently the settings produce a blocking error 503 message in frontend and backend:

Unsupported sendmail command flags "/usr/local/bin/mailhog sendmail<EMAIL_ADDRESS>--smtp-addr <IP_ADDRESS>:1025"; must be one of "-bs" or "-t" but can include additional flags.

    'MAIL' => [
        'transport' => 'sendmail',
        'transport_sendmail_command' => '/usr/local/bin/mailhog sendmail<EMAIL_ADDRESS>--smtp-addr <IP_ADDRESS>:1025',
        'transport_smtp_encrypt' => '',
        'transport_smtp_password' => '',
        'transport_smtp_server' => '',
        'transport_smtp_username' => '',
    ],

Steps To Reproduce
ddev config --project-type=typo3 --docroot=public --create-docroot --php-version 8.1
ddev composer req "typo3/minimal:^12"
ddev composer req helhum/typo3-console
ddev typo3 install:setup
ddev launch
Anything else?
No additional.php was created.
But while restarting after debugging the file additional.php was created with this mail configuration:
            // This mail configuration sends all emails to mailhog
            'MAIL' => [
                'transport' => 'smtp',
                'transport_smtp_encrypt' => false,
                'transport_smtp_server' => 'localhost:1025',
            ],

So actually I'm not sure where the wrong configuration is coming from.

Hi @DavidBruchmann - It looks to me like you've never done a ddev restart after installing TYPO3, so DDEV didn't know to add your settings.
Could you please see if you can recreate this problem with the TYPO3 quickstart, https://ddev.readthedocs.io/en/latest/users/quickstart/#typo3 ?

yes @rfay I did try that and it's working with restart.
I'm still curious where the wrong configuration is coming from, but that's certainly no direct ddev issue.
the quickstart is working, there the mail configuration is missing completely in settings.php.


[Bug] Solve the CSS issue of header and footer

The body width is not the same as header and footer.
https://pro.chakra-ui.com/components/application/tables <-- this is the original design.  I have subscription and access to this piece of code, let me know if the piece if code is needed.
I'm not sure where the issue comes from, or why the original design can do it.  Can you investigate and let me know?

@Risk-taker0501 I was just testing the labels.


Support F# Async<_> expressions

Product
Hot Chocolate
I think this request is conceptually fairly simple - it just requires a trivial wrapper.
As we all know, HotChocolate has built-in support for Task<_>. The following works fine:
type Query() =

    member _.GetFoo([<Service>] fooRepo: FooRepository, cancellationToken) : Task<Foo> =
        task {
            let! foo = fooRepo.GetFoo(cancellationToken)
            return foo
        }

However, in F#, we generally use Async<_> instead of Task<_>. This has several benefits, such as implicit cancellation token passing, better composability, etc. The following is how I ideally would like to write this, but it does not work, since HotChocolate does not know about Async:
type Query() =

    member _.GetFoo([<Service>] fooRepo: FooRepository) : Async<Foo> =
        async {
            let! foo = fooRepo.GetFoo()
            return foo
        }

However, simply by wrapping the async computation in Async.StartImmediateAsTask (and passing the cancellation token from HotChocolate), it works as expected:
    member _.GetFoo([<Service>] fooRepo: FooRepository, cancellationToken) : Task<Foo> =
        let comp =
            async {
                let! foo = fooRepo.GetFoo()
                return foo
            }

        Async.StartImmediateAsTask(comp, cancellationToken)

This is a simple workaround, but it's a drag to have to do in it every async resolver. I would like HotChocolate (possibly in HotChocolate.Types.FSharp or another F#-oriented package) to do this for me. That way, the middle of the three code snippets above would work out of the box.

@michaelstaib, I was attempting to support this via a middleware or formatter, but both are non-starters because HC fails already when building the schema with the following error:

The object type FSharpAsyncOfFSharpOptionOfString has to at least define one field in order to be valid.

As far as I know, this means that support has to be added directly in HC. Please let me know if this is incorrect and there is any way to support this using existing HC APIs. And of course, any help implementing this is greatly appreciated.

Again, the implementation is trivial: For Async<_> fields, just call Async.StartImmediateAsTask(comp, cancellationToken) where comp is the Async<_> value. That will give you a Task<_> value you can use as normal.

Nevermind, I seem to get some progress hooking into OnBeforeRegisterDependencies.

Unfortunately I seem to be blocked when it comes to UsePaging/connections. I have tried all TypeInterceptor hooks, but HotChocolate returns the following error no matter which I use:

Unable to infer the element type from the current resolver. This often happens if the resolver is not an iterable type like IEnumerable, IQueryable, IList etc. Ensure that you either explicitly specify the element type or that the return type of your resolver is an iterable type.
(HotChocolate.Types.ObjectType<.Async.Query>)

For normal (non-connection) fields, I managed to get it working using OnBeforeRegisterDependencies , changing the type, and adding a middleware to convert the Async to Task as described.
Any input on how this can be accomplished for connection fields is more than welcome.

Just want to state that FSharp.HotChocolate, now available on NuGet, has limited Async<_> support.
There is still the issue of not supporting node resolvers or middleware such as UsePaging, which I haven't found a way to support from a 3rd party package, so I think this issue is still relevant. These limitations are tracked in https://github.com/cmeeren/FSharp.HotChocolate/issues/8 and https://github.com/cmeeren/FSharp.HotChocolate/issues/9.


support AutoPend for cc2538

This PR is to resolve #460.  Main thoughts about this Autopend feature:

Assume Phy layer support AutoPend and Source Match by default.

Mac layer only provides two interfaces to allow upper layer add address to Phy layer source match table per packet destined to SED and remove the address after the packet is delivered.

ThreadError AddSrcMatchAddressEntry(Address &aAddr);
ThreadError ClearSrcMatchAddressEntry(Address &aAddr);

Phy layer provides four interfaces to all Mac layer to add/remove short/extended address to the source match table.

ThreadError otPlatRadioAddShortSrcMatchAddressEntry(uint16_t aShortAddress, uint16_t aPanId);
ThreadError otPlatRadioAddExtSrcMatchAddressEntry(uint8_t *aExtAddress);
ThreadError otPlatRadioClearShortSrcMatchAddressEntry(uint16_t aShortAddress, uint16_t aPanId);
ThreadError otPlatRadioClearExtSrcMatchAddressEntry(uint8_t *aExtAddress);

Phy layer would automatically ack with FramePending set only for data poll packets when there is packets queued for SED normally. But if the queued messages for SEDs are more than the entries of the source match table, the radio would ack with FramePending set for all packets.
eg for CC2538, the maximum entries of the source match table is 24.

Theses interfaces are open to change if there are more requirements.

Current coverage is 67.31% (diff: 90.00%)

Merging #562 into master will increase coverage by 0.53%

@@             master       #562   diff @@
==========================================
  Files            84         84
  Lines         11632      11610    -22
  Methods        1599       1597     -2
  Messages          0          0
  Branches       1392       1389     -3
==========================================
+ Hits           7767       7815    +48
+ Misses         3462       3391    -71
- Partials        403        404     +1

Powered by Codecov. Last update d8f9e5b...85a6cf8

@librasungirl, I think this is a great first step.  As noted in the comments above, we need to consider the following cases:

Multiple messages pending for a given sleepy child.
Handling all the cases where the hardware table for the sleepy child overflows.

For completeness, I think we will also want to add the following functions:

otPlatRadioClearAllShortSrcMatchAddressEntries()
otPlatRadioClearAllExtSrcMatchAddressEntries()

One nit: there are a lot of magic number uses.  Would be nice to clean that up with using proper #defines or enums.

Thanks @jwhui  and @abtink for your reviews.
Current code would add one entry per queued message to SED, it could handle a few messages queued( =< 24)  for SEDs, however as @jwhui pointed, there are issues when there are more queued messages for SEDs but there are no available entries in the hardware table.
And I guess compared to one entry per queued message in current code, maybe one entry for all queued messages destined to the same SED would be more popular way. @jwhui , right?
Will clean up magic numbers, thanks.

Implemented basically as discussed:

Interfaces:
PHY layer otPlat* APIs
void otPlatRadioEnableSrcMatch(otInstance *aInstance, bool aEnable); ThreadError otPlatRadioAddShortSrcMatchAddressEntry(otInstance *aInstance, const uint16_t aShortAddress); ThreadError otPlatRadioAddExtSrcMatchAddressEntry(otInstance *aInstance, const uint8_t *aExtAddress); ThreadError otPlatRadioClearShortSrcMatchAddressEntry(otInstance *aInstance, const uint16_t aShortAddress); ThreadError otPlatRadioClearExtSrcMatchAddressEntry(otInstance *aInstance, const uint8_t *aExtAddress); void otPlatRadioClearShortSrcMatchAddressEntries(otInstance *aInstance); void otPlatRadioClearExtSrcMatchAddressEntries(otInstance *aInstance);
MAC layer interface:
void EnableSrcMatch(bool aEnable); ThreadError AddSrcMatchAddressEntry(Address &aAddr); ThreadError ClearSrcMatchAddressEntry(Address &aAddr);

OT will enable auto pend feature by default.

OT is aware of current status of queued messages for SED and will add one entry into hardware table for each SED which has queued messages. When no available entry for the hardware table, auto pend feature will be disabled and FramePending will be set for each ACK. Auto pend feature will be restored when there is no more queued indirect messages.

Verification
a)  ping test (traffic looks fine):
ping_test(4 nodes).pcapng.zip
    Topology:
    Leader
      |
    Router - SED2
      |
    SED1
   Router ping SED1 in continuous ping mode with payload 20B and 100B separately;
   Router ping RealmLocalAllThreadNodes in continuous ping mode with payload 20B and 100B separately;
   Leader ping SED2 in continuous ping mode with payload 20B;
   Leader ping SED1 in continuous ping mode with payload 100B;
   Leader ping  RealmLocalAllThreadNodes in continuous ping mode with payload 20B and 100B separately.

b) indirect transmission verification pass

Full Test 5.3.2 results is as below
Router_5_3_2.zip
(notes: the last item fail due to another issue in investigation, not caused by indirect transmission verification.
 c) disable/re-enable auto pend feature automatically when hardware table overflows- to be verified later.
    currently OT supports 10 children at maximum, hardware table for CC2538 supports 12
    extended address entries or 24 short address address entries, theoretically very little
    possibility for hardware table overflow on cc2538 platforms.

Updates include

Re-enable source match whenever there are enough resources for pending addresses to be added to source match table who have queued messages.
limit adding an extended address to the source address table only attach process, otherwise, adding short address for queued messages.
Clean up the code, and rename the interfaces as below

void otPlatRadioEnableSrcMatch(otInstance *aInstance, bool aEnable);
ThreadError otPlatRadioAddSrcMatchShortEntry(otInstance *aInstance, const uint16_t aShortAddress);
ThreadError otPlatRadioAddSrcMatchExtEntry(otInstance *aInstance, const uint8_t *aExtAddress);
ThreadError otPlatRadioClearSrcMatchShortEntry(otInstance *aInstance, const uint16_t aShortAddress);
ThreadError otPlatRadioClearSrcMatchExtEntry(otInstance *aInstance, const uint8_t *aExtAddress);
void otPlatRadioClearSrcMatchShortEntries(otInstance *aInstance);
void otPlatRadioClearSrcMatchExtEntries(otInstance *aInstance);

Verification
indirect transmission verification could pass

full 5.3.2 harness outputs: Uploading Router_5_3_2.zip…
ping test (fake source match table overflow)
modify PHY layer to limit available source table entries could be 2 extended addresses or 4 short addresses. setup one network with 1 Leader and 6 SEDs. After topology formation, ping from Leader to RealmLocalAllThreadNodes addresses and thus simulating the disable/re-enable source match scenarios:
ping ff33:40:fd00:db8::1 20
ping ff33:40:fd00:db8::1 20 2
ping ff33:40:fd00:db8::1 100
ping ff33:40:fd00:db8::1 100 2
Traffic looks all right
ping_test_fakeoverflow.pcapng.zip

Updates:
add one interface to indicate whether the source match table is shared for short and extended address
bool otPlatRadioSrcMatchTableIsShared(otInstance *aInstance);


Support certificates in dynamic app service

It is not currently possible (unless I'm doing it wrong!) to use a certificate in Functions unless you use an App Service VM.
It would be useful to have a comparison table of what is / isn't possible with a dynamic plan (unless I've just not found it yet!)

I'll look into whether we support this/can support this.
Good feedback on comparison table.

@theMichaelB - I just found out that we'll be enabling this in a deployment this month. Stay tuned.

SSL certs are now supported, but client certificates are not yet supported.

👍  Need this... Loading cert from the file system for now.

Any idea when this will be supported. Its been a year now.

@Pankaj-Patro Its supported now. Looks like we forgot to close this issue.

Any documentation on how to use this? I've been searching but no dice.

@joeythomaschaske try this (same should work for functions):
https://docs.microsoft.com/en-us/azure/app-service/app-service-web-ssl-cert-load

@paulbatum
I logged an issue with the documentation for that article. There should be examples for each language azure functions supports. I'm unable to find any documentation on how to use them for node.js
My current solution is keeping the certificates in a separate folder I read from in my function and attach them to the http agent.

I agree with you samples would help. However I don't think there is anything specific here for functions. If you can find working instructions for how to load certificates from the windows cert store in nodejs, it should work in functions.

Maybe this npm package can help?
https://www.npmjs.com/package/win-ca


[Suggestion] File icon Keybindings

VSCode Version: 1.11.0 insiders bc9a7bb
OS Version: Windows 10

-- Sorry for the English, I used Google Translator --
Create a default icon for this page (regardless of the icons theme that I use), rather than the default white sheet.
Similar to Welcome page.

@sandy081 I thought of this icon.
You may have to adjust it according to the color theme.
https://icons8.com/web-app/15899/keyboard

Please feel free to submit a PR

Should this be closed? There is another icon for Keyboard shortcuts in the latest builds.

@eginwong Current icon is coming from file icon themes. I am happy to close this if current icon works for everyone.

I came across this issue because I was trying some keybindings with different when clauses for git, while editing my own code and more than once switched to the wrong tab because the icons are the same for default files and keybindings settings screen.
@sandy081 I'd like to try and fix this if possible. I believe there is already an icon for keyboard somewhere in vscode (it shows up as the Record Keys icon in keybindings editor). I think it should not be more than a few lines... I hope ;)

Marking this as dup of #59985 as the other one covers also settings


MULTIARCH-4363: Rebase with upstream: go modules updates

What type of PR is this?
/kind cleanup

What this PR does / why we need it:

Upgrade k8s and deps to v1.29.2
Update to latest modules

Which issue(s) this PR fixes:

Fixes #
Special notes for your reviewer:
git fetch upstream
git merge upstream/main
<<<resolve conflicts if any>>> && git commit
git push origin <feature_branch>```

**Release note**:

none

/cc @Karthik-K-N @mkumatag

/retest


[Concurrency] Retain the actor around the CAS in enqueue() when necessary.

It's possible that the job we enqueue holds the last strong reference to the actor. If that job runs on another thread after we enqueue it, then it's possible for this to be destroyed while we're still in this function. We need to use this after the enqueue when the priorities don't match. When it looks like that will happen, retain this before the enqueue to ensure it stays alive until we're done with it.
rdar://135400933

Linux and macOS both failed with:
Cancelling nested steps due to timeout
Sending interrupt signal to process
script returned exit code 143

Seems that's the Jenkins job timing out due to inactivity. Very odd.... Trying again.

@swift-ci please smoke test

@swift-ci please test

I missed one path that needed a release, resulting in the actor leaking. This causes the async_task_locals_isolated_deinit.swift test to hang forever since we end up leaking the actor.
It started getting pretty twisted with all the different exit paths, so I made a wrapper class that can do a defensive retain only once, and automatically balance it when leaving the scope, and adopted it here. This makes the fix a little less difficult to understand.

@swift-ci please test

LGTM

The Windows build timed out in the middle of the build. Seems unrelated, trying again.

@swift-ci please test windows platform