@@ -482,6 +482,7 @@ public static protobuf.Trade.TradePeriodState toProtoMessage(Trade.TradePeriodSt
482
482
private long lockTime ;
483
483
@ Setter
484
484
private long startTime ; // added for haveno
485
+ private final Object startTimeLock = new Object ();
485
486
@ Getter
486
487
@ Nullable
487
488
private RefundResultState refundResultState = RefundResultState .UNDEFINED_REFUND_RESULT ;
@@ -2334,28 +2335,30 @@ public Volume getVolume() {
2334
2335
}
2335
2336
2336
2337
public void maybeUpdateTradePeriod () {
2337
- if (startTime > 0 ) return ; // already set
2338
- if (getTakeOfferDate () == null ) return ; // trade not started yet
2339
- if (!isDepositsFinalized ()) return ; // deposits not finalized yet
2338
+ synchronized (startTimeLock ) {
2339
+ if (startTime > 0 ) return ; // already set
2340
+ if (getTakeOfferDate () == null ) return ; // trade not started yet
2341
+ if (!isDepositsFinalized ()) return ; // deposits not finalized yet
2340
2342
2341
- long now = System .currentTimeMillis ();
2342
- long tradeTime = getTakeOfferDate ().getTime ();
2343
- MoneroDaemon monerod = xmrWalletService .getMonerod ();
2344
- if (monerod == null ) throw new RuntimeException ("Cannot set start time for trade " + getId () + " because it has no connection to monerod" );
2343
+ long now = System .currentTimeMillis ();
2344
+ long tradeTime = getTakeOfferDate ().getTime ();
2345
+ MoneroDaemon monerod = xmrWalletService .getMonerod ();
2346
+ if (monerod == null ) throw new RuntimeException ("Cannot set start time for trade " + getId () + " because it has no connection to monerod" );
2345
2347
2346
- // get finalize time of last deposit tx
2347
- long finalizeHeight = getDepositsFinalizedHeight ();
2348
- long finalizeTime = monerod .getBlockByHeight (finalizeHeight ).getTimestamp () * 1000 ;
2348
+ // get finalize time of last deposit tx
2349
+ long finalizeHeight = getDepositsFinalizedHeight ();
2350
+ long finalizeTime = monerod .getBlockByHeight (finalizeHeight ).getTimestamp () * 1000 ;
2349
2351
2350
- // If block date is in future (Date in blocks can be off by +/- 2 hours) we use our current date.
2351
- // If block date is earlier than our trade date we use our trade date.
2352
- if (finalizeTime > now )
2353
- startTime = now ;
2354
- else
2355
- startTime = Math .max (finalizeTime , tradeTime );
2352
+ // If block date is in future (Date in blocks can be off by +/- 2 hours) we use our current date.
2353
+ // If block date is earlier than our trade date we use our trade date.
2354
+ if (finalizeTime > now )
2355
+ startTime = now ;
2356
+ else
2357
+ startTime = Math .max (finalizeTime , tradeTime );
2356
2358
2357
- log .debug ("We set the start for the trade period to {}. Trade started at: {}. Block got mined at: {}" ,
2358
- new Date (startTime ), new Date (tradeTime ), new Date (finalizeTime ));
2359
+ log .debug ("We set the start for the trade period to {}. Trade started at: {}. Block got mined at: {}" ,
2360
+ new Date (startTime ), new Date (tradeTime ), new Date (finalizeTime ));
2361
+ }
2359
2362
}
2360
2363
2361
2364
private long getDepositsFinalizedHeight () {
@@ -2386,7 +2389,9 @@ public Date getStartDate() {
2386
2389
* Returns the current time until the deposits are finalized.
2387
2390
*/
2388
2391
private long getEffectiveStartTime () {
2389
- return startTime > 0 ? startTime : System .currentTimeMillis ();
2392
+ synchronized (startTimeLock ) {
2393
+ return startTime > 0 ? startTime : System .currentTimeMillis ();
2394
+ }
2390
2395
}
2391
2396
2392
2397
public boolean hasFailed () {
@@ -2453,7 +2458,7 @@ public boolean isDepositsFinalized() {
2453
2458
else {
2454
2459
Long minDepositTxConfirmations = getMinDepositTxConfirmations ();
2455
2460
2456
- // TODO: state can be past finalized (e.g. payment_sent) before the deposits are finalized, ideally use separate enum for deposits
2461
+ // TODO: state can be past finalized (e.g. payment_sent) before the deposits are finalized, ideally use separate enum for deposits, or a single published state + num confirmations
2457
2462
if (minDepositTxConfirmations == null ) {
2458
2463
log .warn ("Assuming that deposit txs are finalized for trade {} {} because trade is in phase {} but has unknown confirmations" , getClass ().getSimpleName (), getShortId (), getState ().getPhase ());
2459
2464
return true ;
0 commit comments