Bug #7367
disable TriggerTracker for TemporaryBuffer
100%
History
#1 Updated by Constantin Asofiei about 3 years ago
A session trigger can't be registered for a temp-table (I also double-checked in OE). This means that RecordBuffer.triggerTracker should have no meaning for a record in a temp-table. I've tried disabling it in RecordBuffer.setCurrentRecord, via:
Index: src/com/goldencode/p2j/persist/RecordBuffer.java
===================================================================
--- 7156a/src/com/goldencode/p2j/persist/RecordBuffer.java (revision 4090)
+++ 7156a/src/com/goldencode/p2j/persist/RecordBuffer.java (working copy)
@@ -11552,8 +11574,11 @@
Record oldRecord = this.currentRecord;
this.currentRecord = newCrtRecord;
- TriggerTracker.releaseTracker(oldRecord);
- this.triggerTracker = TriggerTracker.getTracker(this.currentRecord, dmoBufInterface, bufferManager);
+ if (!isTemporary())
+ {
+ TriggerTracker.releaseTracker(oldRecord);
+ this.triggerTracker = TriggerTracker.getTracker(this.currentRecord, dmoBufInterface, bufferManager);
+ }
updateNoUndoState();
@@ -11574,8 +11599,11 @@
this.undoable.checkUndoable(true);
}
- TriggerTracker.releaseTracker(currentRecord);
- this.triggerTracker = TriggerTracker.getTracker(newCrtRecord, dmoBufInterface, bufferManager);
+ if (!isTemporary())
+ {
+ TriggerTracker.releaseTracker(currentRecord);
+ this.triggerTracker = TriggerTracker.getTracker(newCrtRecord, dmoBufInterface, bufferManager);
+ }
this.currentRecord = newCrtRecord;
this.recordChanged = false; // invalidate CURRENT-CHANGED flag (see above)
But this causes regressions.
Is there some state in TriggerTracker which is not related to invoking session or schema triggers?
#2 Updated by Alexandru Lungu about 3 years ago
I recall seeing ASSIGN trigger checks for when we were executing copy-temp-table (fast or not). I don't know if they were in fact useless or not, but I know such checks are in place :)
I will take a look.
#3 Updated by Alexandru Lungu about 3 years ago
In setCurrentRecord, there is the following condition (line 11422):
targetBuffer.getTriggerTracker() != null && !targetBuffer.getTriggerTracker().isExecuting(DatabaseEventType.WRITE, currentRecord.primaryKey())If this condition is
true, doFlush = true; may execute.
- Before your change, this could happen (the trigger tracker is not null and no
DatabaseEventType.WRITEis executing) - After your change, this can't ever happen because the trigger tracker is always null
It seems to me that this should have been:
targetBuffer.getTriggerTracker() == null || !targetBuffer.getTriggerTracker().isExecuting(DatabaseEventType.WRITE, currentRecord.primaryKey())
instead. Note that there are two such conditionals there.
The same goes for RecordNursery.makeVisible.
#4 Updated by Ovidiu Maxiniuc about 3 years ago
Alex,
I do not think that is the good condition. If targetBuffer.getTriggerTracker() is null then the second operand of || is evaluated and a NPE will be thrown.
#5 Updated by Ovidiu Maxiniuc about 3 years ago
Ovidiu Maxiniuc wrote:
Alex,
I do not think that is the good condition. IftargetBuffer.getTriggerTracker()is null then the second operand of||is evaluated and a NPE will be thrown.
Sorry, you are right, I did not see you changed the != into ==, not only && into ||.
#6 Updated by Alexandru Lungu about 3 years ago
Ovidiu Maxiniuc wrote:
Sorry, you are right, I did not see you changed the
!=into==, not only&&into||.
Hmm, I edited my comment to use == null seconds after posting :) Sorry for the inconvenience
#7 Updated by Ovidiu Maxiniuc about 3 years ago
Alexandru Lungu wrote:
Hmm, I edited my comment to use
== nullseconds after posting :)
That make sense. I reviewed the small piece of code from the email notification in Thunderbird. Only after clicking submit I noticed the ==.
Sorry for the inconvenience
No problem 👍. It happened to me as well.
Back to our code. The change looks fine, but the two conditionals must be adapted. The doFlush will be always true for temp-tables. Also armCurrentChanged(); probably should not be called since FIND CURRENT is meaningless in this case since (no external change since the _temp database is context private).
#8 Updated by Alexandru Lungu about 3 years ago
Ovidiu Maxiniuc wrote:
Back to our code. The change looks fine, but the two conditionals must be adapted. The
doFlushwill be alwaystruefor temp-tables. AlsoarmCurrentChanged();probably should not be called sinceFIND CURRENTis meaningless in this case since (no external change since the _temp database is context private).
I see your point. However, I think triggerTracker is null only when currentRecord is null. In all of the previous changes, before reaching !targetBuffer.getTriggerTracker().isExecuting, .isAvailable or .getRecord() == null is checked. This means that doFlush was true only if the currentRecord was set, which implicitly meant that the trigger tracker was set.
#9 Updated by Alexandru Lungu about 3 years ago
#10 Updated by Radu Apetrii about 3 years ago
Alexandru Lungu wrote:
Radu, can you do the changes from #7367-1 and #7367-3 over 7026d and do an in-depth testing of a large customer application? I want to know if we can integrate this easily and fast or there are still obvious regressions to handle.
On it. I will get back with updates as quickly as possible.
#11 Updated by Radu Apetrii about 3 years ago
I've done some in-depth testing with a large customer application and I could not find any regression(s).
Since the changes were already on my computer, I committed them to 7026d, rev. 14578.
#12 Updated by Alexandru Lungu about 3 years ago
- Status changed from New to WIP
- % Done changed from 0 to 100
This reached 7156a. 7026d was rebased. Testing passed.
#13 Updated by Alexandru Lungu about 3 years ago
- Status changed from WIP to Review
#14 Updated by Alexandru Lungu about 3 years ago
- Status changed from Review to Test
Merged 7026d to trunk as rev. 14587.
#15 Updated by Ovidiu Maxiniuc about 3 years ago
Alexandru Lungu wrote:
Merged 7026d to trunk as rev. 14587.
That makes sense. I attempted to do a review of the 7026d branch on Friday evening but it was nowhere to be found. :)
#16 Updated by Alexandru Lungu about 3 years ago
- Assignee set to Alexandru Lungu
This can be closed.
#17 Updated by Greg Shah about 3 years ago
- Status changed from Test to Closed