Skip to content

Commit 9aca425

Browse files
authored
synchronize setting and getting trade start time (#1956)
1 parent 46ccb9b commit 9aca425

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

core/src/main/java/haveno/core/trade/Trade.java

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ public static protobuf.Trade.TradePeriodState toProtoMessage(Trade.TradePeriodSt
482482
private long lockTime;
483483
@Setter
484484
private long startTime; // added for haveno
485+
private final Object startTimeLock = new Object();
485486
@Getter
486487
@Nullable
487488
private RefundResultState refundResultState = RefundResultState.UNDEFINED_REFUND_RESULT;
@@ -2334,28 +2335,30 @@ public Volume getVolume() {
23342335
}
23352336

23362337
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
23402342

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");
23452347

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;
23492351

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);
23562358

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+
}
23592362
}
23602363

23612364
private long getDepositsFinalizedHeight() {
@@ -2386,7 +2389,9 @@ public Date getStartDate() {
23862389
* Returns the current time until the deposits are finalized.
23872390
*/
23882391
private long getEffectiveStartTime() {
2389-
return startTime > 0 ? startTime : System.currentTimeMillis();
2392+
synchronized (startTimeLock) {
2393+
return startTime > 0 ? startTime : System.currentTimeMillis();
2394+
}
23902395
}
23912396

23922397
public boolean hasFailed() {
@@ -2453,7 +2458,7 @@ public boolean isDepositsFinalized() {
24532458
else {
24542459
Long minDepositTxConfirmations = getMinDepositTxConfirmations();
24552460

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
24572462
if (minDepositTxConfirmations == null) {
24582463
log.warn("Assuming that deposit txs are finalized for trade {} {} because trade is in phase {} but has unknown confirmations", getClass().getSimpleName(), getShortId(), getState().getPhase());
24592464
return true;

0 commit comments

Comments
 (0)