Define a Type for Every Visible Logic Element

Why

In a distributed calculation, the master can switch workers to fat slave mode, where each worker persists its own results and returns an empty result set. Until that switch happens, every worker sends its full results back to the master through Redis. With large results or many concurrent jobs, this can exhaust Redis memory and cause the calculation to fail, surfacing as a Redis out-of-memory error rather than a logic problem.

The switch is gated on field metadata. A job cannot switch until every element of the row logic, excluding those with displayOptions != 0 in logic.json, has a type explicitly defined. If a type cannot be determined for any of the logic outputs, then the switch to Fat Slave is blocked for the whole job.

The Rule

Every visible logic element must have a Format Type defined (formatType in logic.json).

This applies even when the element usually returns a value. Conditional returns are the common trap:

Groovy
if (out.Cost && out.Margin) {
    return out.Cost * (1 + out.Margin)
}
return null

Affected Jobs

Price List, Live Price Grid and Calculation Grid running in distributed mode.

How to Detect

The master logs the blocking element once per batch, visible under Administration > Logs:

Cannot switch to FAT SLAVE mode as 1 metas aren't defined: {DCItemMatrix=[40369.PGIM] unknown - attribute40 - DC Item Details}

How to Fix

For each element reported, do one of the following:

  • Define its Format Type.

  • Set Display Mode to Never if it is an internal helper.

  • Remove it if its output is unused.

Then create a new Price List or Price Grid or Calculation Grid, since recalculating an existing one can keep the previously saved metadata.