Overview
- This document contains the results of the testing Bulk Edit of MARC and FOLIO Instance records by submitting list of identifiers for 100, 1000, 10 000, 100 000 records or triggering bulk edit by submitting the query
- Ramsons release on rcp1 environment on a non-ecs okapi environment (tenant fs09000000).
- Jira
PERF-1034
-
Getting issue details...
STATUS
Summary
- Bulk edits could be performed with .csv files of 100, 1000, 10 000, and 100 000 records; however, updating 100k records is very slow and can take up to 11 hours.
- Bulk edits could be performed by submitting the query but due to
MODFQMMGR-667
-
Getting issue details...
STATUS
it could be unsuccessful.
- Memory consumption for all modules shows a stable trend with periodical increasing and decreasing memory usage. No memory leaks are suspected.
- corresponded to the load and did not exceed 2.1%.
- Instance CPU Utilization did not exceed 13.5%
- DB CPU utilization was very high 99.7%.
- DB connections - up to 1146 on average.
- Database deadlocks were observed during the Bulk edit updating records step
MSEARCH-961
-
Getting issue details...
STATUS
Jiras
MSEARCH-961
-
Getting issue details...
STATUS
MODEXPW-560
-
Getting issue details...
STATUS
MODFQMMGR-667
-
Getting issue details...
STATUS
Test description
Test name | source | Number of records | Action | query-1 | query-2 |
---|
Scenario 1 | FOLIO | 100, 1000, 10 000, 100 000 | Add Action note: "Regular data cleanup." Mark the instance as Staff suppress
| from .csv file | from .csv file |
Scenario 2 | FOLIO | 2007 | Add Action note: "Regular data cleanup." Mark the instance as Staff suppress
| (instance.source == "FOLIO") AND (instance.format_names contains any (<format names supported in test environment>)) [computer -- online resource] | English (354) (instance.source == "folio") AND (instance.languages contains all (""))
|
Scenario 3 | MARC | 100, 1000, 10 000, 100 000 | Add 500 field with both identifiers empty and subfield “a” with the text “From the papers of the Smith family.” and subfield “5” set to “DLC”
| from .csv file | from .csv file |
Scenario 4 | MARC | 1148 | Add 500 field with both identifiers empty and subfield “a” with the text “From the papers of the Smith family.” and subfield “5” set to “DLC”
| (instance.source == "MARC") AND (instance.format_names contains any (<format names supported in test environment>)) [unmediated -- object] | Albanian (1055) (instance.source == "marc") AND (instance.languages contains all (""))
|
Scenario 5 | FOLIO & MARC | 100, 1000, 10 000, 100 000 | Suppress from discovery including option for holdings and items
| from .csv file | from .csv file |
Scenario 6 | FOLIO & MARC | 562 | Suppress from discovery including option for holdings and items
| (instance.format_names contains any (<format names supported in test environment>)) [audio -- other] | Georgian (1294) (instance.languages contains all (""))
|
Test Results
Test # | Source | file size | Upload Duration (hh:mm:ss) | Update Duration (hh:mm:ss) | Total time (hh:mm:ss) | Results |
---|
Scenario 1 | FOLIO | 100 | 00:00:12 | 00:00:28 | 00:00:40 | Completed |
FOLIO | 1000 | 00:01:22 | 00:03:05 | 00:04:27 | Completed |
FOLIO | 10 000 | 00:13:35 | 00:31:30 | 00:45:05 | Completed |
FOLIO | 100 000 | 02:21:51 | 05:56:30 | 08:18:21 | Completed |
Scenario 2 | FOLIO | 2166 (query-1) 388 (query-2) | 00:06:05 00:01:11 | 00:09:43 00:02:15 | 00:15:48 00:03:26 | query-1 Completed query-2 Completed |
Scenario 3 | MARC | 100 | 00:00:17 | 00:00:24 | 00:00:41 | Completed |
MARC | 1000 | 00:02:14 | 00:01:50 | 00:04:04 | Completed |
MARC | 10 000 | 00:22:21 | 00:32:52 | 00:55:13 | Completed |
MARC | 100 000 | 04:13:48 | 03:45:38 | 07:59:26 | Completed |
Scenario 4 | MARC | 1055 (query-2) | - | - | - | Test query-1 not finished in 2 hours Test query-2 not finished in 1 hour
MODFQMMGR-667
-
Getting issue details...
STATUS
|
Scenario 5 | FOLIO & MARC | 100 | 00:00:14 | 00:00:27 | 00:00:41 | Completed |
FOLIO & MARC | 1000 | 00:01:18 | 00:04:07 | 00:05:25 | Completed |
FOLIO & MARC | 10 000 | 00:17:13 | 00:53:30 | 01:10:43 | Completed |
FOLIO & MARC | 100 000 | 02:54:46 | 08:09:48 | 11:04:34 | Completed |
| FOLIO & MARC | 1294 (query-2) | - | - | - | Test query-1 not finished in 2 hours Test query-2 not finished in 1 hour
MODFQMMGR-667
-
Getting issue details...
STATUS
|
Scenario 1

scenario 5

Service CPU Utilization
Here we can see that the modules used 1.7% CPU
Scenario 1

All modules graph: We can see spikes in mod-bulk-operations and mod-source-record-storage due to manual service restart but average CPU Utilization for these 2 modules did not exceed 1%.

Scenario 5

Service Memory Utilization

No constantly growing trend is observed.

Scenario 5

DB CPU Utilization
Scenario 1
DB CPU on average was up to 99.7% while updating 100k records because updating is the process that uses data import and is very consuming in database CPU resources.

Scenario 5

DB Connections
Scenario 1 (almost the same for all of the tests)

5 (almost the same for all of the tests)

These database queries were observed for all of the scenarios.

Top SQL-queries
# | TOP 5 SQL statements |
---|
1 | WITH deleted_ids as (
DELETE
FROM fs09000000_mod_search.instance_contributor
WHERE instance_id IN ($1::uuid)
RETURNING contributor_id
)
UPDATE fs09000000_mod_search.contributor
SET last_updated_date = CURRENT_TIMESTAMP
WHERE id IN (SELECT * FROM deleted_ids)
|
2 | WITH cte AS (SELECT id,
name,
name_type_id,
authority_id,
last_updated_date
FROM fs09000000_mod_search.contributor
WHERE last_updated_date > $1
ORDER BY last_updated_date
)
SELECT c.id,
c.name,
c.name_type_id,
c.authority_id,
c.last_updated_date,
json_agg(
CASE
WHEN sub.instance_count
|
3 | call delete_old_marc_indexers_versions($1)
|
4 | SELECT fs09000000_mod_inventory_storage.count_estimate(?)
SELECT fs09000000_mod_inventory_storage.count_estimate('SELECT jsonb,id FROM fs09000000_mod_inventory_storage.service_point WHERE ((true) AND ( (get_tsvector(f_unaccent(service_point.jsonb->>''ecsRequestRouting'')) @@ tsquery_phrase(f_unaccent(''true''))) IS NOT TRUE)) AND (id=''3a7de149-f17d-4602-adfe-0b09bf8e884a'')')
|
5 | SELECT jsonb FROM fs09000000_mod_permissions.permissions
|
6 | INSERT INTO fs09000000_mod_search.instance (id, tenant_id, shared, is_bound_with, json)
VALUES ($1::uuid, $2, $3, $4, $5::jsonb)
ON CONFLICT (id)
DO UPDATE SET shared = EXCLUDED.shared,
tenant_id = EXCLUDED.tenant_id,
is_bound_with = EXCLUDED.is_bound_with,
json = EXCLUDED.json
|
Other RDS metrics and observations
During updating records from time to time database deadlocks were observed
Locking transactions:
SQL text for digest ID: -206532979961713955
WITH deleted_ids as (
DELETE
FROM fs09000000_mod_search.instance_contributor
WHERE instance_id IN ($1::uuid,$2::uuid)
RETURNING contributor_id
)
UPDATE fs09000000_mod_search.contributor
SET last_updated_date = CURRENT_TIMESTAMP
WHERE id IN (SELECT * FROM deleted_ids)
--------------------------------------with----------------------------------------------
INSERT INTO fs09000000_mod_search.contributor (id, name, name_type_id, authority_id)
VALUES ($1, $2, $3, $4),($5, $6, $7, $8)
ON CONFLICT (id) DO UPDATE SET last_updated_date = CURRENT_TIMESTAMP





Appendix
Infrastructure
PTF - environment Ramsons (rcp1)
Quesnelia modules memory and CPU parameters
Cluster Resources - rcp1-pvt (Thu Feb 06 08:00:39 UTC 2025) |
|
|
|
|
|
|
|
|
|
Module | Task Definition Revision | Module Version | Task Count | Mem Hard Limit | Mem Soft Limit | CPU Units | Xmx | Metaspace Size | Max Metaspace Size |
mod-remote-storage | 12 | /folio/mod-remote-storage:3.3.5 | 2 | 4920 | 4472 | 0 | 3960 | 512 | 512 |
mod-ncip | 9 | /folio/mod-ncip:1.15.6 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-finance-storage | 10 | /folio/mod-finance-storage:8.7.3 | 2 | 1024 | 896 | 0 | 700 | 88 | 128 |
mod-agreements | 12 | /folio/mod-agreements:7.1.5 | 2 | 1592 | 1488 | 0 | 0 | 0 | 0 |
mod-ebsconet | 11 | /folio/mod-ebsconet:2.3.1 | 2 | 1248 | 1024 | 0 | 700 | 128 | 256 |
mod-organizations | 9 | /folio/mod-organizations:2.0.0 | 2 | 1024 | 896 | 0 | 700 | 88 | 128 |
mod-consortia | 4 | /folio/mod-consortia:1.2.2 | 2 | 5136 | 4776 | 0 | 4416 | 512 | 1024 |
edge-sip2 | 10 | /folio/edge-sip2:3.3.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-settings | 10 | /folio/mod-settings:1.1.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-serials-management | 12 | /folio/mod-serials-management:1.1.3 | 2 | 2480 | 2312 | 0 | 1792 | 384 | 512 |
edge-dematic | 9 | /folio/edge-dematic:2.3.1 | 1 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-data-import | 10 | /folio/mod-data-import:3.2.4 | 1 | 2048 | 1844 | 0 | 1292 | 384 | 512 |
mod-search | 24 | /folio/mod-search:4.0.8 | 2 | 2592 | 2480 | 0 | 1440 | 512 | 1024 |
mod-inn-reach | 5 | /folio/mod-inn-reach:3.2.1-SNAPSHOT.102 | 2 | 3600 | 3240 | 0 | 2880 | 512 | 1024 |
mod-record-specifications | 18 | /folio/mod-record-specifications:1.0.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-tags | 9 | /folio/mod-tags:2.3.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-authtoken | 10 | /folio/mod-authtoken:2.16.1 | 2 | 1440 | 1152 | 0 | 922 | 88 | 128 |
edge-courses | 11 | /folio/edge-courses:1.5.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-notify | 9 | /folio/mod-notify:3.3.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-inventory-update | 9 | /folio/mod-inventory-update:4.0.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-configuration | 9 | /folio/mod-configuration:5.11.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-orders-storage | 10 | /folio/mod-orders-storage:13.8.3 | 2 | 1024 | 896 | 0 | 700 | 88 | 128 |
edge-caiasoft | 9 | /folio/edge-caiasoft:2.3.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-login-saml | 9 | /folio/mod-login-saml:2.9.3 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-erm-usage-harvester | 10 | /folio/mod-erm-usage-harvester:5.0.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-password-validator | 9 | /folio/mod-password-validator:3.3.0 | 2 | 1440 | 1298 | 0 | 768 | 384 | 512 |
mod-gobi | 9 | /folio/mod-gobi:2.9.0 | 2 | 1024 | 896 | 0 | 700 | 88 | 128 |
mod-licenses | 10 | /folio/mod-licenses:6.1.2 | 2 | 2480 | 2312 | 0 | 1792 | 384 | 512 |
edge-dcb | 10 | /folio/edge-dcb:1.2.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-bulk-operations | 13 | /folio/mod-bulk-operations:2.1.12 | 2 | 3072 | 2600 | 0 | 1536 | 384 | 512 |
mod-fqm-manager | 24 | /folio/mod-fqm-manager:3.0.10 | 2 | 3000 | 2600 | 0 | 2048 | 384 | 512 |
mod-graphql | 11 | /folio/mod-graphql:1.13.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-finance | 11 | /folio/mod-finance:5.0.1 | 2 | 1024 | 896 | 0 | 700 | 88 | 128 |
mod-erm-usage | 9 | /folio/mod-erm-usage:5.0.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-batch-print | 9 | /folio/mod-batch-print:1.2.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-tlr | 5 | /folio/mod-tlr:1.0.0-SNAPSHOT.8 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-lists | 19 | /folio/mod-lists:3.0.8 | 2 | 6000 | 2600 | 0 | 768 | 88 | 128 |
mod-copycat | 9 | /folio/mod-copycat:1.7.0 | 2 | 1024 | 512 | 0 | 768 | 88 | 128 |
mod-entities-links | 15 | /folio/mod-entities-links:3.1.3 | 2 | 2592 | 2480 | 0 | 1440 | 0 | 1024 |
mod-permissions | 20 | /folio/mod-permissions:6.6.1 | 2 | 1684 | 1544 | 0 | 1024 | 384 | 512 |
pub-edge | 7 | /folio/pub-edge:2023.06.14 | 2 | 1024 | 896 | 0 | 768 | 0 | 0 |
mod-orders | 12 | /folio/mod-orders:12.9.10 | 2 | 2048 | 1440 | 0 | 1024 | 384 | 512 |
edge-patron | 11 | /folio/edge-patron:5.2.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
edge-ncip | 9 | /folio/edge-ncip:1.10.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-marc-migrations | 31 | /folio/mod-marc-migrations:1.0.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
edge-inn-reach | 4 | /folio/edge-inn-reach:3.3.0-SNAPSHOT.69 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-users-bl | 10 | /folio/mod-users-bl:7.9.3 | 2 | 1440 | 1152 | 0 | 922 | 88 | 128 |
mod-oa | 6 | /folio/mod-oa:2.1.0-SNAPSHOT.66 | 2 | 2048 | 896 | 0 | 1800 | 88 | 512 |
mod-invoice | 11 | /folio/mod-invoice:5.9.2 | 2 | 1440 | 1152 | 0 | 922 | 88 | 128 |
mod-inventory-storage | 18 | /folio/mod-inventory-storage:28.1.0-SNAPSHOT.792 | 2 | 4096 | 3690 | 0 | 3076 | 512 | 1024 |
mod-user-import | 9 | /folio/mod-user-import:3.9.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-sender | 9 | /folio/mod-sender:1.13.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
edge-oai-pmh | 10 | /folio/edge-oai-pmh:2.10.0 | 2 | 1512 | 1360 | 0 | 1440 | 384 | 512 |
mod-data-export-worker | 12 | /folio/mod-data-export-worker:3.3.8 | 2 | 3072 | 2048 | 0 | 2048 | 384 | 512 |
mod-rtac | 9 | /folio/mod-rtac:3.7.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-circulation-storage | 12 | /folio/mod-circulation-storage:17.3.5 | 2 | 2880 | 2592 | 0 | 1814 | 384 | 512 |
mod-source-record-storage | 23 | /folio/mod-source-record-storage:5.9.8 | 2 | 5600 | 5000 | 0 | 3500 | 384 | 512 |
mod-calendar | 10 | /folio/mod-calendar:3.2.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-event-config | 9 | /folio/mod-event-config:2.8.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-courses | 9 | /folio/mod-courses:1.4.11 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-circulation-item | 9 | /folio/mod-circulation-item:1.1.0 | 2 | 1024 | 896 | 0 | 0 | 0 | 0 |
mod-inventory | 12 | /folio/mod-inventory:21.0.9 | 2 | 2880 | 2592 | 0 | 1814 | 384 | 512 |
mod-email | 11 | /folio/mod-email:1.18.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-requests-mediated | 13 | /folio/mod-requests-mediated:1.0.0-SNAPSHOT.4 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-di-converter-storage | 10 | /folio/mod-di-converter-storage:2.3.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-pubsub | 12 | /folio/mod-pubsub:2.15.4 | 2 | 1536 | 1440 | 0 | 922 | 384 | 512 |
mod-circulation | 12 | /folio/mod-circulation:24.3.11 | 2 | 2880 | 2592 | 0 | 1814 | 384 | 512 |
edge-orders | 9 | /folio/edge-orders:3.1.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
edge-rtac | 9 | /folio/edge-rtac:2.8.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-template-engine | 9 | /folio/mod-template-engine:1.21.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-users | 11 | /folio/mod-users:19.4.5 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-patron-blocks | 10 | /folio/mod-patron-blocks:1.11.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-audit | 11 | /folio/mod-audit:2.10.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
edge-fqm | 11 | /folio/edge-fqm:3.0.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-source-record-manager | 16 | /folio/mod-source-record-manager:3.9.7 | 2 | 5600 | 5000 | 0 | 3500 | 384 | 512 |
nginx-edge | 7 | /folio/nginx-edge:2023.06.14 | 2 | 1024 | 896 | 0 | 0 | 0 | 0 |
mod-quick-marc | 9 | /folio/mod-quick-marc:6.0.0 | 1 | 2288 | 2176 | 0 | 1664 | 384 | 512 |
nginx-okapi | 7 | /folio/nginx-okapi:2023.06.14 | 2 | 1024 | 896 | 0 | 0 | 0 | 0 |
okapi-b | 10 | /folio/okapi:6.1.1 | 3 | 2024 | 1440 | 0 | 1024 | 384 | 512 |
mod-feesfines | 10 | /folio/mod-feesfines:19.2.2 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-invoice-storage | 10 | /folio/mod-invoice-storage:5.9.1 | 2 | 1872 | 1536 | 0 | 1024 | 384 | 512 |
mod-reading-room | 10 | /folio/mod-reading-room:1.0.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-service-interaction | 11 | /folio/mod-service-interaction:4.1.1 | 2 | 2048 | 1844 | 0 | 1290 | 384 | 512 |
mod-dcb | 12 | /folio/mod-dcb:1.2.6 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-data-export | 14 | /folio/mod-data-export:5.1.6 | 1 | 2048 | 1844 | 0 | 0 | 0 | 0 |
mod-patron | 12 | /folio/mod-patron:6.2.6 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-oai-pmh | 11 | /folio/mod-oai-pmh:3.14.4 | 2 | 4096 | 3690 | 0 | 3076 | 384 | 512 |
edge-connexion | 9 | /folio/edge-connexion:1.3.1 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-notes | 9 | /folio/mod-notes:6.0.0 | 2 | 1024 | 896 | 0 | 952 | 384 | 512 |
mod-kb-ebsco-java | 9 | /folio/mod-kb-ebsco-java:5.0.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-login | 10 | /folio/mod-login:7.12.1 | 2 | 1440 | 1298 | 0 | 768 | 384 | 512 |
mod-organizations-storage | 9 | /folio/mod-organizations-storage:4.8.1 | 2 | 1024 | 896 | 0 | 700 | 88 | 128 |
mod-data-export-spring | 11 | /folio/mod-data-export-spring:3.4.3 | 1 | 2048 | 1844 | 0 | 1536 | 384 | 512 |
pub-okapi | 7 | /folio/pub-okapi:2023.06.14 | 2 | 1024 | 896 | 0 | 768 | 0 | 0 |
edge-erm | 8 | /folio/edge-erm:1.3.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
mod-eusage-reports | 9 | /folio/mod-eusage-reports:3.0.0 | 2 | 1024 | 896 | 0 | 768 | 88 | 128 |
Methodology/Approach
Test set
The script to prepare files is here.
- Manually tested all of the scenarios started on one tenant only:
- Trigger bulk edit by submitting a list of identifiers for 100, 1000, 10 000, and 100 000 records or run a query
- Wait until Bulk edit finds all matched records and record the startTime and endTime of the process from the response.
- Edit instances and start the second part of the bulk edit to commit the changes.
- Record the start time of committing changes from Headers
- Database preparation script after the test run required to restore Suppress from discovery and Staff suppress parameters.
Additional screenshots

