@@ -18,6 +18,7 @@ import mu.KotlinLogging
18
18
import org.apache.ignite.Ignite
19
19
import org.apache.ignite.IgniteCache
20
20
import org.apache.ignite.Ignition
21
+ import org.modelix.kotlin.utils.ContextValue
21
22
import org.modelix.model.IKeyListener
22
23
import org.modelix.model.persistent.HashUtil
23
24
import java.io.File
@@ -29,14 +30,14 @@ import java.util.stream.Collectors
29
30
private val LOG = KotlinLogging .logger { }
30
31
31
32
class IgniteStoreClient (jdbcConfFile : File ? = null , inmemory : Boolean = false ) : IStoreClient, AutoCloseable {
32
- companion object {
33
- private val threadLocalPendingChangeMessages: ThreadLocal <PendingChangeMessages > = ThreadLocal ()
34
- }
35
33
36
34
private val ENTRY_CHANGED_TOPIC = " entryChanged"
37
- private var ignite: Ignite
35
+ private lateinit var ignite: Ignite
38
36
private val cache: IgniteCache <String , String ?>
39
37
private val changeNotifier = ChangeNotifier (this )
38
+ private val pendingChangeMessages = PendingChangeMessages {
39
+ ignite.message().send(ENTRY_CHANGED_TOPIC , it)
40
+ }
40
41
41
42
/* *
42
43
* Instantiate an IgniteStoreClient
@@ -113,7 +114,7 @@ class IgniteStoreClient(jdbcConfFile: File? = null, inmemory: Boolean = false) :
113
114
if (! silent) {
114
115
for (key in entries.keys) {
115
116
if (HashUtil .isSha256(key)) continue
116
- threadLocalPendingChangeMessages.get() .entryChanged(key)
117
+ pendingChangeMessages .entryChanged(key)
117
118
}
118
119
}
119
120
}
@@ -138,17 +139,10 @@ class IgniteStoreClient(jdbcConfFile: File? = null, inmemory: Boolean = false) :
138
139
val transactions = ignite.transactions()
139
140
if (transactions.tx() == null ) {
140
141
transactions.txStart().use { tx ->
141
- try {
142
- val pendingChangeMessages = PendingChangeMessages {
143
- ignite.message().send(ENTRY_CHANGED_TOPIC , it)
144
- }
145
- threadLocalPendingChangeMessages.set(pendingChangeMessages)
142
+ return pendingChangeMessages.runAndFlush {
146
143
val result = body()
147
144
tx.commit()
148
- pendingChangeMessages.flushChangeMessages()
149
- return result
150
- } finally {
151
- threadLocalPendingChangeMessages.remove()
145
+ result
152
146
}
153
147
}
154
148
} else {
@@ -167,19 +161,20 @@ class IgniteStoreClient(jdbcConfFile: File? = null, inmemory: Boolean = false) :
167
161
}
168
162
169
163
class PendingChangeMessages (private val notifier : (String ) -> Unit ) {
170
- private val pendingChangeMessages = Collections .synchronizedSet(HashSet <String >())
171
-
172
- @Synchronized
173
- fun flushChangeMessages () {
174
- for (pendingChangeMessage in pendingChangeMessages) {
175
- notifier(pendingChangeMessage)
164
+ private val pendingChangeMessages = ContextValue <MutableSet <String >>()
165
+
166
+ fun <R > runAndFlush (body : () -> R ): R {
167
+ val messages = HashSet <String >()
168
+ return pendingChangeMessages.computeWith(messages) {
169
+ val result = body()
170
+ messages.forEach { notifier(it) }
171
+ result
176
172
}
177
- pendingChangeMessages.clear()
178
173
}
179
174
180
- @Synchronized
181
175
fun entryChanged (key : String ) {
182
- pendingChangeMessages + = key
176
+ val messages = checkNotNull(pendingChangeMessages.getValueOrNull()) { " Only allowed inside PendingChangeMessages.runAndFlush" }
177
+ messages.add(key)
183
178
}
184
179
}
185
180
0 commit comments