-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
KernelTransactionImplementationHandle.java
139 lines (123 loc) · 4.18 KB
/
KernelTransactionImplementationHandle.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* Copyright (c) 2002-2016 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.api;
import java.util.Optional;
import java.util.stream.Stream;
import org.neo4j.kernel.api.ExecutingQuery;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.KernelTransactionHandle;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.security.AccessMode;
/**
* A {@link KernelTransactionHandle} that wraps the given {@link KernelTransactionImplementation}.
* This handle knows that {@link KernelTransactionImplementation}s can be reused and represents a single logical
* transaction. This means that methods like {@link #markForTermination(Status)} can only terminate running
* transaction this handle was created for.
*/
class KernelTransactionImplementationHandle implements KernelTransactionHandle
{
private final long txReuseCount;
private final long lastTransactionIdWhenStarted;
private final long lastTransactionTimestampWhenStarted;
private final long localStartTime;
private final KernelTransactionImplementation tx;
private final AccessMode mode;
private final Status terminationReason;
KernelTransactionImplementationHandle( KernelTransactionImplementation tx )
{
this.txReuseCount = tx.getReuseCount();
this.lastTransactionIdWhenStarted = tx.lastTransactionIdWhenStarted();
this.lastTransactionTimestampWhenStarted = tx.lastTransactionTimestampWhenStarted();
this.localStartTime = tx.localStartTime();
this.mode = tx.mode();
this.terminationReason = tx.getReasonIfTerminated();
this.tx = tx;
}
@Override
public long lastTransactionIdWhenStarted()
{
return lastTransactionIdWhenStarted;
}
@Override
public long lastTransactionTimestampWhenStarted()
{
return lastTransactionTimestampWhenStarted;
}
@Override
public long localStartTime()
{
return localStartTime;
}
@Override
public boolean isOpen()
{
return tx.isOpen() && txReuseCount == tx.getReuseCount();
}
@Override
public boolean markForTermination( Status reason )
{
return tx.markForTermination( txReuseCount, reason );
}
@Override
public AccessMode mode()
{
return mode;
}
@Override
public Optional<Status> terminationReason()
{
return Optional.ofNullable( terminationReason );
}
@Override
public boolean isUnderlyingTransaction( KernelTransaction tx )
{
return this.tx == tx;
}
@Override
public Stream<ExecutingQuery> executingQueries()
{
KernelStatement statement = tx.tryAcquireStatement();
return statement == null ? Stream.empty() : statement.queryRegistration().executingQueries();
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
KernelTransactionImplementationHandle that = (KernelTransactionImplementationHandle) o;
return txReuseCount == that.txReuseCount && tx.equals( that.tx );
}
@Override
public int hashCode()
{
return 31 * (int) (txReuseCount ^ (txReuseCount >>> 32)) + tx.hashCode();
}
@Override
public String toString()
{
return "KernelTransactionImplementationHandle{txReuseCount=" + txReuseCount + ", tx=" + tx + "}";
}
}