mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-07-31 02:39:08 -04:00
shut down http connections with 5s timeout
This commit is contained in:
parent
64aa052d83
commit
8600c0cb0d
6 changed files with 85 additions and 69 deletions
|
@ -341,7 +341,7 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven
|
|||
tasks.add(() -> injector.getInstance(XmrConnectionService.class).onShutDownStarted());
|
||||
tasks.add(() -> injector.getInstance(TradeManager.class).onShutDownStarted());
|
||||
try {
|
||||
ThreadUtils.awaitTasks(tasks, tasks.size(), 120000l); // run in parallel with timeout
|
||||
ThreadUtils.awaitTasks(tasks, tasks.size(), 90000l); // run in parallel with timeout
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -361,9 +361,9 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven
|
|||
|
||||
// shut down p2p service
|
||||
injector.getInstance(P2PService.class).shutDown(() -> {
|
||||
log.info("Done shutting down OpenOfferManager, OfferBookService, and P2PService");
|
||||
|
||||
// shut down monero wallets and connections
|
||||
log.info("Shutting down wallet and connection services");
|
||||
injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> {
|
||||
|
||||
// done shutting down
|
||||
|
|
|
@ -125,9 +125,9 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable {
|
|||
|
||||
// shut down p2p service
|
||||
injector.getInstance(P2PService.class).shutDown(() -> {
|
||||
log.info("Done shutting down OpenOfferManager, OfferBookService, and P2PService");
|
||||
|
||||
// shut down monero wallets and connections
|
||||
log.info("Shutting down wallet and connection services");
|
||||
injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> {
|
||||
module.close(injector);
|
||||
PersistenceManager.flushAllDataToDiskAtShutdown(() -> {
|
||||
|
|
|
@ -416,62 +416,67 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
|||
|
||||
maybeUpdatePersistedOffers();
|
||||
|
||||
ThreadUtils.execute(() -> {
|
||||
|
||||
// Wait for prices to be available
|
||||
// run off user thread so app is not blocked from starting
|
||||
ThreadUtils.submitToPool(() -> {
|
||||
|
||||
// wait for prices to be available
|
||||
priceFeedService.awaitExternalPrices();
|
||||
|
||||
// Republish means we send the complete offer object
|
||||
republishOffers();
|
||||
startPeriodicRepublishOffersTimer();
|
||||
|
||||
// Refresh is started once we get a success from republish
|
||||
|
||||
// We republish after a bit as it might be that our connected node still has the offer in the data map
|
||||
// but other peers have it already removed because of expired TTL.
|
||||
// Those other not directly connected peers would not get the broadcast of the new offer, as the first
|
||||
// connected peer (seed node) does not broadcast if it has the data in the map.
|
||||
// To update quickly to the whole network we repeat the republishOffers call after a few seconds when we
|
||||
// are better connected to the network. There is no guarantee that all peers will receive it but we also
|
||||
// have our periodic timer, so after that longer interval the offer should be available to all peers.
|
||||
if (retryRepublishOffersTimer == null)
|
||||
retryRepublishOffersTimer = UserThread.runAfter(OpenOfferManager.this::republishOffers,
|
||||
REPUBLISH_AGAIN_AT_STARTUP_DELAY_SEC);
|
||||
|
||||
p2PService.getPeerManager().addListener(this);
|
||||
|
||||
// TODO: add to invalid offers on failure
|
||||
// openOffers.stream()
|
||||
// .forEach(openOffer -> OfferUtil.getInvalidMakerFeeTxErrorMessage(openOffer.getOffer(), btcWalletService)
|
||||
// .ifPresent(errorMsg -> invalidOffers.add(new Tuple2<>(openOffer, errorMsg))));
|
||||
|
||||
// process scheduled offers
|
||||
processScheduledOffers((transaction) -> {}, (errorMessage) -> {
|
||||
log.warn("Error processing unposted offers: " + errorMessage);
|
||||
});
|
||||
|
||||
// register to process unposted offers when unlocked balance increases
|
||||
if (xmrWalletService.getWallet() != null) lastUnlockedBalance = xmrWalletService.getWallet().getUnlockedBalance(0);
|
||||
xmrWalletService.addWalletListener(new MoneroWalletListener() {
|
||||
@Override
|
||||
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
|
||||
if (lastUnlockedBalance == null || lastUnlockedBalance.compareTo(newUnlockedBalance) < 0) {
|
||||
processScheduledOffers((transaction) -> {}, (errorMessage) -> {
|
||||
log.warn("Error processing unposted offers on new unlocked balance: " + errorMessage); // TODO: popup to notify user that offer did not post
|
||||
});
|
||||
// process open offers on dedicated thread
|
||||
ThreadUtils.execute(() -> {
|
||||
|
||||
// Republish means we send the complete offer object
|
||||
republishOffers();
|
||||
startPeriodicRepublishOffersTimer();
|
||||
|
||||
// Refresh is started once we get a success from republish
|
||||
|
||||
// We republish after a bit as it might be that our connected node still has the offer in the data map
|
||||
// but other peers have it already removed because of expired TTL.
|
||||
// Those other not directly connected peers would not get the broadcast of the new offer, as the first
|
||||
// connected peer (seed node) does not broadcast if it has the data in the map.
|
||||
// To update quickly to the whole network we repeat the republishOffers call after a few seconds when we
|
||||
// are better connected to the network. There is no guarantee that all peers will receive it but we also
|
||||
// have our periodic timer, so after that longer interval the offer should be available to all peers.
|
||||
if (retryRepublishOffersTimer == null)
|
||||
retryRepublishOffersTimer = UserThread.runAfter(OpenOfferManager.this::republishOffers,
|
||||
REPUBLISH_AGAIN_AT_STARTUP_DELAY_SEC);
|
||||
|
||||
p2PService.getPeerManager().addListener(this);
|
||||
|
||||
// TODO: add to invalid offers on failure
|
||||
// openOffers.stream()
|
||||
// .forEach(openOffer -> OfferUtil.getInvalidMakerFeeTxErrorMessage(openOffer.getOffer(), btcWalletService)
|
||||
// .ifPresent(errorMsg -> invalidOffers.add(new Tuple2<>(openOffer, errorMsg))));
|
||||
|
||||
// process scheduled offers
|
||||
processScheduledOffers((transaction) -> {}, (errorMessage) -> {
|
||||
log.warn("Error processing unposted offers: " + errorMessage);
|
||||
});
|
||||
|
||||
// register to process unposted offers when unlocked balance increases
|
||||
if (xmrWalletService.getWallet() != null) lastUnlockedBalance = xmrWalletService.getWallet().getUnlockedBalance(0);
|
||||
xmrWalletService.addWalletListener(new MoneroWalletListener() {
|
||||
@Override
|
||||
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
|
||||
if (lastUnlockedBalance == null || lastUnlockedBalance.compareTo(newUnlockedBalance) < 0) {
|
||||
processScheduledOffers((transaction) -> {}, (errorMessage) -> {
|
||||
log.warn("Error processing unposted offers on new unlocked balance: " + errorMessage); // TODO: popup to notify user that offer did not post
|
||||
});
|
||||
}
|
||||
lastUnlockedBalance = newUnlockedBalance;
|
||||
}
|
||||
lastUnlockedBalance = newUnlockedBalance;
|
||||
});
|
||||
|
||||
// initialize key image poller for signed offers
|
||||
maybeInitializeKeyImagePoller();
|
||||
|
||||
// poll spent status of key images
|
||||
for (SignedOffer signedOffer : signedOffers.getList()) {
|
||||
signedOfferKeyImagePoller.addKeyImages(signedOffer.getReserveTxKeyImages());
|
||||
}
|
||||
});
|
||||
|
||||
// initialize key image poller for signed offers
|
||||
maybeInitializeKeyImagePoller();
|
||||
|
||||
// poll spent status of key images
|
||||
for (SignedOffer signedOffer : signedOffers.getList()) {
|
||||
signedOfferKeyImagePoller.addKeyImages(signedOffer.getReserveTxKeyImages());
|
||||
}
|
||||
}, THREAD_ID);
|
||||
}, THREAD_ID);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -116,6 +116,7 @@ public class PriceFeedService {
|
|||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public void shutDown() {
|
||||
log.info("Shutting down {}", getClass().getSimpleName());
|
||||
if (requestTimer != null) {
|
||||
requestTimer.stop();
|
||||
requestTimer = null;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue