The Resource for February 2026
This edition of the iRODS newsletter covers the announcement of the 2025 iRODS User Group Meeting in Barcelona, along with recent releases including the new iRODS HTTP API Python Wrapper Library (v0.1.0, available via PyPI). The issue highlights section flags three items worth particular attention: the deprecation and upcoming removal of Oracle database support, a known timeout issue when computing checksums on large files via the HTTP API (with a workaround in use while a fix is developed), and a long-standing mystery finally solved around systemd's RemoveIPC setting silently deleting iRODS shared memory files. The bulk of the newsletter is a detailed roundup of GitHub activity across the iRODS ecosystem — covering open and recently closed issues in the main iRODS repository, the Python client, the HTTP API, testing environment, and the YODA project — touching on bugs, enhancements, and deprecations ranging from GenQuery join logic errors and ticket string truncation to privilege escalation in policy and PAM authentication improvements.
Hello, here is this month's iRODS news and developments!
Click here to read this email on the web.

Obligatory Calls To Action:
Book a FREE iRODS Audit
Book a FREE iRODS Security Audit
iRODSNews
The iRODS User Group Meeting for this year has been announced - Barcelona!
Are you going?
I'd love to, but its right in the middle of my eldest child's GCSE exams...
Mastodon Toots
The new iRODS HTTP API Python Wrapper Library v0.1.0 is released!
https://github.com/irods/irods_client_http_python/Via PyPI:
pip install irods-httpCard: GitHub - irods/irods_client_http_python
Description: Contribute to irods/irods_client_http_python development by creating an account on GitHub.iRODS Development Update: February 2026
https://irods.org/2026/02/irods-development-update-february-2026/logical locking
policy composition
crc64/nvme checksums
storage tiering
cyberduck updates
Card: iRODS
Join us for Community Office Hours!
https://fosstodon.org/@irods/116025435038198439Join us for Community Office Hours!
Wed, Feb 11, 4-5pm ET
https://renci.zoom.us/meeting/register/PI9KLyFQRgOUs5YRqB7MUAiRODS Community Office Hours
Wed, Feb 11, 4-5pm ET
Ask questions.
Discuss the news of the day.
Not recorded.
A safe place to learn.
National Center for High-Performance Computing (NCHC) joins the iRODS Consortium
https://irods.org/2026/01/nchc-joins-the-irods-consortium/The National Center for High-Performance Computing (NCHC), a major national
research infrastructure organization supporting high-performance computing
(HPC), AI, large-scale data services, and scientific research across Taiwan,
has become the newest member of the iRODS Consortium.Card: iRODS
iRODS Development Update: January 2026
https://irods.org/2026/01/irods-development-update-january-2026/Card: iRODS
Issue Highlights:
I'd like to call out a couple of issues further down the newsletter;
Oracle Database Support Deprecation - Oracle is being removed as a database option. I only know of one other consortium member that used Oracle, and I've not encountered others outside it, so if you use Oracle, then take note! And if you want help migrating, let me know - my database colleagues and I moved a 500 million row database a few years back and I can share how we prepared, what checks we did and so on, as well as our approach.
HTTP API - the bane of my life over the years has been timeouts when uploading large files, especially if you're Doing The Right Thing(tm) and calculating checksums. On a multi GB or even TB file it can add quite a delay to the upload process, and things like load balancers and
/proc/sys/net/ipv4/tcp_keepalive_timecan cause disconnects and disruption to the control plane, which in turn cause files to not be registered in the catalog properly or seem to fail to upload. Read below for a similar issue in the HTTP API and how the user is working around it. As its a live issue I expect a fix will be around the corner!If you write your own systemd configuration (as most of us do, all our systems are different after all), then check out the cautionary tale in the "RemoveIPC=no" issue. My colleagues, the fine RENCI folks and I have been looking for the reason for this for years!
GitHub Activity
Main Repository (irods/irods)
Open Issues – irods/irods
acDeleteCollByAdmin no longer called
State: open
Labels: consortium-member, configuration
Description: ## Bug Report
### iRODS Version, OS and Version
iRODS 4.3.1, Ubuntu 18.04
### What did you try to do?
I'm testing iRODS rule logic on an iRODS 4.3.1 server. The rule logic works on iRODS 4.1.10. When testing the behavior of the PEP acDeleteCollByAdmin, it no longer appears to be called when iadmin rmcoll is executed.
### Expected behavior
When a collection is administratively deleted, I except the PEP acDeleteCollByAdmin to be triggered.
Tickets: Server allows
write byte countto exceedwrite byte limitState: open
Labels: bug
Description: ## Bug ReportWhen a ticket is used and
write byte countmatcheswrite byte limit, the server will allow the operation to succeed. The reason for this is partially due to the following code block. Notice line 1452.Tracing how the server handles
iput -f -t <ticket>shows a call sequence containing the following functions (ordered).rsDataObjPutrsDataObjOpenrs_data_object_finalizecheckObjIdByTicket(contains the code block above)rsDataObjWriters_data_object_finalizecheckObjIdByTicket(contains the code block above)
The important part is that
checkObjIdByTicketis invoked twice. The way tickets are currently implemented makes reasoning about the code difficult.Changing line 1452 in
checkObjIdByTicketto use>=instead of>creates other problems - i.e.checkObjIdByTicketdetects a violation on the second invocation, leading to a stale replica.The real solution is probably to refactor how the server handles tickets. Or, deprecate the existing API and introduce a new one.
Ticket string silently truncated in catalog
State: open
Labels: bug
Description: ## Bug Report
While working on #2720, I wrote a test which attempts to create a ticket named issue_2720_uses_count_using_iput.
iticket create write the_data_object issue_2720_uses_count_using_iput
The creation of the ticket appears to be successful as no errors are reported by the server or icommands. Unexpectedly, the test fails when attempting to modify properties of the ticket because the ticket's name is truncated in the catalog. Notice the ticket_string column below.
ICAT=> select * from r_ticket_main ;
ticket_id | ticket_string | ticket_type | user_id | object_id | object_type | uses_limit | uses_count | write_file_limit | write_file_count | write_byte_limit | write_byte_count | ticket_expiry_ts | restrictions | create_ts | modify_ts
-----------+-------------------------------+-------------+---------+-----------+-------------+------------+------------+------------------+------------------+------------------+------------------+------------------+--------------+-------------+-------------
37257 | issue_2720_uses_count_using_i | write | 37251 | 37256 | data | 0 | 0 | 10 | 0 | 0 | 0 | | | 01770675075 | 01770675075
(1 row)
The schema for r_ticket_main shows that the table is capable of holding a string of 100 characters.
ICAT=> \d r_ticket_main
Table "public.r_ticket_main"
Column | Type | Collation | Nullable | Default
------------------+------------------------+-----------+----------+---------
<snip>
ticket_string | character varying(100) | | |
<snip>
The TicketAdmin API and supporting functions need to be checked to make sure ticket strings use consistent sizes.
Allow privilege escalation in policy
State: open
Labels: enhancement
Description: ## Enhancement
When policy is triggered, it is normally executed as the user who invoked the related API. This is fine/good in most cases. However, there are cases where certain operations need rodsadmin level privileges. See https://github.com/irods/irods_rule_engine_plugin_logical_quotas/issues/132 for such a case.
It would be helpful if admins could write policy which temporarily escalate privileges for rodsadmin level operations. As of this writing, the only known solution to this problem is to write C++ plugins. If this feature were provided, admins would then be able to implement functionality only supported by C++.
### Requirements
Use of privilege escalation is LIMITED to rodsadmin users
Use of privilege escalation is server-side only - i.e. CANNOT be used via
iruleUse of privilege escalation in server-side policy DOES NOT block non-rodsadmin users
delay()andremote()MUST NOT bypass stated requirements
### Syntax Ideas
Here are some ideas showing how the feature could look.
pep_api_data_obj_put_pre(*args ...)
{
do_work();
do_more_work();
# Escalate privileges. De-escalate privileges on the
# closing curly braces.
@rodsadmin {
rodsadmin_operation_1();
rodsadmin_operation_2();
}
do_even_more_work();
}
pep_api_data_obj_put_pre(*args ...)
{
do_work();
do_more_work();
# Escalate privileges. De-escalate privileges on the
# closing curly braces.
exec_as_rodsadmin("<options>") {
rodsadmin_operation_1();
rodsadmin_operation_2();
}
do_even_more_work();
}
pep_api_data_obj_put_pre(*args ...)
{
do_work();
do_more_work();
# Escalate privileges.
rodsadmin_session_begin();
rodsadmin_operation_1();
rodsadmin_operation_2();
# De-escalate privileges.
rodsadmin_session_end();
do_even_more_work();
}
### Possible Solutions
Modify the NREP and PREP
Ship modified implementations of the NREP and PREP alongside the stable ones
Make implementing C++ plugins significantly easier (must be a 10x improvement)
Make a new language (must be a 10x improvement)
### Things to Consider
Error handling during escalation
Error handling while in an escalated state
Testability - verification of correctness
Server redirects while in an escalated state
### Miscellaneous Notes
PEPs defined in core.re always take precedence over user submitted code (irule)
User submitted code is appended
The first definition wins
Tracking/Inspecting stackframes could lead to interesting capabilities
See https://github.com/irods/irods_rule_engine_plugin_logical_quotas/issues/132#issuecomment-3802102344
State: open
Labels: documentation
Description:
version - [ ] Release notesState: open
Labels: deprecation / removal
Description: Depends on #8829.What should we do with
plugins/experimental?State: open
Labels: question
Description:
experimental APIs which are currently unsupported. They were first
introduced as part of #5007. We should consider doing one of the following:
Move these into a separate repository - Officially support them and move
them out of the experimental space - Delete themcollapse multiple authentication error codes
State: open
Labels: enhancement
Description: ### New Feature / Functionality
The server should not distinguish to the client why an authentication request failed. There should be a single error code returned, regardless of internal logic or codepaths.
Use ccache in GitHub Actions when compiling iRODS code
State: open
Labels: testing, build / tools
Description:
https://github.com/irods/irods_reusable_github_workflows/pull/27State: open
Labels: bug, consortium-member
Description: ## Bug Report
GenQuery incorrectly joins R_DATA_MAIN when querying COLL_ACCESS_NAME, causing empty collections to be omitted
### iRODS Version, OS and Version
iquest version: v4.3.4
iRODS server version: v4.2.8
### What did you try to do?
I executed an iquest command to list sub-collections and their associated ACLs (permissions) under a specific parent path:
iquest "SELECT COLL_NAME, COLL_ACCESS_NAME, USER_NAME, USER_ZONE, USER_TYPE WHERE COLL_PARENT_NAME = '/iplant/home/iychoi'"
### Expected behavior
The GenQuery should generate SQL that joins R_COLL_MAIN with R_OBJT_ACCESS to retrieve collection permissions. It should not involve R_DATA_MAIN, as the query is specifically targeting collection attributes (COLL_NAME, COLL_ACCESS_NAME).
The expected result should include all sub-collections, including those that do not contain any data objects.
### Observed Behavior (including steps to reproduce, if applicable)
The generated SQL incorrectly includes a join on R_DATA_MAIN and an extra alias for R_OBJT_ACCESS. This forces an intersection where only collections containing at least one data object are returned.
#### Resulting SQL (Incorrect)
-- GenQuery included R_DATA_MAIN and r_data_access unnecessarily
select distinct R_COLL_MAIN.coll_name ,r_coll_tokn_accs.token_name ,R_USER_MAIN.user_name ,R_USER_MAIN.zone_name ,R_USER_MAIN.user_type_name
from R_COLL_MAIN , R_TOKN_MAIN r_coll_tokn_accs , R_USER_MAIN , R_OBJT_ACCESS r_data_access , R_DATA_MAIN , R_OBJT_ACCESS r_coll_access
where R_COLL_MAIN.parent_coll_name = '/iplant/home/iychoi'
AND R_USER_MAIN.user_id = r_data_access.user_id
AND R_DATA_MAIN.data_id = r_data_access.object_id
AND R_COLL_MAIN.coll_id = R_DATA_MAIN.coll_id -- This join filters out empty collections
AND r_coll_access.access_type_id = r_coll_tokn_accs.token_id
AND R_COLL_MAIN.coll_id = r_coll_access.object_id
order by R_COLL_MAIN.coll_name;
As a result, only 12 rows were returned. Collections like /iplant/home/iychoi/analyses and /iplant/home/iychoi/ticket_test were missing because they presumably contain no data objects.
#### Manual Verification (Correct SQL)
When I manually run the query without the data-tier joins, I get the correct 19 rows:
select distinct R_COLL_MAIN.coll_name ,r_coll_tokn_accs.token_name ,R_USER_MAIN.user_name ,R_USER_MAIN.zone_name ,R_USER_MAIN.user_type_name
from R_COLL_MAIN , R_TOKN_MAIN r_coll_tokn_accs , R_USER_MAIN , R_OBJT_ACCESS r_coll_access
where R_COLL_MAIN.parent_coll_name = '/iplant/home/iychoi'
AND R_USER_MAIN.user_id = r_coll_access.user_id
AND r_coll_access.access_type_id = r_coll_tokn_accs.token_id
AND R_COLL_MAIN.coll_id = r_coll_access.object_id
order by R_COLL_MAIN.coll_name;
Consider adding
RemoveIPC=noto service unit file templateState: open
Labels: question, setup / deployment, configuration
Description:
experiencing this issue on 4.2.7, it was discovered that the iRODS service
account was not a system user and we observed that systemd was repeatedly
deleting the iRODS shared memory files. It's possible that the system got
this way because the iRODS service account user was created before the setup
script created the user as a system user (the setup script invokesuseradd -r, where-rindicates that it is a system user). > > We resolved the
issue in this case by modifying/etc/systemd/logind.confto explicitly setRemoveIPC=no. This should go in the unit file, not in a system-wide
configuration. However, given that this will disable cleanup of "System V
semaphores, as well as System V and POSIX shared memory segments and message
queues", and given that this issue was with a 4.2.7 deployment, I am
skeptical as to whether it is a good idea to add this to our unit file
template.irods::query::emptyreturnssize_tinstead ofboolState: open
Labels: bug, build / tools
Description:
🤦
Closed Issues – irods/irods
Closed on 2026-02-13:
Closed on 2026-02-10:
std::memsetcalled onRsCommcan result in undefined behaviorClosed on 2026-02-10:
Do not brace-initialize nlohmann-json objects with other json objects.
Closed on 2026-02-05:
Use
irods::authentication::scheme_nameinstead of string literalsClosed on 2026-02-03:
core_tests_list.jsonmissing several test suites inscripts/irods/testClosed on 2026-01-28:
clang-tidy: Possibly uninitialized values used in update_replica_access_table
Closed on 2026-02-04:
Document or change the effects of disabling and re-enabling group quotas
Closed on 2025-08-18:
Switch Debian 13 docker image bases from
debian:trixietodebian:13Closed on 2026-01-27:
iRODS 4.3.3 Crash (SIGABRT): Double free or corruption in clearBBuf when handling storage I/O error
Closed on 2026-02-02:
Closed on 2026-01-28:
Closed on 2026-01-20:
replication resource does not work during a rebalance operation
Closed on 2026-02-13:
msiSetKeyValuePairsToObjfails with 4.3.4Closed on 2026-02-05:
Closed on 2025-05-09:
Logger throws JSON exception when passed invalid UTF-8 sequences
Closed on 2026-02-03:
Closed on 2026-02-04:
irmtrashdoesnt remove directoriesClosed on 2026-02-03:
rc_data_object_modify_infodoes not check theRcCommfor null pointersClosed on 2026-02-03:
irsync -l does not show data objects that need to be synchronized due to content changes
Closed on 2026-02-11:
iCommands: Deprecate
--rlockand--wlockoptionsClosed on 2026-02-11:
Closed on 2026-01-26:
Data object mtime of zero-length files not updating after ingest and istream
Closed on 2026-02-05:
Closed on 2026-01-27:
Closed on 2026-01-29:
initial irodsctl call during upgrade to 4.2.8 fails due to ICAT password
Closed on 2026-01-24:
Closed on 2026-02-09:
Closed on 2026-01-21:
Closed on 2026-01-29:
server should cleanly exit if not enough logging space on startup
Closed on 2026-02-10:
Tickets will increment both uses and write-file on failed access
Python iRODS Client (irods/python-irodsclient)
Open Issues – irods/python-irodsclient
allow access of MetadataManager options as attributes
State: open
Labels: enhancement
Description:obj.metadata.reloadisTrue(as that's the default) butobj.metadata(reload=False).reloadreflects the modified value ofFalseMistake in Username in env file leads to NetworkError
State: open
Labels: bug, consortium-member
Description:
which uses the pam module to authenticate users. When I use a wrong
username in my irods environment file, the PRC throws a NetworkError while
as a user I would expect a CAT_INVALID_USER or CAT_INVALID_AUTHENTICATION:
CRITICAL:irods.connection:Read 0 bytes from socket instead of expected 4
bytes ERROR:irods.connection:Could not receive server response
NetworkException('Could not receive server response')
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
File /opt/homebrew/lib/python3.13/site-packages/irods/session.py:368, in
iRODSSession.__server_version(self) 367 try: --> 368 conn =
next(iter(self.pool.active)) 369 return conn.server_version
StopIteration: During handling of the above exception, another exception
occurred: KeyError Traceback (most recent
call last) File /opt/homebrew/lib/python3.13/site-packages/irods/pool.py:93,
in Pool.get_connection(self) 92 try: ---> 93 conn = self.idle.pop()
95 curr_time = datetime.datetime.now() KeyError: 'pop from an empty
set' During handling of the above exception, another exception occurred:
OSError Traceback (most recent call last)
File /opt/homebrew/lib/python3.13/site-packages/irods/connection.py:173, in
Connection.recv(self, into_buffer, return_message, acceptable_errors)
172 if into_buffer is None: --> 173 msg = iRODSMessage.recv(self.socket)
174 else: File
/opt/homebrew/lib/python3.13/site-packages/irods/message/__init__.py:341, in
iRODSMessage.recv(sock) 338 @staticmethod 339 def recv(sock):
340 # rsp_header_size = sock.recv(4, socket.MSG_WAITALL) --> 341
rsp_header_size = _recv_message_in_len(sock, 4) 342 rsp_header_size
= struct.unpack(">i", rsp_header_size)[0] File
/opt/homebrew/lib/python3.13/site-packages/irods/message/__init__.py:245, in
_recv_message_in_len(sock, size) 242 msg = "Read {} bytes from
socket instead of expected {} bytes".format( 243 retbuf_size,
size 244 ) --> 245 raise socket.error(msg) 247 return retbuf
OSError: Read 0 bytes from socket instead of expected 4 bytes During
handling of the above exception, another exception occurred:
NetworkException Traceback (most recent call last)
File ~/git-repos/iBridges/ibridges/session.py:311, in
Session.authenticate_using_auth_file(self) 310
os.unlink(temp_ienv_path) --> 311 _ = irods_session.server_version #
pylint: disable=possibly-used-before-assignment 312 except
NonAnonymousLoginWithoutPassword as e: File
/opt/homebrew/lib/python3.13/site-packages/irods/session.py:331, in
iRODSSession.server_version(self) 329 @property 330 def
server_version(self): --> 331 return self._server_version() File
/opt/homebrew/lib/python3.13/site-packages/irods/session.py:364, in
iRODSSession._server_version(self, version_func) 363 return
tuple(ast.literal_eval(reported_vsn)) --> 364 return self.__server_version()
if version_func is None else version_func(self) File
/opt/homebrew/lib/python3.13/site-packages/irods/session.py:371, in
iRODSSession.__server_version(self) 370 except StopIteration: --> 371
conn = self.pool.get_connection() 372 version = conn.server_version
File /opt/homebrew/lib/python3.13/site-packages/irods/pool.py:18, in
attribute_from_return_value.<locals>.deco.<locals>.method_(self, *s, **kw)
17 def method_(self, *s, **kw): ---> 18 ret = method(self, *s, **kw)
19 setattr(self, attrname, ret) File
/opt/homebrew/lib/python3.13/site-packages/irods/pool.py:117, in
Pool.get_connection(self) 116 except KeyError: --> 117 conn =
Connection(self, self.account) 118 new_conn = True File
/opt/homebrew/lib/python3.13/site-packages/irods/connection.py:83, in
Connection.__init__(self, pool, account) 82 self._client_signature =
None ---> 83 self._server_version = self._connect() 84
self._disconnected = False File
/opt/homebrew/lib/python3.13/site-packages/irods/connection.py:365, in
Connection._connect(self) 364 # Server responds with version --> 365
version_msg = self.recv() 367 if neg_result == USE_SSL: File
/opt/homebrew/lib/python3.13/site-packages/irods/connection.py:184, in
Connection.recv(self, into_buffer, return_message, acceptable_errors)
183 self.release(True) --> 184 raise NetworkException("Could not
receive server response") 185 if isinstance(return_message, list):
NetworkException: Could not receive server response
Introduce a
DataTransferInterruptedExceptionto replace RuntimeErrorState: open
Labels: enhancement
Description:
exception (if any) when a parallel put or get didn't complete. Suggest
deprecating theRuntimeErrorfor v4.0.0 in favor of making it aDataTransferInterruptedException. Originally posted by @d-w-moore
in
https://github.com/irods/python-irodsclient/issues/728#issuecomment-3757066726
Closed Issues – irods/python-irodsclient
Closed on 2026-01-30:
Closed on 2026-02-09:
Closed on 2026-01-30:
Closed on 2026-02-05:
Segmentation fault and ssl errors after the client connection is cut by KeyboardInterrupt
Closed on 2026-02-06:
chained mutator calls from metadata manager do not preserve state
NFSRODS (irods/irods_client_nfsrods)
Open Issues – irods/irods_client_nfsrods
Closed Issues – irods/irods_client_nfsrods
icommands (irods/irods_client_icommands)
Open Issues – irods/irods_client_icommands
Closed Issues – irods/irods_client_icommands
HTTP API Client (irods/irods_client_http_api)
Open Issues – irods/irods_client_http_api
Make the compute checksum endpoint more async friendly
State: open
Labels: enhancement, consortium-member
Description:
synchronous, which makes sense since the API layer is simply calling the
iRODS itself that computes the hash. But, as I believe in many companies, we
use balancers, proxies, etc. that are checking the connection itself and
have some strict time limits on how long a session can be alive without any
response. In our current situation, calculating a 30 GB file takes around a
minute, so in an hour we can compute ~2 TB file at maximum. But the limits
for sessions are often around tens of seconds, at maximum a few minutes, so
computing anything above a few tens of gigabytes is not possible. My
current solution is that I have added an argument that will make the
request.post in the Python HTTP API client not to wait for a response, so it
behaves more like an asynchronous endpoint, and after that, I'm polling the
iCAT (iRODS object) to see if the checksum has appeared there. This is a
"hack" to compute even large files without any timeout, as I only tell the
API to start computing and kill the connection immediately and then poll the
iCAT for computed checksum till it appears there. I believe this is
functional for me, but it is kinda funky solution. Maybe implementing this
directly in the iRODS API in some sense would be better. I wish you a good
day. Tobias Janča, IT4I.Add functionality to change default application name - spOption
State: open
Labels: enhancement, consortium-member
Description:
https://github.com/irods/irods_client_library_rirods/issues/58, clients that
depend on irods-http-api, such as rirods, should be able to update their
default application name.
Closed Issues – irods/irods_client_http_api
PAM Interactive Auth Plugin (irods/irods_auth_plugin_pam_interactive)
Open Issues – irods/irods_auth_plugin_pam_interactive
Absorb
irods-auth-plugin-pam-interactive-clientinto iCommandsState: open
Labels: question, consortium-member
Description:
irods-auth-plugin-pam-interactive-client package must be installed
separately alongside iCommands. To reduce confusion and improve user
experience, could the relevant plugin (or relevant part of
it)(https://github.com/irods/irods_auth_plugin_pam_interactive) be included
in future iCommands releases?
Closed Issues – irods/irods_auth_plugin_pam_interactive
Demo Repository (irods/irods_demo)
Open Issues – irods/irods_demo
Closed Issues – irods/irods_demo
Java Client Library (irods/irods4j)
Open Issues – irods/irods4j
Closed Issues – irods/irods4j
Testing Environment (irods/irods_testing_environment)
Open Issues – irods/irods_testing_environment
State: open
Labels: enhancement
Description: See https://docs.astral.sh/ruff/rules/root-logger-call/
Closed Issues – irods/irods_testing_environment
Closed on 2026-02-13:
Closed on 2026-02-04:
Closed on 2026-02-03:
iRODS server log not being copied in
run_unit_tests.pyClosed on 2026-02-03:
Problems getting python prereqs installed on 3.12.3 aka docker-compose dependency
Closed on 2026-02-03:
supporting docker-related Python packages now need version restrictions
Closed on 2026-02-03:
Closed on 2026-02-03:
Closed on 2026-02-03:
Closed on 2026-02-03:
Testing environment tries to install irods packages in database container when
--project-nameargument has underscoresClosed on 2026-02-09:
Avoid use of
aptin scriptsClosed on 2026-02-09:
Symbolic link in plugin directory pointing to itself causes issues in plugin install
Closed on 2026-02-09:
run_plugin_tests.pytries to passlogfile_pathkeword-argument tologs.collect_logs()Closed on 2026-02-03:
Document
--project-nameoptionClosed on 2026-02-09:
Closed on 2026-02-06:
Closed on 2026-02-03:
Closed on 2026-02-09:
Closed on 2026-02-03:
Closed on 2026-02-06:
Closed on 2026-02-09:
Make generated job names and output directories for test runs easier to find
Closed on 2026-02-06:
Adjust
loggingterminology fromdebug/info/warning/errorClosed on 2026-02-06:
externals (irods/externals)
Open Issues – irods/externals
Closed Issues – irods/externals
YODA (UtrechtUniversity/yoda)
Open Issues – UtrechtUniversity/yoda
the SRAM synchronization rule does not expect SRAM collaborations without members
State: open
Labels: No Labels
Description: ### Is there an existing bug report for this?
I have searched the existing bug reports
### Current Behavior
the SRAM synchronization rule:
irule -r irods_rule_engine_plugin-irods_rule_language-instance -F /etc/irods/yoda-ruleset/tools/sram-sync.r
fails when SRAM API "get collaboration members" call return an empty response:
Jan 30 11:32:44 yoda irodsServer[3953936]: {"log_category":"rule_engine","log_level":"info","log_message":"writeString: [groups] Get members of group priv-category-add from SRAM","request_api_name":"EXEC_MY_RULE_AN","request_api_number":625,"request_api_version":"d","request_client_user":"rods","request_host":"127.0.0.1","request_proxy_user":"rods","request_release_version":"rods4.3.4","server_host":"yoda.wur.nl","server_pid":3953936,"server_timestamp":"2026-01-30T10:32:44.319Z","server_type":"agent","server_zone":"wur"}
Jan 30 11:32:44 yoda irodsServer[3953936]: {"log_category":"rule_engine","log_level":"error","log_message":"caught python exception","python_exception":"Traceback (most recent call last):\n File \"/home/yodawur/.local/lib/python3.9/site-packages/requests/models.py\", line 976, in json\n return complexjson.loads(self.text, **kwargs)\n File \"/usr/lib64/python3.9/json/__init__.py\", line 346, in loads\n return _default_decoder.decode(s)\n File \"/usr/lib64/python3.9/json/decoder.py\", line 337, in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n File \"/usr/lib64/python3.9/json/decoder.py\", line 355, in raw_decode\n raise JSONDecodeError(\"Expecting value\", s, err.value) from None\njson.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/etc/irods/rules_uu/util/rule.py\", line 92, in r\n result = f(Context(callback, rei), *a)\n File \"/etc/irods/rules_uu/groups.py\", line 1290, in rule_group_sram_sync\n co_members = sram.sram_get_co_members(ctx, co_identifier)\n File \"/etc/irods/rules_uu/sram.py\", line 314, in sram_get_co_members\n data = response.json()\n File \"/home/yodawur/.local/lib/python3.9/site-packages/requests/models.py\", line 980, in json\n raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)\nrequests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n","request_api_name":"EXEC_MY_RULE_AN","request_api_number":625,"request_api_version":"d","request_client_user":"rods","request_host":"127.0.0.1","request_proxy_user":"rods","request_release_version":"rods4.3.4","rule_engine_plugin":"python","server_host":"yoda.wur.nl","server_pid":3953936,"server_timestamp":"2026-01-30T10:32:44.350Z","server_type":"agent","server_zone":"wur"}
Jan 30 11:32:44 yoda irodsServer[3953936]: {"log_category":"legacy","log_level":"error","log_message":"executeRuleAction Failed for rule_group_sram_sync status = -1 Unknown iRODS error, Operation not permitted","request_api_name":"EXEC_MY_RULE_AN","request_api_number":625,"request_api_version":"d","request_client_user":"rods","request_host":"127.0.0.1","request_proxy_user":"rods","request_release_version":"rods4.3.4","server_host":"yoda.wur.nl","server_pid":3953936,"server_timestamp":"2026-01-30T10:32:44.351Z","server_type":"agent","server_zone":"wur"}
Notice that the same happens with other calls, for example to get the id of a SRAM member. If the call fails, for example for a HTTP error 429: too many requests, then the script crashes.
### Expected Behavior
The rule completes, skipping the "empty" collaborations or, in general, the failed SRAM calls.
### Steps to Reproduce
I am not sure why there are empty SRAM collaborations.
My guess is because after the latest Yoda upgrade, the group managers have the option to remove themselves from the group, after inviting a new member as group manager. This works fine in Yoda, but in SRAM it means that there are collaborations without members, only invited users who may or may not accept the invitation.
I am able to avoid that the rule crashes with these patches:
At line 82 in /etc/irods/rules_uu/sram.py
response = requests.get(url, headers=headers, timeout=30, verify=config.sram_tls_verify)
if response:
if config.sram_verbose_logging:
log.write(ctx, "raw response: {}".format(response))
data = response.json()
else:
log.write(ctx, "raw response is None")
data = {'collaboration_memberships': { }}
At line 314 (319 after the first patch):
response = requests.get(url, headers=headers, timeout=30, verify=config.sram_tls_verify)
if response:
if config.sram_verbose_logging:
log.write(ctx, "raw response {}".format(response))
data = response.json()
else:
log.write(ctx, "raw response is None")
data = {'collaboration_memberships': { }}
The above patches do not prevent anyway to overload SRAM API:
Jan 30 14:15:32 yoda irodsServer[3984119]: {"log_category":"rule_engine","log_level":"info","log_message":"writeString: [sram] get: https://sram.surf
.nl/api/invitations/v1/invitations/4aaa7b2d-93fc-4eaf-bb75-324825dedaf1","request_api_name":"EXEC_MY_RULE_AN","request_api_number":625,"request_api_v
ersion":"d","request_client_user":"rods","request_host":"127.0.0.1","request_proxy_user":"rods","request_release_version":"rods4.3.4","server_host":"
yoda.wur.nl","server_pid":3984119,"server_timestamp":"2026-01-30T13:15:32.075Z","server_type":"agent","server_zone":"wur"}
Jan 30 14:15:32 yoda irodsServer[3984119]: {"log_category":"rule_engine","log_level":"info","log_message":"writeString: [sram] response: 429","request_api_name":"EXEC_MY_RULE_AN","request_api_number":625,"request_api_version":"d","request_client_user":"rods","request_host":"127.0.0.1","request_proxy_user":"rods","request_release_version":"rods4.3.4","server_host":"yoda.wur.nl","server_pid":3984119,"server_timestamp":"2026-01-30T13:15:32.104Z","server_type":"agent","server_zone":"wur"}
Jan 30 14:15:32 yoda irodsServer[3984119]: {"log_category":"rule_engine","log_level":"info","log_message":"writeString: [sram] Error retrieving existing invitations: 429","request_api_name":"EXEC_MY_RULE_AN","request_api_number":625,"request_api_version":"d","request_client_user":"rods","request_host":"127.0.0.1","request_proxy_user":"rods","request_release_version":"rods4.3.4","server_host":"yoda.wur.nl","server_pid":3984119,"server_timestamp":"2026-01-30T13:15:32.104Z","server_type":"agent","server_zone":"wur"}
### Environment
- Yoda version 2.0.0
Option to receive email notifications with additional information
State: open
Labels: No Labels
Description: ### Is there an existing feature request for this?
I have searched the existing feature requests
### Is your feature request related to a problem? Please describe.
Currently, the notifications sent by Yoda via email are generic and contain very little information about the data package. In addition, to view the full contents of the notification, you need to login in to Yoda.
Some examples of these notifications:
'Data package secured in the vault'
'Data package submitted for the vault'
'Failed to set retry state on data package'
'Data package failed to copy to vault after maximum retries'
The current email notification settings do not offer much room for personalization. I can only choose to turn notifications off, or to receive an immediate email, a daily digest or weekly digest.
### Describe the solution you'd like
It would useful to receive some additional information in the notifications about the data package, This would give data managers the option to evaluate whether it is worth to logging in to Yoda or not.
Some examples of additional information that could be included to the email notifications:
Group name
Category
Subcategory
Title of the data package
Email address of the submitter
Size of the data package
Date
Etc.
### Acceptance Criteria
The feature should allow group managers to receive detailed information about the data package without needing to log in to the system, and it should also provide the option to disable these detailed notifications if they're not wanted or needed.
Metadata error Custom license & Open data
State: open
Labels: consortium
Description: ### Is there an existing bug report for this?
I have searched the existing bug reports
### Current Behavior
Combining custom license with open data leads to an error from DataCite.
### Expected Behavior
Multiple options:
a warning or error message that it is better to add an open license (like CC-BY) to an open dataset
a warning before publishing
an option to specify an url with the custom license that can be used to populate the rightsURI field
### Steps to Reproduce
Combine the following options in Yoda default-3 metadata schema:
"Data_Access_Restriction": "Open - freely retrievable",
"License": "Custom"
Publish the collection, it will create the following fields in the Datacite JSON:
"rightsList": [
{
"rights": "Open - freely retrievable",
"rightsUri": "info:eu-repo/semantics/openAccess"
},
{
"rights": "Custom",
"rightsUri": "https://surf-data.irods.surfsara.nl:9443/vault-etk-testing/research-etk-testing[1762524484]" }
]
The "rightsUri" field will be populated with the Yoda web address for the Vault collection, which includes square brackets for the Unix epoch. This will lead to an error when trying to publish the dataset (tested at https://support.datacite.org/reference/post_dois):
"errors": [
{
"source": "rights', attribute 'rightsURI",
"title": "DOI prefix/suffix: 'https://surf-data.irods.surfsara.nl:9443/vault-etk-testing/research-etk-testing[1762524484]' is not a valid value of the atomic type 'xs:anyURI'. at line 18, column 0",
"uid": "prefix/suffix"
}
### Environment
- Yoda version v2.0.0
### Additional Context
Strangely enough, there has been at least one dataset published in the past, with the same square brackets in the rightsURI in the datacite JSON: https://publication.yoda.wur.nl/full/WUR01/BSY8ZN.html
Since then, Yoda has been upgraded but as far as I can see there were no changes at the Datacite side (both metadata v4.6).
Is there a validation step in Yoda built in for the Datacite metadata? In that case, would it be an option to include a validation for this?
If you think someone else would appreciate this newsletter, they can sign up.
If you don't want to get these emails any more, you can unsubscribe here.
Four Yaks were shaved in the making of this newsletter.