Blog › ICP guides

OpenROAD developer on retainer: frame method RETURN without ROLLBACK, Ingres OpenROAD developer, CA OpenROAD developer on monthly retainer

October 9, 2026 · ~15 min read

An OpenROAD developer was maintaining a government benefits administration application at a county social services department running CA OpenROAD 6.2 on top of Ingres 10.0. The application served 50 concurrent benefits processors who reviewed and processed housing assistance, food support, and employment benefit claims across multiple program lines. A 4GL frame method named GetBenefitClaim in the BenefitAdmin OpenROAD application handled the workflow for a processor to fetch a pending benefit claim and place it under review: the method used a BYREF database access pattern to retrieve the BenefitClaims record for a given ClaimId, issued an UPDATE BenefitClaims SET Status = 'Under Review' WHERE ClaimId = :claim_id statement to mark the claim as being actively reviewed, which acquired an Ingres exclusive row lock on that BenefitClaims record for the duration of the open Ingres transaction, and then called the eligibility validation frame to verify that the claimant’s current documentation met the program’s eligibility requirements before committing the status change. When the eligibility validation frame returned a failure code — indicating that the claimant’s documentation was incomplete or that the claimant no longer met the income threshold for the program — the step at line 14 of GetBenefitClaim called CALLFRAME DisplayEligibilityError to display the eligibility failure dialog to the benefits processor, and then executed RETURN to exit the frame method and return control to the calling application frame. The developer who wrote the eligibility failure path understood that the DisplayEligibilityError frame would inform the processor and that the overall workflow would be cancelled. What was not accounted for was that RETURN in an OpenROAD 4GL frame method exits the method and returns control to the caller — but it does not commit or roll back any open Ingres transaction that was active when the method was executing. The UPDATE BenefitClaims statement at step 8 of GetBenefitClaim had acquired an Ingres exclusive row lock on the BenefitClaims record for ClaimId = 18472. After RETURN at step 14, the Ingres connection used by the OpenROAD application session continued to hold that exclusive row lock for the duration of the connection’s transaction. Other benefits processors attempting to update or review the same claim received Ingres error E_DM004D “Timeout on lock request” after the default 60-second lock timeout expired. Lock timeout errors per morning: 6–10, each requiring an Ingres DBA to kill the blocking session via ipm; 0 after ROLLBACK was added before every RETURN on validation failure paths in GetBenefitClaim.

The root cause was the relationship between OpenROAD’s 4GL frame method execution model and the lifetime of Ingres transaction locks held by the underlying Ingres database connection. OpenROAD’s architecture uses a persistent Ingres connection per OpenROAD application session: each benefits processor’s OpenROAD client session maintains a dedicated connection to the Ingres database server. When an OpenROAD 4GL frame method executes a database UPDATE statement, Ingres acquires row-level exclusive locks on the modified rows according to Ingres’s normal locking rules for the configured isolation level. In the default autocommit-off mode (which OpenROAD uses when executing multiple SQL statements within a logical unit of work), these row-level exclusive locks are held for the duration of the open Ingres transaction on that connection — until either a COMMIT is issued (releasing all locks and making changes permanent) or a ROLLBACK is issued (releasing all locks and discarding all changes). The RETURN statement in an OpenROAD 4GL frame method terminates the method, releases the method’s local 4GL variables, and returns the specified value to the calling frame or procedure. It has no interaction with the Ingres connection’s transaction state: it does not issue any SQL statement, does not commit or roll back any open transaction, and does not modify the Ingres connection’s lock holdings in any way. After RETURN exits GetBenefitClaim, the calling application frame receives the failure return code, the DisplayEligibilityError frame has already displayed the error dialog to the processor, and the processor’s workflow continues. But the Ingres connection used by that processor’s OpenROAD session is still holding an exclusive row lock on BenefitClaims record 18472 from the UPDATE at step 8 — invisible to the processor, invisible to the calling frame, and invisible to the application. The lock persists until the OpenROAD session’s Ingres connection is either committed, rolled back, or terminated.

The single-processor test invisibility follows the standard concurrent lock bug pattern but has an additional layer of invisibility specific to OpenROAD’s 4GL abstraction over the Ingres connection. The developer who wrote GetBenefitClaim tested the eligibility failure path on a development OpenROAD instance with a single benefits processor session. They called the frame method with a test claim that had incomplete income documentation, confirmed that the DisplayEligibilityError frame appeared with the correct eligibility failure message, and verified that the calling application frame handled the failure return code correctly — returning the processor to the claims queue without modifying the claim status. The Ingres connection used by the development session held the exclusive row lock on the test BenefitClaims record after the failed eligibility check, but since only one OpenROAD session was connected to the Ingres database during the development test, no other session attempted to UPDATE the same claim record, and no lock timeout occurred. Ingres’s default lock timeout of 60 seconds did not trigger during the test because the development session was terminated between test runs, releasing all locks at the connection level. In production with 50 concurrent benefits processors sharing the Ingres database, the collision became visible during morning processing peaks when multiple processors were working through the same program’s claims queue: one processor’s session held the lock on claim 18472 after an eligibility failure, and another processor attempting to review the same claim received E_DM004D after 60 seconds. The holding session was identified only by the Ingres DBA using ipm to inspect active sessions and their lock holdings.

OpenROAD: the 4GL RAD framework built on Ingres for government, banking, and utilities applications

OpenROAD is a fourth-generation language (4GL) rapid application development (RAD) tool that was built on top of the Ingres relational database management system and designed specifically for developing large-scale, multi-user client-server database applications. Ingres itself was one of the earliest commercial relational database systems: the Interactive Graphics and Retrieval System (INGRES) was developed at the University of California Berkeley in the early 1970s by Michael Stonebraker and Eugene Wong, commercialized by Relational Technology Inc. (RTI) in 1980, and later sold to Ingres Corporation and then to Computer Associates (CA) in 1994. CA marketed Ingres and OpenROAD as an integrated platform for government and financial services applications through the 1990s and early 2000s.

OpenROAD was developed originally by Relational Technology Inc. as “INGRES/4GL” and “INGRES/Windows4GL” in the late 1980s, providing a forms-based RAD tool that allowed developers to build client-server applications on Ingres without writing C code. Under Computer Associates, the product was renamed OpenROAD and significantly expanded: OpenROAD gained an object-oriented 4GL language (OpenROAD 4GL), an application component (AppComponent) architecture for building reusable UI and business logic modules, and connectivity to non-Ingres databases via ODBC. CA OpenROAD 5.0 (released in the early 2000s) and CA OpenROAD 6.2 (released around 2010) introduced thin-client and web-client deployment models, allowing OpenROAD applications built for Windows client-server to be deployed through a browser or terminal server without rewriting the 4GL application logic. Actian Corporation, which acquired the Ingres product line from CA in 2011, continued OpenROAD development as Actian OpenROAD 6.15 and 6.20, primarily targeting the substantial installed base of government, banking, utilities, and insurance organizations that had built and continue to operate large-scale OpenROAD applications for case management, benefits administration, claims processing, and financial management.

The installed base of OpenROAD applications in government is substantial and geographically concentrated: UK local government (county councils, district councils, unitary authorities), Australian state government departments (social services, transport, land registry), Belgian and Dutch government agencies, US state and county government, and European utilities and financial services firms built large-scale OpenROAD applications on CA Ingres and CA OpenROAD through the 1990s and 2000s. These applications are characterized by high concurrency (50–500 concurrent users in large departments), complex multi-table transaction logic (benefits eligibility across multiple program rules, claims processing with audit trail requirements, case management with regulatory timeline enforcement), and long operational lifetimes — many OpenROAD applications that were deployed in the late 1990s and early 2000s continue to be the primary system of record for their departments, maintained by a small team of OpenROAD and Ingres specialists on retainer. The developer pool for OpenROAD is small and aging, which means that OpenROAD retainer developers with deep 4GL and Ingres expertise are rare and command premium rates.

OpenROAD 4GL transaction management: COMMIT, ROLLBACK, and Ingres lock lifetime in frame methods

OpenROAD’s 4GL frame methods execute SQL statements against the underlying Ingres connection using the OpenROAD SQL gateway, which maps OpenROAD 4GL database access operations (BYREF record access, direct SQL statements via the DATABASE block or INQUIRE_INGRES) to native Ingres SQL. Transaction management in OpenROAD is explicit: the developer is responsible for issuing COMMIT to commit a unit of work and release all row-level locks, or ROLLBACK to discard changes and release all row-level locks, before any exit from a frame method that executed database modifications within an open transaction. The key OpenROAD transaction management commands in 4GL are: COMMIT ends the current Ingres transaction, commits all pending changes, and releases all row-level locks acquired since the last COMMIT or ROLLBACK; ROLLBACK ends the current Ingres transaction, discards all pending changes, and releases all row-level locks; the COMMIT WORK and ROLLBACK WORK SQL variants (within a DATABASE block) are equivalent. RETURN in an OpenROAD 4GL frame method exits the method and returns a value to the caller — it has no effect on the Ingres transaction state or on any active row-level locks. After RETURN, the Ingres connection continues to hold whatever transaction state and row-level locks it had when RETURN was executed.

The GetBenefitClaim frame method had three RETURN statements within the transaction scope that lacked ROLLBACK, not one. The developer who identified the eligibility failure path at step 14 as the lock-hold bug fixed it by adding ROLLBACK before RETURN at step 14. A thorough audit of the full frame method revealed two additional RETURN paths that also lacked ROLLBACK: the documentation completeness check at step 19 (which called RETURN after determining that required supporting documents were not on file, leaving the BenefitClaims row lock held), and the policy expiry check at step 24 (which called RETURN after determining that the program’s policy period had expired for the claim date, leaving the lock held). All three failure paths were logically correct in their intent — each correctly identified a reason to reject the claim review — but each left the Ingres row lock held after exiting the frame method. The correct fix for all three paths: ROLLBACK added immediately before every RETURN that exits the frame method while an Ingres row lock might be held, or (the preferred pattern for frame methods with many exit paths) a structured error handling block that calls ROLLBACK as the first action before any RETURN on any failure path.

Diagnosing an OpenROAD Ingres transaction lock hold requires querying Ingres’s lock management system using the Ingres Performance Monitor (ipm) utility or the Ingres locking system catalog. ipm is the interactive Ingres performance monitoring tool that shows active sessions, their current transaction state, and all active lock holdings: running ipm on the Ingres server and navigating to the Lock Detail screen shows the session ID of the holding connection, the database name, the lock granularity (row-level, page-level, or table-level), the lock mode (X for exclusive, S for shared), the lock duration, and the session IDs of any waiting sessions that are blocked by the holding lock. In the GetBenefitClaim incident, ipm showed: session OPENROAD_APP01, database BenefitAdmin, lock mode X on BenefitClaims row with key ClaimId = 18472, duration 8 minutes; sessions OPENROAD_APP03 and OPENROAD_APP07 waiting on the same row with lock mode X, status WAITING. Cross-referencing the session ID OPENROAD_APP01 with the OpenROAD application server log identified the processor username and the last frame method accessed by that session, confirming GetBenefitClaim as the holding frame. The resolution at the time: the Ingres DBA killed session OPENROAD_APP01 via ipm, releasing the lock and allowing OPENROAD_APP03 and OPENROAD_APP07 to proceed. The permanent fix: ROLLBACK added to all three failure paths in GetBenefitClaim.

Typical OpenROAD developer retainer work and what it looks like in a work log

Ingres transaction lock not rolled back on RETURN validation failure is the canonical OpenROAD invisible production lock bug for 4GL frame methods that perform database UPDATE operations or BYREF record modifications with multi-path validation logic. It appears in the work logs of OpenROAD retainer engagements for government benefits administration, insurance claims processing, case management, financial management, and grant administration systems built on CA OpenROAD 5.x and 6.x. The work log entry that makes this diagnosable: “CA OpenROAD 6.2 / Ingres 10.0; application BenefitAdmin; frame method GetBenefitClaim; Ingres table BenefitClaims, key ClaimId = 18472; UPDATE BenefitClaims SET Status = 'Under Review' WHERE ClaimId = :claim_id at step 8 (Ingres exclusive row lock acquired on BenefitClaims ClaimId 18472); eligibility failure path at step 14: CALLFRAME DisplayEligibilityError; RETURN — RETURN without ROLLBACK; Ingres lock diagnostic (ipm): session OPENROAD_APP01, database BenefitAdmin, lock mode X on BenefitClaims row ClaimId 18472, duration 8 min; blocked sessions OPENROAD_APP03 and OPENROAD_APP07 waiting on same row, status WAITING; E_DM004D after 60-second timeout; lock timeout errors per morning before fix: 6–10 (each requiring Ingres DBA to kill blocking session via ipm); fix: ROLLBACK added before RETURN at step 14; full frame method audited — 2 additional RETURN paths without ROLLBACK found: documentation check at step 19 and policy expiry check at step 24 — both fixed; lock timeout errors per morning after fix: 0; 3.5h.”

OpenROAD 4GL frame method development is the routine day-to-day OpenROAD retainer task for government and financial services clients who have grown their OpenROAD application incrementally and now need new screens, workflow logic, and reporting capabilities to support new program requirements or regulatory changes. A common engagement for a UK county council: the housing benefits team needs a new frame to support a new housing emergency assessment pathway added by a national policy change. The retainer developer creates a new OpenROAD 4GL frame, wires the new pathway’s database operations to the Ingres HousingClaims table (including the correct COMMIT and ROLLBACK on all success and failure paths), integrates the new frame into the existing navigation structure, and tests the concurrent update behavior with two test sessions to confirm no lock holds. Work log: “CA OpenROAD 6.2 / Ingres 10.0; application HousingAdmin; new frame EmergencyAssessment for housing emergency pathway; database operations: INSERT HousingClaims (acquires shared table lock during INSERT), UPDATE HousingClaims SET Priority = 'Emergency' (acquires exclusive row lock) — COMMIT on success, ROLLBACK on all failure paths; 3 failure paths identified (eligibility, income threshold, property status) — ROLLBACK confirmed on all 3; concurrent test: 2 test sessions, both EmergencyAssessment and existing ClaimReview frame, no lock contention observed; integration into navigation menu completed; 6h.”

OpenROAD version migration is the highest-investment OpenROAD retainer engagement for government clients running CA OpenROAD 4.x applications who need to move to Actian OpenROAD 6.15 for continued OS compatibility and web client deployment. The migration assessment covers: 4GL syntax audit (identifying deprecated OpenROAD 4.x syntax that OpenROAD 6.x’s 4GL compiler rejects or handles differently, particularly around BYREF record access patterns and error handling methods); AppComponent API changes (reviewing all AppComponent class instantiations for API differences between OpenROAD 4.x and 6.x); transaction rollback audit (the migration is the correct moment to audit all frame methods that perform UPDATE operations for missing ROLLBACK on failure paths, fixing any that are found); and the Ingres backend upgrade (confirming compatibility between the current Ingres version and Actian OpenROAD 6.15, and applying any Ingres configuration changes needed for the new OpenROAD version’s connection pooling and session management). Work log: “CA OpenROAD 4.2 → Actian OpenROAD 6.15 migration; application BenefitAdmin; frame inventory: 94 frames, 28 procedures, 15 AppComponent classes; deprecated syntax audit: 6 frames using deprecated BYREF syntax updated to OpenROAD 6.x pattern; AppComponent API changes: 3 classes updated for changed property access API; transaction rollback audit: 94 frames reviewed for ROLLBACK on all UPDATE paths; 11 frames found with RETURN paths lacking ROLLBACK — all fixed (including GetBenefitClaim from prior production incident); Ingres 10.0 → Ingres 10.2 upgrade applied; OpenROAD 6.15 compatibility test: all 94 frames exercised against production data snapshot; 3 minor UI differences corrected; migration completed; 38h across 6 sessions.”

Track OpenROAD developer retainer hours without the status emails

When a 3.5-hour investigation traces 6–10 Ingres E_DM004D lock timeout errors per morning to a GetBenefitClaim frame method that issues UPDATE BenefitClaims SET Status = 'Under Review' and then exits via RETURN on the eligibility validation failure path without issuing ROLLBACK — leaving the Ingres exclusive row lock on the BenefitClaims record held for the connection transaction lifetime, blocking concurrent benefits processors with 60-second timeouts — the work log must name the frame method, the Ingres table and row key, the RETURN path that lacked ROLLBACK, the ipm lock diagnostic evidence, and the timeout rate before and after the fix. HourTab gives your OpenROAD retainer client a public dashboard URL they can bookmark: hours used, hours remaining, and a work log naming the missing ROLLBACK on the failure branch. No client login. No status emails. CSV in, URL out.

See HourTab pricing →

How HourTab tracks OpenROAD developer retainer hours

OpenROAD Ingres transaction lock hold bugs caused by ROLLBACK missing on RETURN validation failure paths within 4GL frame methods are invisible in single-user development testing by the same mechanism that makes all concurrent database lock bugs invisible when only one user session exercises the code at a time. The developer who writes GetBenefitClaim tests the eligibility failure path with a single OpenROAD session on the development Ingres instance: they call the frame method with a test claim that has incomplete documentation, confirm that the eligibility failure dialog appears correctly, and verify that the calling application frame handles the failure return code correctly. The Ingres connection used by the development session holds the exclusive row lock on the test BenefitClaims record after the failed eligibility check, but since only one OpenROAD session is connected to the development Ingres database, no other session attempts to UPDATE the same claim record, and no E_DM004D timeout occurs. The Ingres ipm tool would show the exclusive row lock if queried, but the developer never queries ipm during the test because there is no visible symptom to prompt a diagnostic session. In production with 50 concurrent benefits processors sharing the Ingres database, the collision is visible only when two processors work on related claims within the lock hold window: one processor’s session holding the lock on claim 18472 after an eligibility failure, and another processor attempting to review or UPDATE the same claim.

The work log entry that makes OpenROAD lock work auditable must name every element of the causal chain: the OpenROAD version, the Ingres version, the application name, the frame method name, the Ingres table and row key, the UPDATE statement, the RETURN path that lacked ROLLBACK, the Ingres ipm lock diagnostic evidence (session ID, database name, lock mode, lock granularity, duration, blocked sessions), the E_DM004D timeout frequency before and after the fix, and the audit result for additional unprotected RETURN paths in the same frame method. A log that says “fixed OpenROAD locking issue, 3.5h” is not auditable to a social services IT manager, a county council programme director, or a central government IT auditor reviewing a benefits administration system change record. A log that names the frame method, the Ingres ipm evidence, the specific RETURN statement that lacked ROLLBACK, and the before/after timeout rate is auditable, defensible, and builds the trust that sustains a long-term OpenROAD retainer relationship in public sector environments where change control, audit trail, and incident reporting requirements are strict. HourTab gives OpenROAD developers a public retainer-hours URL they send to clients — UK local government, Australian state government, Belgian and Dutch government agencies, US county and state government departments, utilities, and insurance organizations that run large-scale OpenROAD benefits, case management, claims, and financial management systems on CA Ingres and CA/Actian OpenROAD and maintain them with an OpenROAD specialist on monthly retainer.

The broader context for OpenROAD retainer billing is that the RETURN without ROLLBACK pattern in OpenROAD 4GL is the OpenROAD instantiation of the universal principle that every platform requiring explicit transaction management demands that the developer pair every transaction open with a transaction close on every exit path. Ingres developer retainers cover the equivalent pattern at the Ingres stored procedure level: a database procedure with BEGIN TRANSACTION + UPDATE that exits via RETURN without ROLLBACK on the validation failure path, leaving the Ingres exclusive row lock held — same invisible single-user test, same E_DM004D timeout in production. Progress OpenEdge ABL developer retainers cover the equivalent in Progress: a stored procedure or 4GL block that acquires an exclusive record lock with FIND FIRST EXCLUSIVE-LOCK and exits without RELEASE or transaction end on the failure path — same class of invisible explicit transaction management bug. Natural developer retainers cover the equivalent in Software AG Natural with Adabas: a Natural subroutine holding an Adabas record in a hold queue without issuing END TRANSACTION or BACKOUT TRANSACTION on the failure path — same pattern, different platform.

FAQ: OpenROAD developer retainers

What does an OpenROAD developer on retainer typically do?

An OpenROAD developer on monthly retainer covers Ingres transaction rollback audits (reviewing all 4GL frame methods performing UPDATE operations for ROLLBACK on every RETURN failure path); Ingres lock timeout diagnosis (using ipm and the Ingres lock log to identify holding sessions and frame methods); OpenROAD 4GL frame method development (new frames, procedure methods, AppComponent classes, BYREF record access patterns, UI event handling); OpenROAD version migration (4.x to CA 6.2 or Actian 6.15 — deprecated syntax, AppComponent API changes, transaction audit, Ingres backend upgrade); and government, banking, utilities, and insurance vertical-market application maintenance for Ingres-backed OpenROAD systems.

What OpenROAD Ingres lock debugging work is most commonly underlogged?

Ingres transaction lock hold bugs caused by ROLLBACK missing on RETURN validation failure paths within 4GL frame methods are the most systematically underlogged OpenROAD retainer work. The pattern: frame method issues UPDATE (Ingres exclusive row lock acquired); developer tests with single session; production validation failure causes RETURN without ROLLBACK; Ingres row lock held for connection transaction lifetime; concurrent processors receive E_DM004D after 60-second timeout. The work log must name the frame method, the Ingres table and row key, the RETURN path lacking ROLLBACK, the ipm lock diagnostic evidence, and the timeout rate before and after the fix.

What are typical OpenROAD developer retainer rates?

Entry-level OpenROAD developers with experience in basic OpenROAD 4GL frame method syntax, form layout, and basic Ingres SQL typically bill at $55 to $90 per hour. Mid-level OpenROAD developers with experience in OpenROAD BYREF record access, Ingres transaction management (COMMIT, ROLLBACK), AppComponent class architecture, and Ingres lock diagnostic tooling (ipm) typically bill at $80 to $135 per hour. Senior OpenROAD developers with deep knowledge of OpenROAD’s client-server architecture, version migration (4.x to 6.x), Ingres performance tuning, and government or banking vertical-market OpenROAD application architecture typically bill at $120 to $195 per hour. Monthly retainer ranges: $2,000 to $3,500/month for advisory and transaction audits; $3,500 to $6,500/month for active OpenROAD maintenance and Ingres administration support.

What should an OpenROAD developer retainer agreement include?

An OpenROAD developer retainer agreement should specify: OpenROAD version (CA 5.x, CA 6.2, or Actian 6.15/6.20 — 4GL syntax and AppComponent API differ); Ingres backend version (r3, 10.0, 10.1, 10.2, or Actian X — lock diagnostic tools differ); whether the retainer developer has access to all 4GL frame method source for methods performing UPDATE operations (necessary for the transaction rollback audit); whether the retainer covers Ingres lock diagnostic work (access to ipm and the Ingres lock log); whether the retainer covers OpenROAD version migration scoping; and the deployment architecture (2-tier Windows client-server vs. 3-tier OpenROAD application server with Thin Client or Web Client).

How should OpenROAD developer retainer hours be logged?

Log each OpenROAD retainer session with OpenROAD version, Ingres version, application name, frame method name, Ingres table, specific issue, and before/after metric. For Ingres transaction lock not rolled back on RETURN: OpenROAD version (CA 6.2), Ingres version (10.0), application (BenefitAdmin), frame method (GetBenefitClaim), Ingres table (BenefitClaims, key ClaimId = 18472), UPDATE statement (UPDATE BenefitClaims SET Status = 'Under Review' WHERE ClaimId = :claim_id — Ingres exclusive row lock), RETURN path lacking ROLLBACK (eligibility check at step 14: CALLFRAME DisplayEligibilityError; RETURN without ROLLBACK), ipm diagnostic (session OPENROAD_APP01, database BenefitAdmin, lock mode X on BenefitClaims row ClaimId 18472, duration 8 min; blocked sessions OPENROAD_APP03 and OPENROAD_APP07, status WAITING; E_DM004D after 60s), timeout errors per morning before fix (6–10), fix (ROLLBACK before RETURN at step 14; 2 additional paths fixed at steps 19 and 24), timeout errors after fix (0), hours (3.5h). For version migration: source/target version, frame count, deprecated syntax fixed, transaction audit results, hours.