Release planning for April 2018

v3.1.14

[X] Pending backport; add etcd_server_is_leader https://github.com/coreos/etcd/pull/9587 (done via https://github.com/coreos/etcd/pull/9606)
[X] Pending review/backport; add --initial-election-tick-advance https://github.com/coreos/etcd/pull/9591
[X] Update https://github.com/coreos/etcd/blob/master/CHANGELOG-3.1.md
[X] Try/merge the new release script https://github.com/coreos/etcd/pull/9582

v3.2.19

[X] Backported; fix TLS reload https://github.com/coreos/etcd/pull/9570
[X] Backported; fix race conditions in v2 server stat collecting https://github.com/coreos/etcd/pull/9562
[X] Backported; fix etcd_debugging_server_lease_expired_total https://github.com/coreos/etcd/pull/9557
[X] Backported; add etcd_server_is_leader https://github.com/coreos/etcd/pull/9587
[X] Pending review/backport; add --initial-election-tick-advance https://github.com/coreos/etcd/pull/9591
[X] Update https://github.com/coreos/etcd/blob/master/CHANGELOG-3.2.md
[X] Try/merge the new release script https://github.com/coreos/etcd/pull/9582

v3.3.4

[X] Backported; fix TLS reload https://github.com/coreos/etcd/pull/9570
[X] Backported; fix race conditions in v2 server stat collecting https://github.com/coreos/etcd/pull/9562
[X] Backported; fix etcd_debugging_server_lease_expired_total https://github.com/coreos/etcd/pull/9557
[X] Backported; add etcd_server_is_leader https://github.com/coreos/etcd/pull/9587
[X] Pending review/backport; add --initial-election-tick-advance https://github.com/coreos/etcd/pull/9591
[X] Update https://github.com/coreos/etcd/blob/master/CHANGELOG-3.3.md
[X] Try/merge the new release script https://github.com/coreos/etcd/pull/9582

/cc @jpbetz

v3.1.14, v3.2.19, and v3.3.4 have been released. Following fixes for release script are being worked on by @jpbetz
Thanks.


MP2RAGE

Purpose
Add MP2RAGE
Open Questions and Pre-Merge TODOs

[x] Use github checklists. When solved, check the box and explain the answer.

[x] Review that changed source files/lines are related to the pull request/issue
If any files/commits were accidentally included, cherry-pick them into another branch.

[x] Review that changed source files/lines were not accidentally deleted
Fix appropriately if so.

[x] Test new features or bug fix
If not implemented/resolved adequately, solve it or inform the developer by requesting changes in your review.
Preferably, set breakpoints in the locations that the code was changed and follow allong line by line to see if the code behaves as intended.

Manual GUI tests (general)

[x] Does the qMRLab GUI open?
[x] Can you change models?
[x] Can you load a data folder for a model?
[x] Can you view data?
[x] Can you zoom in the image?
[x] Can you pan out of the image?
[x] Can you view the histogram of the data?
[x] Can you change the color map?
[x] Can you fit dataset (Fit data)?
[x] Can you save/load the results?
[x] Can you open the options panel?
[x] Can you change option parameters?
[x] Can you save/load option paramters?
[x] Can you select a voxel?
[x] Can you fit the data of that voxel ("View data fit")?
[x] Can you simulate and fit a voxel ("Single Voxel Curve")?
[x] Can you run a Sensitivity Analysis?
[x] Can you simulate a Multi Voxel Distribution?

Travis is really getting on my nerves. Fails the test (that passes in Octave on my local) with incomplete log files for the billionth time. What am I supposed to understand from this:

I am 100% sure that it has nothing to do with filter_map, because the previous re-run passed that stage 🤦♂
I would like to give Circle a try. Which can also use our Docker envs, so we don't have to wait 6 minutes for each bootstrapping. Plus GitHub Actions are beautiful.

Travis is really getting on my nerves. Fails the test (that passes in Octave on my local) with incomplete log files for the billionth time. What am I supposed to understand from this:

I am 100% sure that it has nothing to do with filter_map, because the previous re-run passed that stage 🤦♂
I would like to give Circle a try. Which can also use our Docker envs, so we don't have to wait 6 minutes for each bootstrapping. Plus GitHub Actions are beautiful.

😂
If you really want to explore another CI, I say take a deep breath. Let's put this PR, open a new branch, and develop the new CI there. Because there's a lot of stuff that can cause you headaches if you try and rush it, and I want to take the time to understand/use it too before simply switching to pass a single PR that's causing a headache.

My plan is indeed not to migrate CI to Circle before merging this PR.
I want to find out the problem breaking this build, I just can't because I don't have the same env.

Is this any helpful? (full log)

failure: load: unable to find file FitResults/FitResults.mat
mp2rage_batch:48 /home/travis/build/neuropoly/qMRLab/osfData/mp2rage_demo/mp2rage_batch.m)
BatchExample_test>test_batch:57 (/home/travis/build/notZaki/qMRLab/Test/MoxUnitCompatible/BatchExample_test.m)

I find it convenient to launch travis in debug mode to figure out why things aren't working. It's a bit of  hassel to use on a public repository so I usually just fork and convert into a private repository and then run travis build in debug mode.

@notZaki thanks! I was able to see this once and actually pushed a commit to fix, but looks like still not resolved and the log is interrupted again.
I would like to hear your thoughts about Circle vs Travis.
I read about the Debug mode in Travis docs now, it looks like a bit convoluted for the sake of it. I want CI service to make my life easier, instead of dealing with running it in debug mode and such :)
I am really keen on using a Docker env for testing, and had good impression from Circle so far. If anything goes sideways on Circle’s end (never happened so far), I would just run it in our container.

Error from 157e: (full log)

failure: 'INV1mag' undefined near line 38 column 23
mp2rage_batch:38 (/home/travis/build/neuropoly/qMRLab/osfData/mp2rage_demo/mp2rage_batch.m)
BatchExample_test>test_batch:57 (/home/travis/build/notZaki/qMRLab/Test/MoxUnitCompatible/BatchExample_test.m)

I don't have much experience with Circle because Travis has been adequate for my simple needs.  I think Circle will require a paid plan to be any useful since the free plan does not have concurrent jobs (builds will take ~2 hours) and the allowed compute-time is ~4 hours per week.
Travis supposedly support docker builds, but it's not something I've tried.

@notZaki thanks, I fixed this (hopefully).
I'll look into Travis with containers and let you know.

Coverage decreased (-4.5%) to 37.833% when pulling 65505279bedb41b60e9467cd320018b6cd49aa9d on mp2rage into 9be9912416f101e206e7592680caa050c7a7cb74 on master.

Starting to review

Why was Test/MoxUnitCompatible/static_savedModelsforRetrocompatibility/amico.qmrlab.mat modified?

Why is there about a hundred modified image files when you rebuild the docs? Is this commonplace? Is it necessary? Any way to avoid this? I can't imagine they are all needed to be modified.
e.g.

Wait, is that just the output images when running the batch script? Some of these are so small they are useless, eg.
https://github.com/qMRLab/qMRLab/blob/master/docs/source/_static/vfa_t1_batch.png
Why are we saving these to the doc?

Why was Test/MoxUnitCompatible/static_savedModelsforRetrocompatibility/amico.qmrlab.mat modified?

The fields of tabletip was type char (expected cell), probably because the model saved by Octave was used. This was throwing an assertion error during the load models test.

Why is there about a hundred modified image files when you rebuild the docs? Is this commonplace? Is it necessary? Any way to avoid this? I can't imagine they are all needed to be modified.

This happens each time we re-build the docs (run GenerateDocumentation). I would like to disconnect Docs from the qMRLab codebase and have a separated repo for that.

When did this feature get changed? Do we write different function names (eg. getLink_VFA(), getLink_inversion_recovery()) for each model? Why not just getLink?

I saw this was done for mono_T2 and the respective script was kept under the src/Models_Functions of the corresponding model. I thought that this decentralized organization  makes sense, instead of collecting all them one get_Link.

What's the purpose of this change in this MP2RAGE branch? Could you write some comments in the code to explain what this block is supposed to be adding?

json2struct ensures that what you get upon reading a json file is a struct.

In what case might this else occur? Could you explain here in a comment?

If a json file contains JSON array, the output is returned as a cell array by loadjson.

Why is MTsat being patched in this branch?

I got rid of the redundant buttons in the protocol panel, as I implemented this feature through new ProtStyle property in mp2rage.

Is this still an incomplete to-do item?

Yes it is, but now we can remove this conditional statement and discuss if we'd like to maintain the ability to pick up BIDS files in the main repo, or should defer this to qMRFlow.
This is in the MethodBrowser, because the annoying (but sometimes useful)auto-fill implementation  looks for string matches to assign datafields with an input (that's how inputs are automatically loaded after Download Example Data from the GUI). But this behaves inaccurately if you point a path that contains dataset that follows a naming convention different than we have for the example datasets.
% TODO:
            if not(isfield(Model.options,'BIDS'))
                % Manage each data items
                for ii=1:obj.NbItems
                    obj.ItemsList(ii).setPath(Path, fileList,0);
                end

            else

            if Model.options.BIDS
              disp('Looking for BIDS');
            else
              disp('Annoying function goes here');
            end

            end

Instead of it's own function, why don't we juste make it a method of the function "AbstractClass" called getLink(), and override it in the model files?

If the constructor allows attribute assignment in that fashion, sure. We should better define that as a static method in the AbstractModel then.

This happens each time we re-build the docs (run GenerateDocumentation). I would like to disconnect Docs from the qMRLab codebase and have a separated repo for that.

But are the images actually used for the documentation? Some of the images are very very small, and unreadable. Why are they being saved at all? Could we .gitignore them?

Is this still an incomplete to-do item?
Yes it is

Ok, is there an issue open for that then? If not, please open it - I would never know to check the code to know what to work on, or what remains to be done.

If the constructor allows attribute assignment in that fashion, sure. We should better define that as a static method in the AbstractModel then.

+1. No need to do so here, please open an issue for it and we'll deal with it later.

@agahkarakuzu we have an issue - I discovered this while going to the PR review guidelines, specifically the Histogram check.
The B1map data provided with Jose Marques' repo appears to not be a normalized B1 map (i.e. B1=1 if actual flip angle == nominal flip angle). It seems to be off by a factor of 1000 (B1=1000 instead of B1=1). I doubled checked, and see these values in both qMRLab and FSLeyes, so it's not related to the closed issue #349 . I'm not sure why Jose Marques used B1 maps with this "unit", and if many users will have this as well, but for us this isn't consistent with what we call B1 maps internally (e.g. b1_dam). So we might want to renormalize this dataset, and modify the code so that it does that multiplication in the class. Maybe check with Matteo too to see what his B1 maps look like.

@mathieuboudreau can we easily implement this conditional normalization step in the obj.Fit? Do you foresee any other B1map data range users may provide?

I will re-check the documentation files etc. Currently the build for the branch looks OK https://qmrlab.readthedocs.io/en/mp2rage/

@agahkarakuzu I discovered another bug. See this video: https://www.youtube.com/watch?v=JVgLQjKXH3Q
To reproduce: Load a saved MP2RAGE fit result. I tested it with another model (IR), and that bug doesn't happen there. The "data" GUI tab gets messed up (overlaps).

@agahkarakuzu is it impossible to have a "Voxel fit" feature for this Model? I thought it was fit voxelwised, no?

To reproduce: Load a saved MP2RAGE fit result. I tested it with another model (IR), and that bug doesn't happen there. The "data" GUI tab gets messed up (overlaps).

I am aware that aesthetic distortion.
Initially half of the data fields for MP2RAGE were not visible, because it has too many fields and the components of a panel can not be independently scaled from the panel itself in MATLAB. I had to implement the attachScrollPanelTo method to deal with that, so that the scaling will be done and all the data fields will be visible.
In that visually buggy case, it is still possible to scroll down and access to all data fields. I looked into that a bit but could not find a way to get rid of that. So, I kinda let it slide based on the function first principle.

@agahkarakuzu is it impossible to have a "Voxel fit" feature for this Model? I thought it was fit voxelwised, no?

It is not voxelwise (it was also like that when I take the mp2rage branch over from you). I think this is good for the sake of performance. A conditional switch between obj.voxelwise true/false for fit single voxel vs the whole data set, respectively, is to be explored.

To reproduce: Load a saved MP2RAGE fit result. I tested it with another model (IR), and that bug doesn't happen there. The "data" GUI tab gets messed up (overlaps).

I am aware that aesthetic distortion.
Initially half of the data fields for MP2RAGE were not visible, because it has too many fields and the components of a panel can not be independently scaled from the panel itself in MATLAB. I had to implement the attachScrollPanelTo method to deal with that, so that the scaling will be done and all the data fields will be visible.
In that visually buggy case, it is still possible to scroll down and access to all data fields. I looked into that a bit but could not find a way to get rid of that. So, I kinda let it slide based on the function first principle.

It's more than an aesthetic distortion - the "top" "Path data" button doesn't work when I do that. Neither does the "Download example" button. This bug needs to be fixed prior to merging, in my opinion.

It's more than an aesthetic distortion - the "top" "Path data" button doesn't work when I do that. Neither does the "Download example" button. This bug needs to be fixed prior to merging, in my opinion.

The ones below do work, don't they?

It's more than an aesthetic distortion - the "top" "Path data" button doesn't work when I do that. Neither does the "Download example" button. This bug needs to be fixed prior to merging, in my opinion.

The ones below do work, don't they?

Yes, but we should do better and fix this bug (it is a bug) prior to merging.

Do you have any clue as to why this GUI bug occurs? Since it only happens for MP2RAGE, I'm assuming it has to do with this "hack"? https://github.com/qMRLab/qMRLab/commit/66334c365d5262c1698fcea44c5a2c75edbb3aab#diff-fd685c27cea515ed544adc058b390bee

Yes, but we should do better and fix this bug (it is a bug) prior to merging.

I will try to solve this quickly, but if it won't work I think we can merge regardless of it because:

It only happens when another model is selected after mp2rage from the dropdown.
It goes away after scaling up/down the main panel OR the second model switch after mp2rage selection. So, it is a leftover from rendering, not that another duplicate panel underneath the original data panel exist, which may interfere with the UI callbacks.
Duplicate (upper) portion is not functional, won't lead users to do something wrong.
If the solution is not simple, it is either this "bug", OR a dysfunctional mp2rage data panel.  I choose the former.
I suspect that anyone is going to be bothered by this.

It only happens when another model is selected after mp2rage from the dropdown.

False - I discovered it by loading a saved fit result, not while selecting another model. I expect most folks will load fit results.

I suspect that anyone is going to be bothered by this.

Famous last words in software development. ;)
If we start letting "loose ends" like this happen when approving pull requests, we will end up with a very buggy interface in a few years.

I know it sucks to need to resolve this, however this is the very reason why we decided on making the manual pull request review guidelines - to detect and fix this type of GUI bug.

I tried few things, could not solve systematically because I cannot pinpoint the origin of GUI issues unless they throw and exception.
So I added a simple workaround solution, which scales up the main panel by 0001, then scales back down to the original. This gets rid of the duplication.

I tried few things, could not solve systematically because I cannot pinpoint the origin of GUI issues unless they throw an exception.
So I added a simple workaround solution, which scales up the main panel by 0001, then scales back down to the original. This gets rid of the duplication.

It's still a bit messy GUI-wise (empty space now), but I won't fight you harder on this for now.

Please open an issue discussing it and make it priority high, and we'll look into it when the dust settles a bit or discuss it at the next qMRLab meeting.

Regarding B1 issue, as discussed on slack, you were already handling both cases: https://github.com/qMRLab/qMRLab/blob/96aec99c0b462430d2a74ae14acb1f420c0daf65/src/Models_Functions/MP2RAGE/func/T1B1correctpackageTFL.m#L50-L79
So I fixed the B1map data (divided by 1000), saved as NII and then re-uploaded it to OSF. This doesn't make any differences in the fits, but will appear more natural to the users. Green light for merging - great job on this feature!


Autocomplete is sometimes slow on moderately sized (300 files) git repos

Issue
From NeverCast in discord:

NeverCast: I'm seeing a performance regression when typing /add, only 300 files, sometimes I'll get the file list hints come up, but most the time the terminal just halts

NeverCast: Add lrucache(1) to get tracked files, and lrucache(1,000) to normalize path seemed to help a lot, I haven't unit tested or end end tested that change, but it's usable now

NeverCast: Entirely possible though that this breaks the file list entirely, not checked that either

paulg: I think it's probably dangerous to simply cache these, because aider needs to react when the git repo changes.
Purging the caches whever the user types their first character into a new chat input would probably get most benefits. And it's an easy cache eviction policy.

Version and model info
No response

https://discord.com/channels/1131200896827654144/1133060264825208942/1253171725315866668

Most of my aiderignores start with * and then I include the paths I want. Which is probably why ignores is such a hot path for me during tab completion

I have some pretty major performance issues with add on larger repos that I work with (10s of k of files). When I've profiled it, the get_tracked_files function seems to be called every character I type, can can take 10s of seconds (most of the time in normalize_path). Can we instead cache the tracked files? Adding files to the aiderignore doesn't help as that is post-normalization.

I have a legacy codebase with ~22k files in it, even paring it down to ~300 files it still is slow to search files using /add on a M2 MBP.
It definitely improves using an .aiderignore, as searching the full 22k files just freezes for 20+ seconds.
This is my .aiderignore for anyone else trying to work in a specific directory, this essentially ignores everything and then adds a few specific items back.
*

!.gitignore
!README.md
!/src/
!/src/**

The main branch handles this much more efficiently now. You can get it by installing the latest version from github:
python -m pip install --upgrade git+https://github.com/paul-gauthier/aider.git

If you have a chance to try it, let me know if it works better for you.

Hey @paul-gauthier I tested it out on my large repo with 312 files.
First /add goes to 99% CPU usage on one core for a few seconds. Then searching is instant and works great!
Decided to remove my .aiderignore entirely:
Models: claude-3-5-sonnet-20240620 with diff edit format, weak model
claude-3-haiku-20240307
Git repo: .git with 31,687 files

Performance still seems good, first /add takes a few seconds (seems the same as 312 files interestingly) but subsequent searches are snappy.
Thank you so much for working on this!

I'm going to close this issue for now, but feel free to add a comment here and I will re-open or file a new issue any time.


Fix #66 - No way to pass timeout to database

Added timeout to async database connections through the connect_kwargs dict
The timeout is pulled from the connection parameters if specified therein, otherwise the default timeout is used.

Hello @roansong, thank you for the PR! I've looked into it and seems like it's not quite complete. Can you provide a kind of test sample?
When you modifying connect_kwargs via connect_kwargs['timeout'] = timeout it will produce side effects! That means self.connect_kwargs_async will change after connect_async () call and that's not obvious and not intended.

Hi @rudyryk. Good catch! I approve of keeping things as unambiguous as possible, and will make amends. As for the test sample, I have some long-running queries that time out after 60 seconds, so I've been testing with a timeout value of 360 seconds, but a more convenient test case is below. If your queries time out almost immediately, then the change is working!
Example connection parameters:
from playhouse.db_url import connect

db_url = 'postgresql+pool+async://user:password@locahost:5342/testdb'
connect_params = {
    'min_connections': 1,
    'max_connections': 10,
    'timeout': 2
}
database = connect(db_url, **connect_params)

@rudyryk I'm not quite sure how to proceed without modifying the connection parameters in some way; to fit in with the AsyncXXXConnection classes and specify the timeout parameter explicitly involves popping any 'timeout' key from the connect_kwargs to avoid keyword argument clashes, which is in turn an unexpected modification.
Another possible route is to remove the timeout keyword argument from the AsyncXXXConnection classes and update it with a default value, but that requires much larger modifications across the code.

Note: build failure is unrelated to this PR, and is detailed in issue https://github.com/05bit/peewee-async/issues/95

Hi @roansong, I'm just not sure whether you PR is OK and this is not because of your code itself. I don't like the current implementation of peewee-async in that part because it's not clear and straightforward enough, so we would need fixes like that.
I'd consider deeper changes to make it more clear and explicit.

Sorry, need more time to review. PR's looking elegant and I like it initially but also need to double check it again to not miss a piece of puzzle. Thank you @roansong!

@rudyryk I've merged in the upstream changes from 0.6.0a to my fork, and have noted that instead of using timeout as a kwarg, use connect_timeout, and it works.
e.g. using
database = peewee_async.PooledPostgresqlDatabase(
    database='test',
    user='user',
    host='<IP_ADDRESS>',
    port='5432',
    connect_timeout=30
)

or
from playhouse.db_url import connect
db_url = 'postgresql+pool+async://user@<IP_ADDRESS>:5432/test'
connect_params = {
    'connect_timeout': 30
}
database = connect(db_url, **connect_params)

@roansong I'm not sure why is it working? :) As I can see aiopg does accept timeout parameter but not connect_timeout .

Looking at Pool interface https://aiopg.readthedocs.io/en/stable/core.html#aiopg.create_pool


how to convert many pages

How to manipulate this usage code to convert many pages at once?
DjvuDocument doc = new DjvuDocument(@"Mcguffey's_Primer.djvu");
var page = doc.Pages[0];
page
.BuildPageImage()
.Save("TestImage1.png", ImageFormat.Png);
page.IsInverted = true;
page
.BuildPageImage()
.Save("TestImage2.png", ImageFormat.Png);

Could use multithreading however please take a look at https://github.com/DjvuNet/DjvuNet

it is seems like more complicated than yours here https://github.com/Telavian/DjvuNet
thats why I prefer to use that simple one
I do not understand how to build this https://github.com/DjvuNet/DjvuNet
can anyone create video tutorial step by step how to build it


PAL keeps crashing after a while

Not sure why this is happening but I need to restart it manually to solve it each time.
Here's the log output:
2024-11-20 02:00:37,419 [INFO] Language update: Episode: What We Do in the Shadows (S06E07) | Status: Updated episode | Updated for all users
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 536, in _make_request
response = conn.getresponse()
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 507, in getresponse
httplib_response = super().getresponse()
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/http/client.py", line 1428, in getresponse
response.begin()
File "/usr/local/lib/python3.12/http/client.py", line 331, in begin
version, status, reason = self._read_status()
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/http/client.py", line 292, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/socket.py", line 720, in readinto
return self._sock.recv_into(b)
^^^^^^^^^^^^^^^^^^^^^^^
TimeoutError: timed out
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 667, in send
resp = conn.urlopen(
^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 843, in urlopen
retries = retries.increment(
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/urllib3/util/retry.py", line 474, in increment
raise reraise(type(error), error, _stacktrace)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/urllib3/util/util.py", line 39, in reraise
raise value
File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 789, in urlopen
response = self._make_request(
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 538, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 369, in _raise_timeout
raise ReadTimeoutError(
urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool(host='plex.media.svc.cluster.local', port=32400): Read timed out. (read timeout=30)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/app/main.py", line 143, in
plex_auto_languages.start()
File "/app/main.py", line 91, in start
if count % 60 == 0 and not self.plex.is_alive:
^^^^^^^^^^^^^^^^^^
File "/app/plex_auto_languages/plex_server.py", line 122, in is_alive
return self.connected and self._alert_listener is not None and self._alert_listener.is_alive()
^^^^^^^^^^^^^^
File "/app/plex_auto_languages/plex_server.py", line 39, in connected
_ = self._plex.library.sections()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/plexapi/library.py", line 75, in sections
self._loadSections()
File "/usr/local/lib/python3.12/site-packages/plexapi/library.py", line 62, in _loadSections
for elem in self._server.query(key):
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/plexapi/server.py", line 760, in query
response = method(url, headers=headers, params=params, timeout=timeout, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 602, in get
return self.request("GET", url, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 589, in request
resp = self.send(prep, **send_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 713, in send
raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPConnectionPool(host='plex.media.svc.cluster.local', port=32400): Read timed out. (read timeout=30)
ERROR:plexapi:AlertListener Error: Connection to remote host was lost.
2024-11-20 05:10:20,449 [WARNING] The Plex server closed the websocket connection
ERROR:websocket:Connection to remote host was lost. - goodbye

@JourneyOver i am running your image of  PAL

@JourneyOver i am running your image of PAL

As in the error above is coming from my version or that you are now running my version due to the above error?
I've not seen an actual full on crash at all myself since forking and updating things, couple times there will be an big error message from me shutting down plex temporarily for one reason or another or a small connectionerror message coming up because my internet is crap sometimes but it normally just does a retry and starts working.
I do see that you are running it through the host of plex.media.svc.cluster.local, have you tried running through just normal IP by chance to see if it ever ran into the crash? could be that there is something wrong with your hosting setup or something.
I'll take a closer look at things when I get a chance, but if I can't reproduce it any then I'm not sure if I'll be able to really fix your issue short of maybe seeing about upping the value of the read timeout some more or looking into adding a retry into the code for if PAL hits a read timed out message but even then these would just be temporary measures that may not even work in the end.


do not create unnecessary logins for mssql

This is a replacement for #457. I tried rebasing #457, but couldn't push to @zhongyi-zhang's branch.
Credit goes to @zhongyi-zhang on these changes. Thank you!

Cool! Glad to see this refinement checked-in.


Document how to delete the deployment

After trying this out (as a very new-to-Kubernetes person) I had a lot of trouble figuring out how to remove it again.
Eventually this worked for me:
kubectl delete deployment hello-kubernetes-hello-world -n hello-kubernetes

Would be great if the README covered this!

The correct way to uninstall a helm chart is to use helm uninstall RELEASE_NAME where RELEASE_NAME is the name you gave to your application at installation time.  If you can't remember the name of the release, run helm list


Update register-scan-azure-sql-database.md

corrected misspelling

@DanielJanik : Thanks for your contribution! The author(s) have been notified to review your proposed change.

Approved by Whitney Henderson in email. Merging now.
Thanks!


Updating to rust-bitcoin 0.26

Will appreciate new release - required for publishing downstream crates to crates.io

ACK 3ac7f6ec6b25c4cd64640a1885cf5163bb7ada64

ACK 3ac7f6ec6b25c4cd64640a1885cf5163bb7ada64

Sorry, but I really need version upgrade for 0.26 bitcoin, this blocks me from using this crate anywhere (b/c I migrated to 0.26 everywhere else). Can we do a release before merging the rest of PRs under review? You can number it whatever you like (for instance 0.5.0-beta.2): since there is -beta.* suffix any new release is an API-breaking change (and of course upgrading major dependency version is an API break).

Sorry, but I really need version upgrade for 0.26 bitcoin, this blocks me from using this crate anywhere (b/c I migrated to 0.26 everywhere else). Can we do a release before merging the rest of PRs under review? You can number it whatever you like (for instance 0.5.0-beta.2): since there is -beta.* suffix any new release is an API-breaking change (and of course upgrading major dependency version is an API break).

Released now as version 0.6.0, sorry it took a while

Released now as version 0.6.0, sorry it took a while

Thank you - one day is very fast for FLOSS peer-reviewed world!

Thank you - one day is very fast for FLOSS peer-reviewed world!


NSwag produces invalid typescript

In my process methods NSwag produces an else statement, but the variable names doesn't seem to follow the correct naming:
} else {
    return response.text().then((_responseText) => {
    let resultdefault: any = null;
    let resultDatadefault = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
    result = resultData ? BadRequestObjectResult.fromJS(resultData) : new BadRequestObjectResult();
    return throwException("A server error occurred.", status, _responseText, _headers, resultdefault);
    });
}

Cannot find name 'result' and Cannot find name 'resultData'. The variables are obviously named resultdefault and resultDatadefault.

Can you provide a sample swagger spec?

I will provide one in a few hours.

Here's a sample swagger specification and it produces this typescript client.
Using this command:
nswag swagger2tsclient /input:Mock.json /output:Client.ts