Attempts to delete a bulk move content
job, a retention update job, a thumbnail generation job, or a custom
sweep job fails when the job has a large number of sweep result records
associated with it.
Large numbers of sweep results
can occur when a sweep job that is configured with the sweep mode
set to Preview is run and when the filter expression
and target class resolve to a large set of affected objects. Large
numbers of sweep results can also occur when the sweep job is configured
to record failures and the operation that is associated with the sweep
job generates a high percentage of errors.
Symptoms
The system fails to respond for several minutes or more
when you attempt to delete a sweep job, after which an error results.
If the operation is started from the
Content Platform Engine administration console,
the progress indicator remains on the screen for an extended period,
followed by an error window that signals that the operation failed.
The error window contains the following message:
FNRAC100BE
The object_name object was not deleted.
Explanation: You do not have the necessary permissions to delete this object.
User Response: Refresh the object and try again, or contain your user administrator to modify the object permissions.
Exception Details:
com.filenet.api.exception.EngineRuntimeException:
FNRCD0009E: DB_ERROR: The database access failed with the following error: ErrorCode -964,
Message 'DB2 SQL Error: SQLCODE=-964, SQLSTATE=57011, SQLERRMC=null, DRIVER=4.3.111'
Unable to delete object {7F9B0D66-AE60-4AE4-AB7E-098190BFCECF} in enum property SweepResults.
failedBatchItem=0 errorStack={
at com.filenet.engine.persist.PersisterBase.doDeletionAction(PersisterBase.java:2036)
at com.filenet.engine.persist.IndependentPersister.preDelete(IndependentPersister.java:1308)
at com.filenet.engine.persist.IndependentPersister.preExecuteChange(IndependentPersister.java:610)
at com.filenet.engine.persist.SubscribablePersister.preExecuteChange(SubscribablePersister.java:226)
at com.filenet.engine.persist.SweepPersister.preExecuteChange(SweepPersister.java:101)
at com.filenet.engine.persist.SweepJobPersister.preExecuteChange(SweepJobPersister.java:47)
... (remainder of stack trace truncated for brevity)
Causes
The lifetime of sweep result objects is dependent on the
parent sweep job object to which they belong. Thus, deleting a sweep
job object also requires deleting all related sweep result objects,
and all the deletions must occur within the context of a single transaction.
The application server transaction coordinator enforces a global time
limit for all transactions and terminates and rolls back any transaction
that runs longer than the established limit. Such timeouts can occur
when you delete a sweep job that has a large number of sweep result
objects. This results in the entire transaction being rolled back,
causing all deletions to fail. The definition of "large number" depends
on the setting of the global transaction time limit for the system
in question and its capacity, but a good bench mark figure is in the
range of 10,000 or more sweep results for a single sweep job.
Resolving the problem
The solution to this problem is to delete the sweep result
records in one or more separate operations before you delete the parent
sweep job. There are two possible approaches to this solution. The
first is to use the administration console to delete the sweep result
objects manually. This can be accomplished by navigating to the sweep
result tab for the sweep job object that you want to delete, selecting
a subset of the sweep result objects, and clicking
Delete.
Repeat this process until all the sweep result objects are deleted,
or until a sufficient number are deleted to allow the parent sweep
job to be deleted without exceeding the transaction timeout limit.
Deleting sweep result objects manually can be a long and tedious
process and is often not practical when there are many sweep result
objects to delete. An alternative is to use a disposal policy to delete
the sweep results.
Use the following settings when you create
the disposal policy:
- Target Class = Job Sweep Result
- Sweep mode = Normal
- Filter Expression = "ControllingObject = OBJECT('{BD4BE72E-C4F9-4F24-B8B5-F1627AEF6573}')"
The Globally Unique Identifier (GUID) that appears in
the previous example expression is for illustration purposes only.
It must be replaced by the unique identifier of the sweep job that
you intend to delete. You can get this identifier from the properties
tab of the sweep job you want to delete.
Important: Disposal
policies operate with elevated privileges, and extreme caution must
be exercised to avoid deleting objects unintentionally. An incorrect
setting for the target class or the filter expression might result
in accidentally deleting objects that you do not intend to delete.
After
the disposal policy completes at least one full sweep iteration and
the current processed object count is greater than or equal to the
number of sweep result objects, the sweep job can be deleted. The
disposal policy can also be deleted at this time.