Skip to main content
Solved

RemoveTrans repeatedly re-processes historical Removed loads – correct configuration?

  • September 29, 2026
  • 5 replies
  • 35 views

Forum|alt.badge.img+2

Hello IFS Community,

I would appreciate help from experienced IFS users, consultants and developers in reviewing the following RemoveTrans behavior and determining the correct configuration.

The mechanism described below appears to behave less like ordinary housekeeping and more like a self-amplifying feedback loop: historical records can be repeatedly re-qualified, new technical records are created from already processed loads, and some of those newly created records can later contribute to subsequent executions.

In practical terms, the behavior resembles a mailbomb-like feedback loop or self-amplifying process — not because anything malicious is happening, but because one execution can create additional technical records that increase the amount of work performed by future executions.

The objective of this post is to understand whether this behavior is expected by design and what the correct configuration should be to prevent repeated processing without affecting legitimate External Files housekeeping.

What the API appears to do

Ext_File_Trans_API.Remove_Ready_Trans uses a cursor based on:

EXT_FILE_LOG
EXT_FILE_LOAD_TAB
EXT_FILE_TEMPLATE_DIR_TAB

Records become eligible according to a condition equivalent to:

TRUNC(log_date) + remove_days <= SYSDATE

This means that REMOVE_DAYS defines an age threshold for qualification.

It is not, by itself, a retention policy for EXT_FILE_LOG, and an old log record is not automatically deleted simply because the configured age threshold has been reached.

The important behavior appears when:

REMOVE_ALL_LOAD_STATES = TRUE

With this setting, Remove_Ready_Trans sets:

remove_ok_ = 'TRUE'

without restricting processing to the normal state filter.

As a result, loads already in:

state 8 = Removed

can also enter the processing path.

With:

REMOVE_ALL_LOAD_STATES = FALSE

the code applies:

state IN ('4','7')

and state 8 / Removed is excluded.

Behavior when REMOVE_COMPLETE = FALSE

For an External File configuration using:

REMOVE_COMPLETE = FALSE

the effective processing path appears to be:

Ext_File_Trans_API.Remove_Ready_Trans
|
v
Ext_File_Trans_API.Remove_File_Trans(load_file_id, '8')
|
v
DELETE FROM Ext_File_Trans_Tab
WHERE load_file_id = ...
|
v
Ext_File_Load_API.Update_State(load_file_id, '8')
|
v
LOAD row remains;
its state is set to 8 / Removed
|
v
Update_State prepares a new LOG record
with LOG_DATE = SYSDATE
|
v
Ext_File_Log_API.New__(..., 'DO')
|
v
a new EXT_FILE_LOG_TAB record is inserted

Remove_File_Trans deletes the source EXT_FILE_TRANS_TAB rows and then calls Update_State.

Update_State updates the load state and prepares a new log record containing, among other values:

STATE_DB = 8
LOG_DATE = SYSDATE

It then calls:

Ext_File_Log_API.New__(..., 'DO')

which reaches the insert path and creates another EXT_FILE_LOG_TAB record.

Why the number of technical records can increase

A second important part of the mechanism is the cursor itself.

The cursor operates on individual EXT_FILE_LOG rows and does not appear to use:

DISTINCT LOAD_FILE_ID

Therefore, if one historical load has several qualifying log entries, the same LOAD_FILE_ID can appear in several cursor rows.

Each qualifying cursor row is processed independently.

For each qualifying row, the process can effectively:

1. call Remove_File_Trans for the same historical LOAD_FILE_ID,
2. update the same load to state 8 / Removed,
3. create another EXT_FILE_LOG record with LOG_DATE = SYSDATE,
4. create another technical output record in the current RemoveTrans load.

Remove_Ready_Trans also executes:

Ext_File_Trans_API.Insert_Record(newrec_)

for every qualifying cursor row.

The resulting behavior can therefore be represented as a time-based cycle:

historical LOG
|
| reaches REMOVE_DAYS threshold
v
qualifies for RemoveTrans
|
v
Removed load is accepted because
REMOVE_ALL_LOAD_STATES = TRUE
|
v
Update_State creates another LOG
with LOG_DATE = SYSDATE
|
v
older qualifying LOG remains
new LOG starts aging
|
| after REMOVE_DAYS
v
new LOG can also become eligible
|
+----------> cycle continues

This is not direct recursion inside a single procedure call.

It is a feedback cycle between subsequent scheduler executions.

Because older qualifying log records can remain while new log records are created, the population of qualifying EXT_FILE_LOG rows can increase over time.

The absence of DISTINCT LOAD_FILE_ID can additionally mean that several log records belonging to the same historical load produce several iterations during one execution.

Why this can happen even after the source transactional data is gone

There can be technical result records referring to historical loads for which the source transactional row count is already zero.

In other words, the original EXT_FILE_TRANS_TAB payload for a historical load may already be absent, while a technical RemoveTrans result record can still be generated for that load.

This suggests that a large volume of generated records does not necessarily represent new business documents.

It can instead represent repeated housekeeping activity involving historical loads whose original transactional payload has already been removed.

Why cleanup alone does not remove the mechanism

Cleaning accumulated records can reduce the current database footprint, but it does not change the qualification logic.

If:

REMOVE_ALL_LOAD_STATES = TRUE

remains active, historical loads already in state 8 / Removed can continue to enter the same processing path.

Additionally, Update_State(8) creates another log record with:

LOG_DATE = SYSDATE

while older qualifying log records may remain.

After the configured REMOVE_DAYS period, the newly created log can itself become eligible for processing.

Cleanup can therefore remove accumulated effects while leaving the underlying mechanism capable of recreating them.

Effect of changing TRUE to FALSE

With:

REMOVE_ALL_LOAD_STATES = FALSE

the API applies:

state IN ('4','7')

and:

8 = Removed

is no longer accepted by this processing path.

Already-Removed historical loads therefore stop re-entering this specific flow, while housekeeping for the permitted states can continue.

A controlled comparison showed a substantial difference in the amount of technical output generated between the TRUE and FALSE configurations.

Repeated executions with FALSE also showed substantially reduced processing time and technical output.

Separate path: REMOVE_COMPLETE = TRUE

There is a separate processing path for configurations using:

REMOVE_COMPLETE = TRUE

In that case Remove_Ready_Trans calls:

Ext_File_Load_API.Delete_File_Load

which can also invoke deletion of the associated TRANS and LOG records.

At large scale, this can result in very large DELETE operations and substantial UNDO/REDO consumption.

Errors such as:

ORA-30036: unable to extend segment in undo tablespace

can therefore occur as a consequence of the large delete workload.

Increasing UNDO can provide additional capacity for such operations, but it does not change the re-qualification mechanism described above.

Important operational clarification

Changing:

REMOVE_ALL_LOAD_STATES = TRUE

to:

REMOVE_ALL_LOAD_STATES = FALSE

does not itself execute a DELETE operation.

This parameter controls which load states are eligible for the RemoveTrans processing path.

With FALSE, already-processed loads in state 8 / Removed are excluded from this path, while housekeeping for the permitted states can still continue.

Actual deletion behavior occurs later and depends on the applicable processing branch and the REMOVE_COMPLETE configuration.

Therefore, based on the API logic, changing REMOVE_ALL_LOAD_STATES from TRUE to FALSE appears to restrict repeated qualification of historical Removed loads rather than directly remove business documents.

Question to IFS Community / IFS

Is the following combined behavior expected by design?

1. Remove_Ready_Trans uses EXT_FILE_LOG rows as cursor input.
2. There is no DISTINCT by LOAD_FILE_ID.
3. REMOVE_ALL_LOAD_STATES=TRUE accepts state 8 / Removed.
4. With REMOVE_COMPLETE=FALSE, TRANS is deleted but LOAD and LOG remain.
5. Update_State(8) creates a new EXT_FILE_LOG record with LOG_DATE=SYSDATE.
6. RemoveTrans creates one technical output record for every qualifying cursor row.
7. Older qualifying LOG records remain.
8. Newly created LOG records can become eligible again after REMOVE_DAYS.

This combination appears capable of repeatedly processing the same historical loads and increasing the number of technical records across successive scheduled executions.

Is REMOVE_ALL_LOAD_STATES=FALSE the recommended configuration when normal External Files housekeeping should remain active, but historical loads already in state Removed should no longer repeatedly enter RemoveTrans?

If not, what is the officially recommended configuration, correction or patch for preventing this self-amplifying processing cycle?

I checked the underlying API sequence against the supplied technical material: the state filtering, Remove_File_Trans → Update_State, creation of a new log with LOG_DATE=SYSDATE, lack of DISTINCT LOAD_FILE_ID, and the time-cycle are all supported by the captured source. 

Best answer by Romulus

Thanks, that explains why such a large amount of UNDO is required once the number of logs/transactions has already become very large, especially if RemoveTrans does not commit after each processed file_load_id.

However, this still appears to describe the consequence rather than the root cause. Repeated cleanup can provide temporary relief, but if the underlying mechanism continues to regenerate the same volume, the problem will return.

The test results indicate that the behaviour is strongly related to REMOVE_ALL_LOAD_STATES=TRUE. With this setting, already processed/removed loads appear to be considered again, which can lead to repeated processing and continued growth of External File data.

In comparison, tests with REMOVE_ALL_LOAD_STATES=FALSE indicate normal subsequent executions without generating millions of output records.

So the key question is:

What is the intended mechanism for preventing RemoveTrans from repeatedly processing loads that have already reached the Removed state?

Is this expected behaviour, a configuration issue, or is there a known fix/patch for this mechanism?

Increasing UNDO capacity or cleaning the accumulated data may mitigate the immediate effect, but it does not appear to remove the mechanism responsible for the recurring growth.

In other words, the large UNDO requirement appears to be a consequence of the accumulated volume, while the recurring regeneration of that volume is the issue that still needs to be explained.

5 replies

Forum|alt.badge.img+17
  • Superhero (Partner)
  • September 29, 2026

Hi ​@Romulus 

 

Ext File is a feature which gives me a lot of work. I have been reporting problems to IFS support since years. On and on the same problems. I’ve faced EXT_FILE*TAB that occupies few TB. Currently I have environment where 200GB(with additional table FNDCN_MESSAGE_BODY_TAB also affected by this) of 350GB are Ext File logs and transactions. Few months after Go Live.

 

 

 

Resize UNDO is the official answer from IFS heros


Forum|alt.badge.img+2
  • Author
  • Do Gooder
  • September 29, 2026

Thank you for the information and for the link.

This is exactly the part I am trying to understand.

If increasing the UNDO size is the official recommendation for handling a large cleanup, why should the underlying configuration remain unchanged if the API logic itself appears to continuously recreate the condition that causes the table to grow?

Analysis of the RemoveTrans API logic indicates that:

  • with REMOVE_ALL_LOAD_STATES=TRUE, the API allows all load states to be processed, including records already in Removed state (state = 8);

  • with REMOVE_COMPLETE=FALSE, the transaction rows are removed, but the load/log history remains;

  • the subsequent state update creates another log entry with a new timestamp;

  • as a result, the same historical load may qualify again during a later RemoveTrans execution.

When REMOVE_ALL_LOAD_STATES=FALSE, only the normal completed states (Transferred / FileCreated, states 4 and 7) are considered, so already Removed records are no longer repeatedly selected.

Changing this parameter from TRUE to FALSE appears to stop the repeated processing of historical Removed records. It does not clean up the existing data, but it prevents the same growth mechanism from continuing.

So the main question is:

Is there any functional or technical reason why REMOVE_ALL_LOAD_STATES should remain set to TRUE in such a configuration?

If FALSE prevents already removed records from being processed again, would it not be more appropriate to correct this parameter first and treat the existing oversized tables separately?

Increasing UNDO may help a large cleanup transaction to complete, but it appears to address the consequence rather than the mechanism causing the continued growth.

It would be very useful to know whether IFS considers TRUE the intended setting here, or whether FALSE is in fact the appropriate configuration when historical Removed loads should not be processed repeatedly.


Forum|alt.badge.img+2
  • Author
  • Do Gooder
  • September 29, 2026

The linked thread is very useful, but it seems to address mainly how to make a large cleanup executable, rather than what causes the data to keep growing in the first place.

Increasing UNDO can certainly be necessary when a very large amount of existing data has to be deleted. However, before dealing with the accumulated data, it seems important to eliminate the mechanism that is continuously creating or reprocessing it.

According to the standard RemoveTrans behaviour, REMOVE_ALL_LOAD_STATES=TRUE allows loads in all states to be handled, while FALSE limits processing to Transferred and FileCreated.

The interesting part is what happens when this is combined with REMOVE_COMPLETE=FALSE.

Based on the standard API logic, the RemoveTrans processing path can select a load that is already in Removed state when REMOVE_ALL_LOAD_STATES=TRUE. The transaction rows are removed, but because REMOVE_COMPLETE=FALSE, the load information remains. The subsequent state update to Removed also creates another log entry.

This raises a root-cause question rather than only a cleanup question:

Is the combination REMOVE_ALL_LOAD_STATES=TRUE and REMOVE_COMPLETE=FALSE actually intended for a recurring scheduled RemoveTrans job?

If an already Removed load can be selected again because all load states are allowed, then increasing UNDO helps only with cleaning the accumulated data. It does not prevent the same condition from being recreated afterwards.

With REMOVE_ALL_LOAD_STATES=FALSE, only Transferred and FileCreated loads are considered, so previously Removed loads are excluded from subsequent executions.

Therefore, before resizing UNDO or performing a large cleanup, would it not be necessary to first verify whether REMOVE_ALL_LOAD_STATES should actually be set to FALSE for this scenario?

If TRUE is the intended configuration, what part of the standard logic is expected to prevent already Removed loads from being processed repeatedly?

I am trying to understand whether this is:

  1. an incorrect parameter combination,

  2. an intended behaviour with another configuration requirement,

  3. or a problem in the standard RemoveTrans processing logic.

The cleanup itself is important, but identifying and stopping the mechanism that recreates the data seems necessary before cleaning the existing backlog.


Forum|alt.badge.img+17
  • Superhero (Partner)
  • September 29, 2026

Large undo is required beacasue there is a big amount of logs/transactions. There are lots of logs/transactions beacase RemoveTrans rotate logs, there is no commits after each removed file_load_id, etc...


Forum|alt.badge.img+2
  • Author
  • Do Gooder
  • Answer
  • September 29, 2026

Thanks, that explains why such a large amount of UNDO is required once the number of logs/transactions has already become very large, especially if RemoveTrans does not commit after each processed file_load_id.

However, this still appears to describe the consequence rather than the root cause. Repeated cleanup can provide temporary relief, but if the underlying mechanism continues to regenerate the same volume, the problem will return.

The test results indicate that the behaviour is strongly related to REMOVE_ALL_LOAD_STATES=TRUE. With this setting, already processed/removed loads appear to be considered again, which can lead to repeated processing and continued growth of External File data.

In comparison, tests with REMOVE_ALL_LOAD_STATES=FALSE indicate normal subsequent executions without generating millions of output records.

So the key question is:

What is the intended mechanism for preventing RemoveTrans from repeatedly processing loads that have already reached the Removed state?

Is this expected behaviour, a configuration issue, or is there a known fix/patch for this mechanism?

Increasing UNDO capacity or cleaning the accumulated data may mitigate the immediate effect, but it does not appear to remove the mechanism responsible for the recurring growth.

In other words, the large UNDO requirement appears to be a consequence of the accumulated volume, while the recurring regeneration of that volume is the issue that still needs to be explained.