Merge pull request #259 from corda/bogdan-fix-ENT-1322

ENT-1322: format new date object to work with SQLServer comparison be…
This commit is contained in:
bpaunescu 2018-01-02 10:53:34 +00:00 committed by GitHub
commit e3638f99e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,8 +6,9 @@ import net.corda.node.utilities.AffinityExecutor
import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.nodeapi.internal.persistence.CordaPersistence
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import org.hibernate.Session import org.hibernate.Session
import java.text.SimpleDateFormat
import java.time.Duration import java.time.Duration
import java.util.* import java.util.Date
import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
@ -35,6 +36,7 @@ class RunOnceService(private val database: CordaPersistence, private val machine
private val log = loggerFor<RunOnceService>() private val log = loggerFor<RunOnceService>()
private val running = AtomicBoolean(false) private val running = AtomicBoolean(false)
private val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
init { init {
if (waitInterval <= updateInterval) { if (waitInterval <= updateInterval) {
@ -128,25 +130,26 @@ class RunOnceService(private val database: CordaPersistence, private val machine
} }
private fun updateTimestamp(session: Session, mutualExclusion: MutualExclusion): Boolean { private fun updateTimestamp(session: Session, mutualExclusion: MutualExclusion): Boolean {
val minWaitTime = simpleDateFormat.format(Date(mutualExclusion.timestamp!!.time + waitInterval))
val query = session.createNativeQuery("UPDATE $TABLE SET $MACHINE_NAME = :machineName, $TIMESTAMP = CURRENT_TIMESTAMP, $PID = :pid " + val query = session.createNativeQuery("UPDATE $TABLE SET $MACHINE_NAME = :machineName, $TIMESTAMP = CURRENT_TIMESTAMP, $PID = :pid " +
"WHERE $ID = 'X' AND " + "WHERE $ID = 'X' AND " +
// we are master node // we are master node
"($MACHINE_NAME=:machineName) OR " + "($MACHINE_NAME = :machineName OR " +
// change master node // change master node
"($MACHINE_NAME != :machineName AND " + "($MACHINE_NAME != :machineName AND " +
// no one else has updated timestamp whilst we attempted this update // no one else has updated timestamp whilst we attempted this update
"$TIMESTAMP=:mutualExclusionTimestamp AND " + "$TIMESTAMP = CAST(:mutualExclusionTimestamp AS DATETIME) AND " +
// old timestamp // old timestamp
"CURRENT_TIMESTAMP>:waitTime)", MutualExclusion::class.java) "CURRENT_TIMESTAMP > CAST(:waitTime AS DATETIME)))", MutualExclusion::class.java)
query.unwrap(org.hibernate.SQLQuery::class.java).addSynchronizedEntityClass(MutualExclusion::class.java) query.unwrap(org.hibernate.SQLQuery::class.java).addSynchronizedEntityClass(MutualExclusion::class.java)
query.setParameter("pid", pid) query.setParameter("pid", pid)
query.setParameter("machineName", machineName) query.setParameter("machineName", machineName)
query.setParameter("mutualExclusionTimestamp", mutualExclusion.timestamp) query.setParameter("mutualExclusionTimestamp", mutualExclusion.timestamp)
query.setParameter("waitTime", Date(mutualExclusion.timestamp!!.time + waitInterval)) query.setParameter("waitTime", minWaitTime)
val returnValue = query.executeUpdate() val returnValue = query.executeUpdate()
if (returnValue != 1) { if (returnValue != 1) {