Add documentation about testing MVC applications using test server

We need documentation about how to perform end to end tests for MVC applications using test server in asp.net core 2.0
You can see an outline of the proposed contents in
https://blogs.msdn.microsoft.com/webdev/2017/12/07/testing-asp-net-core-mvc-web-apps-in-memory/
You can find a sample in
https://github.com/aspnet/samples/tree/master/samples/aspnetcore/mvc/testing/TestingMVC

We get questions almost every week on our repos on how to do this, so it's an important one.
I would like to see a more elaborated sample on the docs, showcasing how to tests some APIs and possibly some application that involves a database.

The current coverage for TestServer is (and each has a sample that show how to use it):
Integration testing
Razor Pages unit and integration testing
Testing controller logic

There are a few things that https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing needs to cover.

Refactoring Program.cs to include a CreateWebHostBuilder project and use that on the tests to have the same setup as your app. (Config files, etc.)
Setup the ContentRoot to point to the app's folder.
Copying the deps file into the bin folder of the testing project. (.target msbuild file on this sample).

Without all these things, razor views will not work in most scenarios.

When we attempted to upgrade this one (and one other), we totally dorked the update.
Root cause analysis:

Nuke the obj/bin folders ... a lingering deps.json file from a prior build will make it seem that all is good when in reality it's a big 'ole :bomb:!
When reviewing sample updates, the reviewer must pull the sample down and actually run it. Both of those would have failed on review because the bin folder wouldn't come down with the sample ... it would be built by the reviewer fresh ... and thus :boom: on the reviewer.

I presume your bullet points for 1 and 2 would be done (if required; perhaps not for this particular sample) here :point_right: https://github.com/aspnet/Docs/blob/master/aspnetcore/testing/integration-testing/sample/test/PrimeWeb.IntegrationTests/PrimeWebCheckPrimeShould.cs#L17-L18
... see how, for example, we're doing that config with the RP testing sample :point_right: https://github.com/aspnet/Docs/blob/master/aspnetcore/testing/razor-pages-testing/sample/tests/RazorPagesTestingSample.Tests/IntegrationTests/TestFixture.cs#L28-L32
Isn't all of that going away tho with the new Integration testing bits coming with 2.1? ... I mean if we have these working (with my little patch PR tonight), can we leave these as they are until 2.1 and update all of them with the new testing bits?

Not sure I understand what you mean.
There is a package coming in 2.1 that streamlines all this setup (setting the content root, copying the deps file, initializing the webhostbuilder in the same way your app does by calling Program.CreateWebHostBuilder) but you still need to prevent shadow copying in your test application (for example with xunit.runner.json in xunit)
That said, our samples should all work for 2.0 so I would hope we update them ASAP as customers will run into this.

Ah ... yes ... the package. I only very very briefly caught wind of it, and what I saw looked great.
I'll get the little patch PR in very soon. I'm finishing up a draft doc, and that little update will take minutes.
I can't really speak to the notion of how well the current Integration testing topic covers all the ins-and-outs of Test Server, per se. I didn't analyze that topic when I did the one for RP testing. I did prefer to keep general testing info mostly out of the RP testing topic ... an attempt to keep it focused on just the bits that pertain to testing that type of app. When do the patch PR tonight, I'll just mark it as "Addresses" this issue (as oppsed to "Fixes") so that Rick and Scott can take up the issue on the broader coverage.

@guardrex Sounds good. Thanks!


[oauth-proxy] Rename to oauth2-proxy to match upstream.

I should mention that this PR is intended to be a point of discussion. I personally think it's more valuable to align to the upstream project name than for the chart to have a friendly or generic name.
That said, I don't know what the motivation is/was for deviating from the upstream project name, so it's entirely reasonable that I missed something and don't even want to rename the chart.

Renaming is unfortunately not possible. You'll have to copy it and deprecate the existing chart.

The incubator chart is being deprecated already, so maybe you could make this change in that PR https://github.com/kubernetes/charts/pull/3480
(because if the 3 weeks it's already been waiting to merge is any indication, it'll be at least another week with the Helm Summit happening now)

/hold

Thank you for the contribution. I'm closing this in favor of #3480.


refactor: Simplifying tabOverride logic in control sections

SUMMARY

BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF

TEST PLAN

Various control sections have been showing up under unexpected tabs. This PR makes it simpler/easier to shove control sections under the correct tab, by allowing "tabOverride" to be either "data" or "customize" and simplifying (essentially inverting) the logic that takes place when neither is specified. This also removes support for putting the "tabOverride" in a singular control, and just keeps it to the control section, for simplicity.
I have half a mind to just make it "tab" instead of "tabOverride" and bake it into every control section, as a standard practice... but I'll pocket that one, as a control layout refactor will likely be coming soon (reconsidering the current rows/columns approach). But that's another story, and probably another PR...
Also, there will be a PR over on superset-ui that utilizes this new "customize" value in numerous places. We can merge that one before this one, I think, and I'll bump all the chart versions as part of this PR when it exits draft mode.
ADDITIONAL INFORMATION

[ ] Has associated issue:
[ ] Changes UI
[ ] Requires DB Migration.
[ ] Confirm DB Migration upgrade and downgrade tested.
[x] Introduces new feature or API
[x] Removes existing feature or API

Codecov Report

Merging #11708 (f022cbb) into master (ec8ccd4) will decrease coverage by 0.96%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##           master   #11708      +/-   ##
==========================================
- Coverage   62.86%   61.89%   -0.97%
==========================================
  Files         889      435     -454
  Lines       43054    26858   -16196
  Branches     4016        0    -4016
==========================================
- Hits        27064    16625   -10439
+ Misses      15811    10233    -5578
+ Partials      179        0     -179

Flag
Coverage Δ

javascript
?

python
61.89% <ø> (-0.99%)
:arrow_down:

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ

superset/db_engines/hive.py
0.00% <0.00%> (-85.72%)
:arrow_down:

superset/databases/commands/create.py
32.65% <0.00%> (-59.19%)
:arrow_down:

superset/db_engine_specs/hive.py
54.08% <0.00%> (-29.90%)
:arrow_down:

superset/views/database/mixins.py
59.64% <0.00%> (-22.81%)
:arrow_down:

superset/utils/cache.py
57.57% <0.00%> (-22.43%)
:arrow_down:

superset/db_engine_specs/presto.py
69.76% <0.00%> (-12.53%)
:arrow_down:

superset/db_engine_specs/mysql.py
79.59% <0.00%> (-12.25%)
:arrow_down:

superset/databases/commands/update.py
85.71% <0.00%> (-8.17%)
:arrow_down:

superset/databases/api.py
81.94% <0.00%> (-6.02%)
:arrow_down:

superset/databases/dao.py
94.11% <0.00%> (-5.89%)
:arrow_down:

... and 475 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update ec8ccd4...f022cbb. Read the comment docs.

Related: https://github.com/apache/incubator-superset/pull/9495

@ktmud / @kristw I opened this for review, as I think it's safe enough to merge on its own regardless of what I muddle around with over on the superset-ui side, but please check my sanity on this :D

Instead of adding a customize option, I'd be more enthusiastic on getting rid of the "renderTrigger implies data tab" logic. To really keep things simple, we should just always default things to be on the customize tab and require explicit override if people want to display things in the Data tab (or other way around if it makes more sense).
But this change is probably safe since I didn't see any use of tabOverride at the control item level anymore.

Yep... I had an itchy trigger finger to remove that behavior entirely, but didn't want to cause any weird regressions. I'll do that in another PR once we've made some more updates on the superset-ui side and merged them in.

closing this due to inactivity


Fixed dry-run mode in load_study

Summary Change Description
Been working on Michael's water study.  Fixed all the issues using the validate page and tried running load_study on the command line on dev.  Turns out that there was a bug with dry-run mode (which I tried first).  It was running each child loader in dry-run, which was wrong.
Affected Issues/Pull Requests

Resolves no documented issue
Merges into PR #1175

Review Notes

See comments in-line.
Checklist

This pull request will be merged once the following requirements are met.  The
author and/or reviewers should uncheck any unmet requirements:

Review requirements

Minimum approvals: 1
No changes requested
All blocking issues resolved by reviewers
Specific reviewers: @add_username_here

Review period: 2 days

Associated issue/pull request requirements:

[x] All requirements in affected issues marked "resolved" are satisfied
[x] All required pull requests are merged (or none)

Basic requirements

[x] All linters pass
[x] All tests pass
[x] All conflicts resolved

Overhead requirements

[x] New/changed method tests implemented/updated (or no change)
[ ] Updated Unreleased section of changelog.md (or no change)
[x] Migrations created & committed (or no change)

Haven't fixed the tests on this yet.  Just making hot fixes while I work on loading Michael's water study.  Looks like I'm not going to finish that before I leave on vacation.  Ugh.  It's close.
There are some multiple representations of compounds in the files that need to be selectively removed.  Those errors look like this:
EXCEPTION1(ERROR): ConflictingValueError: Conflicting field values encountered in row [100] of sheet [Peak Annotations] in e480/240212_exp011b3_free_plasma/dual/scan3/240212_exp011b3_free_plasma_omics_poslowmz_cor.xlsx in PeakGroup record [{'name': 'Creatinine', 'formula': 'C4H7N3O', 'msrun_sample': 6302, 'peak_annotation_file': 709, 'compounds': [<Compound: creatinine>]}]:
	peak_annotation_file in
		database: [240212_exp011b3_free_plasma_bookmark_negative_cor.xlsx (1e0498979e38651b203e87bbdc95d8f0b1476c87)]
		file: [240212_exp011b3_free_plasma_omics_poslowmz_cor.xlsx (76316235a5ba0875b2c097197a86f1fb6faa88dc)]

(For some reason, they're not coming out as MultiplePeakGroupRepresentations, which I need to fix, but that's no big deal, as long as you're aware they instead come out like the above (which shows Creatinine as represented in the 2 files shown because they were from the same sequence (and sample)).
There are a number of compounds that are in multiple files, including (but not limited to:

Uridine 5'-diphosphate
Glycine
Oxidized glutathione
Pantothenic acid
Phosphocreatine
Taurine

It might be that the wrong sequence name is assigned to some of the files.  (Remember: 2 peak annot files from the same sequence cannot have common compounds.)
Branch defer_dry_run_exception is checked out on dev.  It has fixes for the load script.
I haven't yet implemented the script that splits off the basal data, but I checked all the compounds and everything manually and am trying dry-run loads with the following commands.  Note, it takes awhile.  Perhaps an hour or more, but it does finish.  It's a large study.
cd "/tracebase-staging/incoming/exp011b_high dose 18O water"
python /var/www/tracebase/manage.py load_study --dry-run --infile MASTER\ STUDY\ DOC\ FOR\ TRACEBASE_exp011b3_240816-edit.xlsx

I would then need to load the mzxml files.
@lparsons - perhaps you can take this over when you get back?
A few other notes from my last run:
This compound is missing from the compounds sheet: Cysteine-glutathione disulphide.
I just fixed a couple issues.  One was that Adenine (a measured compound in 4 files, didn't have any labeled elements in this, so I removed those rows.  I added another missing compound.
Unfortunately, the branch on dev doesn't have the stats fix, so the dry run message doesn't show what numbers of records were created.  It's in one of the PRs. You could merge it.
Let me copy the errors I got and attach a file...

@mneinast - These are the errors remaining from the load.  There's 1 missing compound and the rest are "multiple representations" of compounds, e.g. the same compound present in positive and negative isoautocorr files from the same sequence.  I removed errors I already fixed.  And note that I removed Adenine measurements from the peak annotation files, because it doesn't have Oxygen and thus cannot be a peak group compound.
Other than the missing compound, all the errors are about these multiple representations.  There are so many in some cases, that I wonder if the wrong sequence could be assigned to a few of the files, because it looks like they have the same sets of compounds.
This file looks overwhelming because I haven't written a summarization method for these exceptions yet, but just remember, they're all about which compound measurements must be removed from which peak annotations files (or correct the assigned sequence):
water_errors.txt

Thanks for summarizing this before your vacation!
The water_errors.txt file is, like you said, pretty overwhelming...so many instances of multiple representations!  I know that many of these are the same compound curated from two different scans (usually a negative mode and a positive mode).
I don't have access to tracebase-staging, or at least I don't know where to find it.
In general, I'm worried about how we're handling this problem.   As we've discussed, the benefit is that users who are analyzing data in tracebase do not have to worry about multiple representations, which I do not want to deviate from.  The 2 main issues are

it's very labor intensive (happens in many submissions, and takes much longer to fix than other frequent problems like Compound synonyms)
we have users manually deleting data from the sheets they submit, then uploading updated versions of that file.

Could we 1) avoid altering the original data file directly and 2) provide an interface or method for the user to quickly see the multiple representations and select their preferred option?  I'm picturing something like this:

This way, we are not deleting the original data, and we can change this later if choices change.  Of course, Rob's script to summarize the validation errors could be an important step towards something like this.


Vaadin 8: Support for testing Extensions

Add some support for testing extensions:

Make sure that AbstractJavaScriptExtension works in mocked env - it can be constructed, attached to UI, attached to a Button, and that working with its state doesn't throw any exception.
Also do simple tests for AbstractJavaScriptComponent
Maybe some kind of extension lookup? _get for extensions? I don't think it's a good idea - extensions almost never form a tree structure; so simple Kotlin built-in list operations are more than enough.  Let's introduce no lookup methods then.

Fixed in KT 1.0.3


[SPARK-46805][BUILD] Upgrade scalafmt to 3.7.17

What changes were proposed in this pull request?
The pr aims to upgrade scalafmt from 3.7.13 to 3.7.17.
Why are the changes needed?

Regular upgrade, the last upgrade occurred 5 months ago.

The full release notes:
https://github.com/scalameta/scalafmt/releases/tag/v3.7.17
https://github.com/scalameta/scalafmt/releases/tag/v3.7.16
https://github.com/scalameta/scalafmt/releases/tag/v3.7.15
https://github.com/scalameta/scalafmt/releases/tag/v3.7.14

Does this PR introduce any user-facing change?
No.
How was this patch tested?

Pass GA.
Manually test.

Was this patch authored or co-authored using generative AI tooling?
No.

Merged to master. Thank you, @panbingkun and all.


Minor typo in example code for .MatchAll

Page Affected: https://developers.google.com/web/TODO
https://developers.google.com/web/updates/2019/02/string-matchall
What needs to be done?
The output from the foreach is wrong,
because the third capture group in the regular expression captures 1, not 2 for the first match test1.
This was a bit confusing when I read the article.
The first iteration output in article:
['test1', 'e', 'st1', '2', index: 0, input: 'test1test2', groups: undefined]
but it should be
['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', groups: undefined]
Please provide description of what's needs to be done here. Please be sure to include the link to the original page
and any supporting links/data.
Update output to reflect correct value.

[ ] Appropriate type-something label has been added.
[ ] Appropriate section-something label has been added.

The fix in #7412 has been deployed. https://developers.google.com/web/updates/2019/02/string-matchall


[FR] Accessing base part of a part listed in stock requires extra steps.

Please verify that this feature request has NOT been suggested before.

[X] I checked and didn't find similar feature request

Problem statement
Whenever I need to access the base part for a part listed in the stock, I need to first click the stock item and then click "base part". This is slightly cumbersome.
Suggested solution
It would be nice if there is an easier way to access base part from the stocks list, without additional clicks. Perhaps the base part can be added/listed in the stocks table or accessible as a direct link somehow? It's a small feature but it would make the user experience better.
Describe alternatives you've considered
N/A
Examples of other systems
No response
Do you want to develop this?

[ ] I want to develop this.

@tehkillerbee clicking on the link in the "part" column should take you to the part instance, but it seems it actually takes you to the stock-item instance. This is duplicate behaviour as the link in the "stock" column already takes you there. So this should be addressed.


Fix/gofmt and read cert cleanup

Reduce code in extractPubkey by using readCertificateFromFile.
Less software in the world.

Add a 'gofmt' target for make and call it as a trust dep and from c-i
My editor automatically runs 'gofmt'.  So its annoying to open a file,
make a change and see a bunch of whitespace unrelated changes in place.
Ok, maybe I should fix my editor, but really 'gofmt' code is the norm.
The change here is to run gofmt and fail the build if it makes changes.
That way those changes don't get checked in and don't pass c-i if it
hasn't run.

Run gofmt and commit changes.
These are whitespace only changes, the result of running gofmt.

I don't think the go fmt in the github action is useful. But it won't hurt anything, most likely.

i think you didn't realize that the target fails (and c-i will thus fail) if gofmt makes changes.
that way, we dont check in changes that haven't been go-fmt'd.


tests: add a test for a bug 6278 v4

PR tests for "run-as":

non-existent user
NULL user (empty user string)

Follow-up of https://github.com/OISF/suricata-verify/pull/1413
Changes from the previous PR:

new docs
min-version

Redmine ticket: https://redmine.openinfosecfoundation.org/issues/6278
PR https://github.com/OISF/suricata/pull/9596 has a fix for this.

continues in https://github.com/OISF/suricata-verify/pull/1431


Potential fix for JAVA-3769

I spent the day figuring out what was causing the failure, so I figured I might as well put a fix up for this in case that's the route we want to take. I don't believe, however, this should be fixed for the following reasons:

By fixing we're basically endorsing using multiple PojoCodecProviders while that's not intended.
It adds some complexity (albeit not a lot) to the codebase for little reward

In my opinion there are three things we can do instead to make this better for users:

Add a line to our documentation saying that only one PojoCodecProvider can be used.

Add to the error message in DiscriminatorLookup::lookup to say something like: "Make sure only one PojoCodecProvider is in your registry." My only concern with this is it may confuse users who are getting that error for a different reason. Unfortunately it is not possible to detect when multiple PojoCodecProviders are the cause of the "class could not be found for the discriminator" error without some kind of global state because there is no way of knowing if the other providers have the discriminator that we can't find. Because of this, we cannot give a more specific error message.

Throw an exception in ProvidersCodecRegistry's constructor if multiple codecProviders are PojoCodecProviders. This allows us to throw a very descriptive error, but it's potentially a breaking change. This bug only causes failures when the Pojos are nested and separate providers are used (i.e. Person and Address have different providers and Person contains Address). If the providers are for two separate classes that do not contain each other, clients may be running code successfully using two PojoCodecProviders at once and we're breaking that now.

In my opinion the best thing to do is a combo of Option 1 and Option 2, but I wanted to lay out all the options and get some feedback.

By fixing we're basically endorsing using multiple PojoCodecProviders while that's not intended.

I don't have a problem endorsing this.  In fact, I think we had assumed it would work.  Certainly it's the case that we expect multiple providers in general to cooperate with one another

It adds some complexity (albeit not a lot) to the codebase for little reward

If this fix is indeed correct, it seems like a small bit of extra complexity to pay
What do you think @rozza ?

Ok that makes sense to me. Note that once @rozza merges https://github.com/mongodb/mongo-java-driver/pull/585 this fix will have to change so we might want to let him merge his first.

I think this is great, it removes an impediment to users and makes using PojoCodecs more robust. Also, when we add record support it will naturally fix any discriminator lookups between the RecordCodecProvider and the PojoCodecProvider.
I've merge #585 so this will need a slight update but LGTM

@jyemin @rozza would you mind taking another look before I merge? The diff between the two commits will be a little weird because of rebasing Ross's code, but the only real change was moving the line where I get the correct DiscriminatorLookup.

Rebased and merged on command line.


bpf: support XDP metadata

An XDP program can use the bpf_xdp_adjust_meta() hook to prepend up to 32 bytes
of meta data before the packet.  Support this functionality by copying XDP Meta
to the local memory after a BPF program execution and pushing in back right
before delivering the packet.
Signed-off-by: Anton Protopopov<EMAIL_ADDRESS>

Hi @epeer-juniper, thanks for the comments!
The length of XDP metadata is always <= 32 bytes and it is a multiple of four (because of this optimization: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/skbuff.h#n3698), thus I've used 1 and three free bytes in a packet vector structure to specify that xdp meta is present and its length, correspondingly (see changes here: https://github.com/Netronome/nic-firmware/pull/6/files#diff-d8ec451c070a9abe40f206ec0f0ce23aL77)
The XDP metadata should immediately precede the packet head. When a BPF program executes, it writes meta data there and stores its length in PV as described above. Then xdp_meta_save() saves it to LM, and just before delivering the packet the xdp_meta_restore() puts it back to the packet memory, right after "netronome metadata":
|netronome meta|XDP meta|packet|

To the kernel the length of the XDP Meta is passed as a new "netronome meta" type in "netronome meta", see this line: https://github.com/Netronome/nic-firmware/pull/6/files#diff-510f9a499850424deb9ad7fc7d93beefR171
Also can you please clarify on where and how you suggest to allocate memory and place XDP meta? To allocate room I am extending the packet vector in LM by 32 bytes, so technically it's not a new region, the PV just grows in size.

Hi @aspsk . I left some comments. We (Netronome) still need to run tests on your contribution. Unfortunately the current unit tests in the repo does not cover all the code you are touching. Furthermore we need to discuss the layout of the PV.

Hi @JohanM84 thanks for your comments. Let me know how you would like to proceed with the layout and I will update my patches accordingly.


Performance issue due to SSLContext being recreated over and over

Describe the bug
botocore request/response times are much slower than expected in certain scenarios due to unexpected SSL overhead.
Expected Behavior
botocore /boto3 performs fast for all requests.
Ideally the first request does not take longer than any following requests (e.g. the SSLContext could be initialized during module init or be triggered by the user of the library in some way before any requests happen).
Current Behavior
Request/responses are too slow, see below.
Reproduction Steps
botocore performance is much slower than expected in certain scenarios. This can easily be reproduced by
import boto3
import time

session = boto3.session.Session()
for i in range(10):
    start = time.time()
    session.resource("s3").Object("mybucket", "mykey").get()["Body"].read()
    print(time.time() - start)

which yields
0.4858591556549072
0.1862480640411377
0.20270681381225586
0.22403812408447266
0.19844722747802734
0.18699288368225098
0.17718195915222168
0.18413686752319336
0.1918637752532959
0.18160700798034668

This can be optimized by sharing the resource between iterations:
import boto3
import time

session = boto3.session.Session()
resource = session.resource("s3")
for i in range(10):
    start = time.time()
    resource.Object("mybucket", "mykey").get()["Body"].read()
    print(time.time() - start)

which yields
0.25886106491088867
0.05055093765258789
0.050694942474365234
0.05214500427246094
0.05020618438720703
0.05117917060852051
0.04602789878845215
0.048911094665527344
0.048056840896606445
0.04799509048461914

One can see that the initial request is always quite slow.
But the issue goes further. If there is some delay between requests all the requests get slow. This can be reproduced with:
import boto3
import time

session = boto3.session.Session()
resource = session.resource("s3")

for i in range(10):
    start = time.time()
    resource.Object("mybucket", "mykey").get()["Body"].read()
    print(time.time() - start)
    time.sleep(10)

This yields
0.22714900970458984
0.17821383476257324
0.21504521369934082
0.17998909950256348
0.2338550090789795
0.19853711128234863
0.23908185958862305

Switching to sleep(5) yields fast requests again (except for the first one).
The reason for the slowness is that

the http keep-alive timeout that botocore uses implicitly via urllib3 seems to be rather low (probably between 5 and 10 seconds) and there doesn't seem to be a straightforward way to increase it. This causes an increased number of connection creations and ssl handshakes the as well as the issue mentioned in the next point.

enabling debug logging for urllib3 suggests that is_connection_dropped returns True for the connections that are issue after a sleep(10). So presumably something (the s3 server?) closed the connection. In this case there might not be a lot of things that botocore could do, except for the next point about making SSL connection creation faster.

initializing SSL connections has become a lot slower in recent python versions, see https://github.com/python/cpython/issues/95031 . Other major libraries like requests are also affected, see https://github.com/psf/requests/pull/6667 .
The slow requests are slow, because load_verify_locations is called once for each of them. This happens through the urllib3 PoolManager/HTTPConnectionPool and the recreation of SSLContext.
You can verify this by running any of the above reproducers in a profiler and look at the number of calls to/time spent in load_verify_locations.
The problem is even exacerbated when using a proxy as this leads to even more SSL calls. Adding different hosts to this makes the problem even worse as this leads to more HTTPConnectionPools being created.

Possible Solution

The solution for the http keep-alive timeout is to make this configurable somehow so that more requests can benefit from connection pooling.
The solution to avoid the overhead from load_verify_locations is probably to share the SSLContext across multiple invocations/threads. The requests issue I've mentioned above has a proposed workaround.

Additional Information/Context
No response
SDK version used
1.34.98
Environment details (OS name and version, etc.)
MacOS & Linux
Python 3.12.3

Thanks for reporting this issue — after discussing with the team we decided that we should continue tracking this for further review and investigation.


Added GATT Barometric Pressure Trend

Issue
Fixes #58.
What does this PR Do?
Added GATT Barometric Pressure Trend, still in progress
Where should the reviewer start?
GATTCharacteristics.swift

Result of Integration 1
Duration: 10 minutes and 24 seconds
Result: Perfect build! All 165 tests passed. :+1:
Test Coverage: 86%

Result of Integration 2
Duration: 56 seconds
Result: 26 errors, failing state: build-errors

Result of Integration 2
Duration: 56 seconds
Result: 26 errors, failing state: build-errors

Result of Integration 2
Duration: 56 seconds
Result: 26 errors, failing state: build-errors

Result of Integration 3
Duration: 4 minutes and 46 seconds
Result: Perfect build! All 168 tests passed. :+1:
Test Coverage: 86%

Result of Integration 3
Duration: 4 minutes and 46 seconds
Result: Perfect build! All 168 tests passed. :+1:
Test Coverage: 86%

Result of Integration 3
Duration: 4 minutes and 46 seconds
Result: Perfect build! All 168 tests passed. :+1:
Test Coverage: 86%


Dev branch: sudden break when arrived at Gym ...

Hi,
Not sure what happened.
My bot is "dev branch" that is cloned at 7/24 16:00 (TimeZone: +8)
It just breaks and restart to login ...
[2017-07-24 17:47:02] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.06km
[2017-07-24 17:47:05] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.06km
[2017-07-24 17:47:07] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.06km
[2017-07-24 17:47:10] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.05km
[2017-07-24 17:47:13] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.05km
[2017-07-24 17:47:15] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.05km
[2017-07-24 17:47:17] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.04km
[2017-07-24 17:47:21] [GymPokemon] [INFO] Moving towards open Gym 春長鶴松 - 0.04km
[2017-07-24 17:47:23] [GymPokemon] [INFO] Arrived at Gym 春長鶴松.
[2017-07-24 17:47:23] [       cli] [INFO]
[2017-07-24 17:47:23] [       cli] [INFO] Ran for 0:01:25
[2017-07-24 17:47:23] [       cli] [INFO] Total XP Earned: 0  Average: 0.00/h
[2017-07-24 17:47:23] [       cli] [INFO] Travelled 0.07km
[2017-07-24 17:47:23] [       cli] [INFO] Visited 0 stops
[2017-07-24 17:47:23] [       cli] [INFO] Encountered 0 pokemon, 0 caught, 0 released, 0 evolved, 0 never seen before ()
[2017-07-24 17:47:23] [       cli] [INFO] Threw 0 pokeballs
[2017-07-24 17:47:23] [       cli] [INFO] Earned 0 Stardust
[2017-07-24 17:47:23] [       cli] [INFO] Hatched eggs 0
[2017-07-24 17:47:23] [       cli] [INFO] Next egg hatches in 0.45 km
[2017-07-24 17:47:23] [       cli] [INFO]
[2017-07-24 17:47:23] [       cli] [INFO] Highest CP Pokemon:
[2017-07-24 17:47:23] [       cli] [INFO] Most Perfect Pokemon:
Traceback (most recent call last):
File "pokecli.py", line 884, in
main()
File "pokecli.py", line 206, in main
bot.tick()
File "/home/venney/project/pg03/pokemongo_bot/init.py", line 834, in tick
if worker.work() == WorkerResult.RUNNING:
File "/home/venney/project/pg03/pokemongo_bot/cell_workers/gym_pokemon.py", line 156, in work
result = self.move_to_destination()
File "/home/venney/project/pg03/pokemongo_bot/cell_workers/gym_pokemon.py", line 318, in move_to_destination
formatted=("Arrived at Gym %s." % gym_name)
File "/home/venney/project/pg03/pokemongo_bot/base_task.py", line 43, in emit_event
data=data
File "/home/venney/project/pg03/pokemongo_bot/event_manager.py", line 207, in emit
l_event = Event(event, sender, level, formatted, data)
File "/home/venney/project/pg03/pokemongo_bot/event_manager.py", line 56, in init
self.formatted = str(formatted).encode('utf-8', 'xmlcharrefreplace')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-18: ordinal not in range(128)
[2017-07-24 17:47:24] [sentry.errors] [ERROR] Sentry responded with an error: 'module' object has no attribute 'HTTPSHandler' (url: https://app.getsentry.com/api/90254/store/)
Traceback (most recent call last):
File "/home/venney/project/pg03/local/lib/python2.7/site-packages/raven/transport/threaded.py", line 174, in send_sync
super(ThreadedHTTPTransport, self).send(data, headers)
File "/home/venney/project/pg03/local/lib/python2.7/site-packages/raven/transport/http.py", line 47, in send
ca_certs=self.ca_certs,
File "/home/venney/project/pg03/local/lib/python2.7/site-packages/raven/utils/http.py", line 44, in urlopen
class ValidHTTPSHandler(urllib2.HTTPSHandler):
AttributeError: 'module' object has no attribute 'HTTPSHandler'
[2017-07-24 17:47:24] [sentry.errors.uncaught] [ERROR] [u"UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-18: ordinal not in range(128)", u'  File "pokecli.py", line 884, in ', u'  File "pokecli.py", line 206, in main', u'  File "pokemongo_bot/init.py", line 834, in tick', u'  File "pokemongo_bot/cell_workers/gym_pokemon.py", line 156, in work', u'  File "pokemongo_bot/cell_workers/gym_pokemon.py", line 318, in move_to_destination', u'  File "pokemongo_bot/base_task.py", line 43, in emit_event', u'  File "pokemongo_bot/event_manager.py", line 207, in emit', u'  File "pokemongo_bot/event_manager.py", line 56, in init']
Mon Jul 24 17:47:24 CST 2017 Pokebot  Stopped.
Press any button or wait 6 seconds to continue.
2017-07-24 17:47:30,814 [       cli] [INFO] PokemonGO Bot v1.0
2017-07-24 17:47:30,819 [       cli] [INFO] commit: 105b2695
2017-07-24 17:47:30,823 [       cli] [INFO] Configuration initialized

Can show us your config for gym pokemon?

This is not a config error. I noticed the error aswell. Gym name is 春長鶴松, whicht is not ascii. Event_mgr does some strange ascii conversion.

pals, I disabled GymPokemon.
Will wait for its availability ...
Thanks a lot. )

@venney  fixed issue: https://github.com/PokemonGoF/PokemonGo-Bot/pull/6125
Waiting for pull request.

It's fixed, closing


"create method will return only true/false if job was saved or not". Is it so?

Hello, the README says so:
https://github.com/sidekiq-cron/sidekiq-cron/blob/d409af416afa83362767880f57bb4bf432a80708/README.md?plain=1#L245
but the Sidekiq::Cron::Job.create method actually will return an integer instead of true.
That's because the last line of save method is this:
https://github.com/sidekiq-cron/sidekiq-cron/blob/d409af416afa83362767880f57bb4bf432a80708/lib/sidekiq/cron/job.rb#L492
which will return an integer. It's not a big deal, when using the return value of create in a truthy / falsey condition, but I think it's a little bug. What do you think?

Hey @delphaber 👋 I agree, not a big deal, but should be fixed. Please, feel free to send a patch. Thanks!

I will :)

Oooops, sorry! Forgot about this :) I have a free hour now, I'm going to try to fix it!

Closed by #476


fix: change dynamic module path

Update build script to match the change in the folder structure of the Datadome nginx module.

@laurodd Could you add a reference in the PR description to the change that introduced the regression?

Regression was introduced here: https://github.com/DataDome/NginxDome/commit/93df0cbf72620f903573bcdb353bf505069ebf02#diff-49887b15495bd39e38d38dd476f09a2bca1eaf9dc0c42637fe65ad6967d01381R43


scanmode: 'all' does not identify secrets from historic commits

I'm implementing gitleaks as cred scanner alternative in a DevOps pipeline using YAML.
Trying out scanmode 'all' option on a feature branch with multiple commits, the runs seem to only detect the current state of the branch and not previous commits. What is the expected behavior, is any additional settings that I'm missing?

Hi @meeragirijan, can you provide the output of the console of Azure DevOps?
When scanmode is set to 'all', all the commits should be scanned.

If you set this in your pipeline, all the commits are retreived:
steps:

fetchDepth: 0

Thank you!!

@JoostVoskuil  That seems to have resolved the issue it is now scanning all the commits.
FetchDepth was set as part of the checkout step and it behaves as expected. Thank you for the quick help! :)


e2e_test: increase timeout to 30m

Recently We have seen many test timeout error:
Test killed: ran too long (10m0s)

One change I made is that I have downgraded k8s master from n4 to n2. After that test started failing.

@etcd-bot retest this please
test failed due to left over clusters from other failed tests.

Urgent test fix.
Merge myself.


DecodeAccountKey for new AddAccountKey event format

Instructions
Problem
flow.AccountKeyAdded has two formats from GetEventsForHeightRange, I've been told that the events are from on-chain and can not be reformatted from server. There is a helper flow.DecodeAccountKey(pkBytes) for process the old format. I don't see any helpers for processing the new format.
new format example in json
https://gist.github.com/bthaile/8e2c600797da0d47d7766b5079c69962
old format example in json
https://gist.github.com/bthaile/1244c7a4d6fbf755dbab2caf898ee742
Steps to Reproduce
query := client.EventRangeQuery{
Type:        "flow.AccountKeyAdded",
StartHeight: lowHeight,
EndHeight:   highHeight,
}
set the block range for the past 100 blocks and keep pulling every 100 blocks and eventually you will see the new format. Most of the event's I'm seeing are in the old format
events, err := client.GetEventsForHeightRange(context, query)
Acceptance Criteria
Helper method to parse new AccountKeyAdded event publicKey 64 byte array.
old AccountKeyAdded event format has publicKey as a 73 bytes array
Context
Building public key indexer that maps public keys to account addresses. I can reduce calls to Access Node by using event data.

@bthaile Coud you please add the code for the decoding function you have so far (what we discussed on Slack)?


SubprocVecEnv inside if name == "main": does not terminate after execution

The code snippet is taken from here and modified based on documentation for SubprocVecEnv to start inside a if __name__ ==  "__main__": as suggested here.
The program works fine with the expected behavior. The SubprocVecEnv closes correctly and the "Done" output is obtained. But doesn't seem to terminate after execution. Currently, Ctrl+C is used to exit the program.
Any idea why it happens and solution to the problem?
System Info

Ubuntu 18.04
Installed stable-baselines with pip
GPU: Single Nvidia RTX 2080 Super
Python 3.6.9
tensorflow-gpu 1.14.0 (from pip)
gym 0.16.0  (from pip)

CUDA Version: 10.0

import os
import math
import sys
from collections import defaultdict

import gym
from gym import error, spaces, utils

from gym.utils import seeding

import numpy as np
from scipy import stats
from sklearn.preprocessing import StandardScaler

class BaselEnv(gym.Env):

    def __init__(self):
        super(BaselEnv, self).__init__()
        print("Env initialized")
        # state space
        self.action_space = spaces.Discrete(3000)
        #self.observation_space = spaces.Box(low=np.array([0, 0, 0]), high=np.array([250, 11, 7]), dtype=int)
        self.observation_space = spaces.Box(low=np.array([0, 0]), high=np.array([11, 250]), dtype=np.float32)
        self.viewer = None
        self.steps_beyond_done = None
        self.seed()

        self.observation = self.reset()

    def step(self, action):
        assert self.action_space.contains(action), "%r (%s) invalid"%(action, type(action))
        reward = 0
        done = False
        return self._get_obs(), reward, done, self._get_obs()

    def seed(self, seed=None):
        self.np_random, seed = seeding.np_random(seed)
        return [seed]

    def reset(self):
        return self._get_obs()

    def _get_obs(self):
        return np.array([1.0, 2.0])

from stable_baselines.common.vec_env import SubprocVecEnv
from multiprocessing import freeze_support
def make_env(seed):
    def _init():
        env = BaselEnv()
        env.seed(seed)
        return env
    return _init

if __name__ ==  "__main__":

    n_envs = 2

    env = SubprocVecEnv([make_env(i) for i in range(n_envs)])
    obs = env.reset()

    for i in range(10):
        print(i)
        action = [env.action_space.sample() for _ in range(n_envs)]
        obs, reward, done, info = env.step(action)

    # Lines added by me
    env.close()
    print("Done!")

Hello,
I assume you have also MPI installed?
I've got the same issue on my laptop with a similar config. As a workaround, you can use start_method="fork" which should work (this is not the default because it causes travis to crash as it is not thread safe).

Well I used this snippet just to reproduce the problem with something simple and self contained. I have been using PPO2 to do solve for an environment and leveraging SubprocVecEnv for that purpose. The lines of interest in my code that you can easily understand is here in my research work code.

EDIT: you should use make_vec_env which makes things easier and default to DummyVecEnv which is usually faster.

I have been using it as you might see in the env_test.py file. I have tested the same script with DumyVecEnv and did not have this issue.

@AvisekNaug Have you found a way to get the environment to to close? I am having a similar issue. Thanks

No, I haven't.

Should be fixed in SB3: https://github.com/DLR-RM/stable-baselines3


Added Rotating Squares Loader

Fixes Issue🛠

Closes #213
Description👨💻

Added "Rotating Squares Loader" in Loader Component Section
Type of change📄

[X] New feature (non-breaking change which adds functionality)

How this has been tested✅

Tested on Local System and it Worked Fine.
Checklist✅

[X] My code follows the style guidelines of this project
[X] I have performed a self-review of my own code
[X] I have added demonstration in the form of GIF/video file
[X] I am an Open Source Contributor

Screenshots/GIF📷

Merged!! Congrats on getting your PR merged to this repo under JWOC 🎉 @SohanRC


Kevin is way too prolific, in my opinion

On the dank memer channel in practicular

Change made so Kevin will no longer reply in the Dank Memer channel, commit c51f8083192d0c8534902fb9532ccb5b006fe7fa. Changes go live as a hotfix in the next few minutes.


Permissions with CLI export templates

Part of #3267
Stress and clarify the role of permissions when exporting templates. Removed use of --org-name due to some confusing behavior (influx-cli issue https://github.com/influxdata/influx-cli/issues/309  referenced in #3267).
Trying to strike a balance b/w documenting the way it is vs. the way it should be.
Haven't yet tested the API without CLI.

[ ] Signed the InfluxData CLA
(if necessary)
[ ] Rebased/mergeable

Setting this hotness back to draft for now.


Dfu hangs on "Enabling DFU Mode"

We are trying to implement the dfu update on one of our devices. During our testing phase, we discovered that the dfu state sometime got stuck on the "Enabling DFU Mode." We had tried the following:

Aborting the update after it gets stuck which doesn't do anything
Manually canceling the peripheral connection and retrying with new Service Initiator and Service Controller which gets stuck in the same place

The only thing that seems to help is restarting the app and/or the device
Here is our code for starting the firmware update process:
let firmware = DFUFirmware(urlToZipFile: url)
let initiator = DFUServiceInitiator().with(firmware: firmware)
initiator.alternativeAdvertisingNameEnabled = false
initiator.disableResume = true
initiator.dataObjectPreparationDelay = 0.4

initiator.logger = self
initiator.delegate = self
initiator.progressDelegate = self

self.serviceController = initiator.start(target: pairedDevice.peripheral)

Successful DFU update log:
"Firmware: [Callback] Central Manager did update state to: Powered ON"
"Firmware: Connecting to eWave..."
"Firmware: centralManager.connect(peripheral, options: nil)"
"Firmware: [Callback] Central Manager did connect peripheral"
"Firmware: Connected to eWave"
"Firmware: Discovering services..."
"Firmware: peripheral.discoverServices(nil)"
"Firmware: Services discovered"
"Firmware: Starting Secure DFU..."
"Firmware: Connected to eWave"
"Firmware: Services discovered"
"Firmware: Secure DFU Service found"
"Firmware: Discovering characteristics in DFU Service..."
"Firmware: peripheral.discoverCharacteristics(nil, for: FE59)"
"Firmware: DFU characteristics discovered"
"Firmware: Enabling indications for 8EC90003-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.setNotifyValue(true, for: 8EC90003-F315-4F60-9FB8-838830DAEA50)"
"Firmware: Indications enabled for 8EC90003-F315-4F60-9FB8-838830DAEA50"
"Firmware: Buttonless DFU indications enabled"
"Firmware: Application with buttonless update found"
"Firmware: Writing to characteristic 8EC90003-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x01, for: 8EC90003-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90003-F315-4F60-9FB8-838830DAEA50"
"Firmware: Indication received from 8EC90003-F315-4F60-9FB8-838830DAEA50, value (0x):200101"
"Firmware: Response (Op Code = 1, Status = 1) received"
"Firmware: [Callback] Central Manager did disconnect peripheral"
"Firmware: Disconnected by the remote device"
"Firmware: Scanning for the DFU Bootloader..."
"Firmware: centralManager.scanForPeripherals(withServices, [FE59]"
"Firmware: DFU Bootloader found with name DfuTarg"
"Firmware: Connecting to DfuTarg..."
"Firmware: centralManager.connect(peripheral, options: nil)"
"Firmware: [Callback] Central Manager did connect peripheral"
"Firmware: Connected to DfuTarg"
"Firmware: Discovering services..."
"Firmware: peripheral.discoverServices([FE59])"
"Firmware: Services discovered"
"Firmware: Secure DFU Service found"
"Firmware: Discovering characteristics in DFU Service..."
"Firmware: peripheral.discoverCharacteristics(nil, for: FE59)"
"Firmware: DFU characteristics discovered"
"Firmware: MTU set to 247"
"Firmware: Enabling notifications for 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.setNotifyValue(true, for: 8EC90001-F315-4F60-9FB8-838830DAEA50)"
"Firmware: Notifications enabled for 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Secure DFU Control Point notifications enabled"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x0601, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>00000000000000000000"
"Firmware: Command object selected (Max size = 512, Offset = 0, CRC = 00000000) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010190000000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x020000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600201"
"Firmware: Packet Receipt Notif disabled (Op Code = 2, Value = 0)"
"Firmware: Writing to characteristic 8EC90002-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x128d010a4708011243080310221a058102fe950320002800300038dca5064224080312203bb2885f9115bc96b80e7644524fa87293f3b759cfce34169d5290cebbd068f8480152040801120010001a40ed013d88caaeeeaa8dd4d812f92be6028026af980727746f3e79567415a7f8d5b14e7db0c1f9d6e7a73e8431be9ee3c658a58b8df12df3b9930bf7f2b630678c, for: 8EC90002-F315-4F60-9FB8-838830DAEA50, type: .withoutResponse)"
"Firmware: Command object sent (CRC = C3092342)"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0000422309c3"
"Firmware: Checksum (Offset = 144, CRC = C3092342) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Command object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x020c00, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600201"
"Firmware: Packet Receipt Notif enabled (Op Code = 2, Value = 12)"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x0602, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>00000000000000000000"
"Firmware: Data object selected (Max size = 4096, Offset = 0, CRC = 00000000) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 1/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0000f03179cd"
"Firmware: Checksum (Offset = 4096, CRC = CD7931F0) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 2/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0000cafbc91a"
"Firmware: Checksum (Offset = 8192, CRC = 1AC9FBCA) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 3/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>000069e82ceb"
"Firmware: Checksum (Offset = 12288, CRC = EB2CE869) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 4/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>000047ae3468"
"Firmware: Checksum (Offset = 16384, CRC = 6834AE47) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 5/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0000d3cb32e5"
"Firmware: Checksum (Offset = 20480, CRC = E532CBD3) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 6/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>00002a581ce2"
"Firmware: Checksum (Offset = 24576, CRC = E21C582A) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 7/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0000a52de7a2"
"Firmware: Checksum (Offset = 28672, CRC = A2E72DA5) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 8/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>00007b7f3574"
"Firmware: Checksum (Offset = 32768, CRC = 74357F7B) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 9/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0000dc3c0837"
"Firmware: Checksum (Offset = 36864, CRC = 37083CDC) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 10/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 60030100a000000579b2c5"
"Firmware: Checksum (Offset = 40960, CRC = C5B27905) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 11/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 60030100b0000078c228ca"
"Firmware: Checksum (Offset = 45056, CRC = CA28C278) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 12/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 60030100c00000c6cc3661"
"Firmware: Checksum (Offset = 49152, CRC = 6136CCC6) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 13/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 60030100d000001bfde6e1"
"Firmware: Checksum (Offset = 53248, CRC = E1E6FD1B) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 14/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 60030100e000003c376172"
"Firmware: Checksum (Offset = 57344, CRC = 7261373C) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 15/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 60030100f00000368c91fb"
"Firmware: Checksum (Offset = 61440, CRC = FB918C36) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 16/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0100c461e586"
"Firmware: Checksum (Offset = 65536, CRC = 86E561C4) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 17/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0100870f3662"
"Firmware: Checksum (Offset = 69632, CRC = 62360F87) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 18/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0100da3501d6"
"Firmware: Checksum (Offset = 73728, CRC = D60135DA) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 19/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>01006fb9dddf"
"Firmware: Checksum (Offset = 77824, CRC = DFDDB96F) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 20/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0100f3733992"
"Firmware: Checksum (Offset = 81920, CRC = 923973F3) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 21/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>01006466d09f"
"Firmware: Checksum (Offset = 86016, CRC = 9FD06664) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 22/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>01006630d5ae"
"Firmware: Checksum (Offset = 90112, CRC = AED53066) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 23/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>010074f0b267"
"Firmware: Checksum (Offset = 94208, CRC = 67B2F074) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 24/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0100aa420418"
"Firmware: Checksum (Offset = 98304, CRC = 180442AA) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x010200100000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 25/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x):<PHONE_NUMBER>0100c6a75c27"
"Firmware: Checksum (Offset = 102400, CRC = 275CA7C6) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x0102dc020000, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600101"
"Firmware: Data object 26/26 created"
"Firmware: wait(400)"
"Firmware: Uploading firmware..."
"Firmware: Sending firmware to DFU Packet characteristic..."
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x03, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600301dc92010018e42b4c"
"Firmware: Checksum (Offset = 103132, CRC = 4C2BE418) received"
"Firmware: Writing to characteristic 8EC90001-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x04, for: 8EC90001-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90001-F315-4F60-9FB8-838830DAEA50"
"Firmware: Notification received from 8EC90001-F315-4F60-9FB8-838830DAEA50, value (0x): 600401"
"Firmware: Data object executed"
"Firmware: Upload completed in 22.78 seconds"
"Firmware: [Callback] Central Manager did disconnect peripheral"
"Firmware: Disconnected by the remote device"

Stuck DFU log:
"Firmware: [Callback] Central Manager did update state to: Powered ON"
"Firmware: Connecting to eWave..."
"Firmware: centralManager.connect(peripheral, options: nil)"
"Firmware: [Callback] Central Manager did connect peripheral"
"Firmware: Connected to eWave"
"Firmware: Discovering services..."
"Firmware: peripheral.discoverServices(nil)"
"Firmware: Services discovered"
"Firmware: Starting Secure DFU..."
"Firmware: Connected to eWave"
"Firmware: Services discovered"
"Firmware: Secure DFU Service found"
"Firmware: Discovering characteristics in DFU Service..."
"Firmware: peripheral.discoverCharacteristics(nil, for: FE59)"
"Firmware: DFU characteristics discovered"
"Firmware: Enabling indications for 8EC90003-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.setNotifyValue(true, for: 8EC90003-F315-4F60-9FB8-838830DAEA50)"
"Firmware: Indications enabled for 8EC90003-F315-4F60-9FB8-838830DAEA50"
"Firmware: Buttonless DFU indications enabled"
"Firmware: Application with buttonless update found"
"Firmware: Writing to characteristic 8EC90003-F315-4F60-9FB8-838830DAEA50..."
"Firmware: peripheral.writeValue(0x01, for: 8EC90003-F315-4F60-9FB8-838830DAEA50, type: .withResponse)"
"Firmware: Data written to 8EC90003-F315-4F60-9FB8-838830DAEA50"

Any pointers would be super helpful

After writing 0x01 the device should reply with an indication with value 0x200101 and restart in bootloader mode. The library is waiting for the reply and disconnection event.
Please, check why that never happens in the device side. Perhaps you need to restart Bluetooth, as the handle numbers may be cached, before doing the update?


Parameterise the bytes drawn from the XOF so they are defined by the cipher suite

Throughout the operations defined by the spec there are numerous calls to the XOF where a certain number of bytes are read, via the .read() function. How many bytes are read is dependent on several decisions at the cipher suite level (e.g the curve used) hence the current "magic numbers" like 64 being used in these operations needs to be parameterised in the cipher suite definition.

This could be added as a simple ciphersuite parameter (a constant), or it could be defined generically.
The BLS signature draft uses ceil((3 * ceil(log2(r))) / 16) bytes (48 bytes for BLS12-381), while the draft currently uses 64 bytes. We could use the formula from the BLS signature draft or simply read 2n bytes where n is the width of an encoded field element.

Another option could be ceil((r+k)/8) where k the security level of the ciphersuite. So for bls would be the same (48 bytes) but for bn462 would be 74 bytes instead of 87 (that it would if we used the ceil((3 * ceil(log2(r))) / 16) formula). 2n will definitely be secure, but it may be too inefficient. It would be 64 bytes for bls and 116 for bn462 if I'm not mistaken.

How about we leave it to the cipher suite to pick the exact value but have the above as a recommended way of calculating it?

+1. Just instead of a recommendation i think we should have ceil((r+k)/8) (or 2n etc) as the minimum value that a ciphersuite must choose though.


When reading large files, the network bandwidth consumption is much greater than the actual reading speed

Alluxio Version:
v2.9.0
Describe the bug
When reading large files, the network bandwidth consumption is much greater than the actual reading speed;
To Reproduce

single master and worker, use 'MUST_CACHE' writetype;
write a large file (2.8GB) to alluxio cluster;
read this file via fuse component;   (such as,  cp src dst)
use sar/iostat to observe network/disk io;

Expected behavior
network bandwidth consumption is slightly greater than read speed;
Additional context
In addition,, if read the file via common code implementations works as expected (no concurrent read), such as below:
f, _ := os.Open(path)
io.Copy(io.Discard, f)

and, concurrent reading will reproduce this problem;

FUSE file (2.8GB), block size 64MB), fuse read (cat src > dst or cp src dst, no concurrent operation), sar network io 800-900MB/s, iostat nvme 15MB/s)
If single block with 3GB, same performance.
User observations:

Reduce block size will improve, but 1MB block write will stuck and failed to write
alluxio.fuse.shared.caching.reader.enabled does not help
paging store (1MB page size) performance better than block size 64MB, worse than 4MB block size. block 4MB > page store 128KB > page store 1MB (page store similar perf) > block 64MB
small block size (1MB) write big file (2.8GB) error out, small block size (1MB) write small file will not error out.
2.8GB file, single thread load 10second, 4 loader 4MB block size 170 second, 128KB/1MB page store 400 second

4MB block size
1 concurrency: net 569~570MB/s, read 510~520MB/s
4concurrency: net 1.2~1.3GB/s, read 110~120MB/s
64MB block size
1: net 700~900MB/s, read 700~900MB/s
4: net 2.5~2.7GB/s, read 17~20MB/s

128KB page store
1: net 700~900MB/s, read 700~900MB/s
4: net 2.2~2.5GB/s, read 20~30MB/s
1MB page store
1: net 1.1GB/s, read 800~1000MB/s
4: net 2.1~2.3GB/s, read 22~25MB/s

Found efficiency in our code that
Fuse read file is seek() heavy. Every fuse read() will be paired with a seek(). If sequential read, seek() will not do anything.
If any random read happens, seek() will drop the current chunk, and re-read one new chunk from Alluxio worker even if the new position is still within the current chunk.
Client reads chunk from worker makes sense.
But we should be able to use the same chunk if seek to position in the chunk.
To really understand the issue and understand how we can solve the issue requires deeper understanding of the application. @wwq2333 can you help share the testing application and testing environment to us, and see if the workflow is easy to be reproduced in our environment, so that we can target the workflow and do optimizations. Appreciate your help and sorry for the late reply

Experiments

Python create.py and read.py 4 concurrency read 4 * 2.8GB == 11.2GB file, network consumption is 11.7GB
although do discover that the read python command last longer than reading from the network.
cp a file

Network read 2.8GB
Does not find read enlargement
Will focus on the performance then

From the fuse.log shared by user, find most reads are small range random reads (within 4MB range).
In the current Alluxio implementation, seek operation will always recreate a new block input stream. Closing old stream and open new stream for each 128KB small fuse.read() are really expensive. From the following flamegraph, more than 70% of the CPU file read time spent in re-creating streams.
From the flamegraph,
FuseFileInStream.read() 4.51%
Related to each seek() we recreate the stream 71%

BlockInStream.closeDataReader 1.38%
BlockInStream GrpcDataReader. 1.58%
AlluxioFileInStream.updateStream 0.26%
Related to actual read 19%
GrpcDataReader.readChunk 0.3%
grpc readBytes 0.56%

Most of the time spend in

Two next steps

Each fuse thread should have it's own file input stream. Stream should not be shared between threads
FUSE SDK with dora (github dora branch), consider how to implement efficient seek() operation to avoid large costs and large overread.
2.1 One thought is to read page from dora worker, store page in client, seek to position inside the page should not require re-read.

Followup

Fuse thread cannot each have its own stream. Checking fuse thread id for each mini fuse call will severely impacted the performance. Other fuse products e.g. s3fs-fuse does not have separate stream for each fuse working thread either.
We currently implement a much more efficient version of FUSE SDK with S3 seek approach, and will implement more efficient FUSE SDK with dora worker seek approach

@wwq2333 we are working on understanding and solving the read enlarge issue, ongoing work in https://github.com/Alluxio/alluxio/pull/16996
We are mainly working on dora branch (Alluxio + Dora + Netty) since it may break many of the backward compatibility of Alluxio 2.9 chain. For more details of dora, PTAL https://github.com/Alluxio/alluxio/tree/dora/docs/en/dora.
When doing the single node testing with local NVMe as UFS and local NVMe as storage, we find the performance is bad and read enlarge is severe just as you mention in this ticket:

FUSE SDK + local metadata/data cache warm read performance around 400MiB/s
FUSE SDK + Alluxio cluster distributed cache (no matter it's Alluxio 2.9 system cache or new dora cache, no matter it's GRPC or Netty), the warm read performance is around 20MiB/s to 60MiB/s.
The read enlarge is around 100X

The test command is use is   fio --name=sequentialread --rw=read --bs=4m --numjobs=1  --filesize=100m --direct=1 --group_reporting --nrfiles 100
With the https://github.com/Alluxio/alluxio/pull/16996, we are able to improve warm read performance to around 400MiB/s to 500MiB/s when doing (FUSE SDK + DORA + Netty).
In that PR, we mainly

sort the FUSE requests and try our best to read sequentially (in FuseFileInStream)
more efficient seek (use skip for seek forward, direct seek backward in chunk, leave only a few real seek--that's seek backward outside chunk) - (in DoraFileInStream)

After the fix is polished and well-tested and interated, and depending on whether it breaks the 2.9 chain backward-compatibility, we may consider backport to 2.9 chain. But it will definitely be included in the dora branch for further 292-alpha or other releases
It will be really helpful if you can help test the changes and see if it solves the problem in your actual use cases or the use cases can be reproduced in our side, or if we can cooperate to better fix the issues.
This issue is currently the highest priority issue that i am working on, will sync back soon, appreciate all the information provided.


This typing for callbacks typed as any

I don't quite understand why below code is typed as any(I'm using nightly with --noImplicitThis)?
interface A {
    a: string;
}
declare function test(callback: (this: A) => void): void;
test(function() {
    this.a;// typed as any?
});

This works for me when I paste this into a VS Code instance running on a branch that I merged from master on Thursday. Let me try the current master...do you have another repro besides this snippet?

Never mind, I was actually running code from July. It's broken once I point VS to the Thursday branch.

In case I want to git bisect later, July 6 was the time that the "works-for-me" branch was last merged from master.

I suspect this PR: https://github.com/Microsoft/TypeScript/pull/9746
I'll investigate later.

So, interestingly, this is a bug only in quick info and listing members. Change the callback to return A and you will see that errors are still caught:
interface A {
    a: string;
}
declare function noThis(callback: (this: A) => A): A;
noThis(function() { // error, 'string' is not assignable to 'A'
    return this.a + this.nope; // error, 'nope' does not exist on 'A'
});

I still suspect #9746.