[ 
https://issues.apache.org/jira/browse/TEPHRA-223?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15877027#comment-15877027
 ] 

ASF GitHub Bot commented on TEPHRA-223:
---------------------------------------

Github user chtyim commented on a diff in the pull request:

    https://github.com/apache/incubator-tephra/pull/37#discussion_r102348469
  
    --- Diff: 
tephra-core/src/main/java/org/apache/tephra/TransactionManager.java ---
    @@ -1123,15 +1112,14 @@ private boolean doTruncateInvalidTxBefore(long 
time) throws InvalidTruncateTimeE
         }
         
         // Find all invalid transactions earlier than truncateWp
    -    Set<Long> toTruncate = Sets.newHashSet();
    -    for (long wp : invalid) {
    -      // invalid list is sorted, hence can stop as soon as we reach a wp 
>= truncateWp
    -      if (wp >= truncateWp) {
    -        break;
    +    LongSet toTruncate = new LongArraySet();
    +    for (long wp : invalidTxList.toRawList()) {
    --- End diff --
    
    Unfortunately using the normal for-each loop means there would be boxing. 
To avoid boxing, you have to use the iterator directly
    
    ```java
    LongIterator it = invalidTxList.toRawList().iterator();
    while (it.hasNext()) {
      long wp = it.nextLong();
      ...
    }
    ```


> Transactions started after a snapshot restore can have incorrect invalid 
> transaction list
> -----------------------------------------------------------------------------------------
>
>                 Key: TEPHRA-223
>                 URL: https://issues.apache.org/jira/browse/TEPHRA-223
>             Project: Tephra
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 0.5.0, 0.6.5, 0.7.0, 0.8.0-incubating, 0.9.0-incubating, 
> 0.10.0-incubating
>            Reporter: Poorna Chandra
>            Assignee: Poorna Chandra
>             Fix For: 0.12.0-incubating
>
>
> Transaction Manager uses two datastructures to manage the invalid list - a 
> {{List}} and an {{array}}. All updates to invalid list happen to the 
> {{List}}, and the list is then sorted and copied over to the {{array}}. This 
> is an optimization done so as to not sort the invalid list every time a new 
> transaction is created.
> However during a snapshot restore after the Transaction Manager starts up, 
> the invalid list gets correctly restored to the {{List}} but does not get 
> copied over to the {{array}}. This will lead to transactions started right 
> after a snapshot restore to have empty invalid list. This will make invalid 
> data to become visible to those transactions.
> Since the {{List}} still contains the right invalid list, any update to the 
> invalid list - like invalidating a transaction,  will restore the {{array}} 
> back to a good state.
> Also compactions will still remove invalid data as expected since new 
> snapshots are searialized using the {{List}}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to