2
0
mirror of https://github.com/meganz/MEGAcmd synced 2025-08-22 01:47:24 +00:00

Merge branch 'task/CMD-625_avoid-double-errors-on-mount-actions' into 'release/v2.1.0'

CMD-625 [to release] avoid broadcasting mount errors while operating on mounts

See merge request apps/MEGAcmd!880
This commit is contained in:
Pablo M 2025-03-20 05:31:31 +13:00
commit 1dff74f9d1
3 changed files with 48 additions and 16 deletions

View File

@ -452,6 +452,8 @@ void MegaCmdMegaListener::onRequestFinish(MegaApi *api, MegaRequest *request, Me
}
}
std::atomic<int> DisableMountErrorsBroadcastingGuard::sDisableBroadcasting = 0;
MegaCmdMegaListener::MegaCmdMegaListener(MegaApi *megaApi, MegaListener *parent, MegaCmdSandbox *sandboxCMD)
{
this->megaApi = megaApi;
@ -587,7 +589,10 @@ void MegaCmdMegaListener::onMountEvent(std::string_view pastTense, std::string_v
const std::string msg = oss.str();
LOG_err << msg;
broadcastDelayedMessage(msg, true);
if (DisableMountErrorsBroadcastingGuard::shouldBroadcast())
{
broadcastDelayedMessage(msg, true);
}
return;
}

View File

@ -221,6 +221,15 @@ public:
#endif
};
class DisableMountErrorsBroadcastingGuard
{
static std::atomic<int> sDisableBroadcasting;
public:
DisableMountErrorsBroadcastingGuard() { sDisableBroadcasting++; }
~DisableMountErrorsBroadcastingGuard() { sDisableBroadcasting--; }
static bool shouldBroadcast() { return sDisableBroadcasting == 0; }
};
class MegaCmdMegaListener : public mega::MegaListener
{

View File

@ -201,10 +201,13 @@ void addMount(mega::MegaApi& api, const fs::path& localPath, MegaNode& node, boo
auto mount = createMount(localPath, node, disabled, transient, readOnly, name);
auto listener = std::make_unique<MegaCmdListener>(nullptr);
api.addMount(mount.get(), listener.get());
if (!checkNoErrors(listener.get(), getActionString("add", localPath, nodePath)))
{
return;
DisableMountErrorsBroadcastingGuard disableErrorBroadcasting;
api.addMount(mount.get(), listener.get());
if (!checkNoErrors(listener.get(), getActionString("add", localPath, nodePath)))
{
return;
}
}
const std::string mountLocalPath = listener->getRequest()->getFile();
@ -233,10 +236,13 @@ void removeMount(mega::MegaApi& api, const mega::MegaMount& mount)
{
auto listener = std::make_unique<MegaCmdListener>(nullptr);
api.removeMount(mount.getFlags()->getName(), listener.get());
if (!checkNoErrors(listener.get(), getActionString("remove", mount)))
{
return;
DisableMountErrorsBroadcastingGuard disableErrorBroadcasting;
api.removeMount(mount.getFlags()->getName(), listener.get());
if (!checkNoErrors(listener.get(), getActionString("remove", mount)))
{
return;
}
}
OUTSTREAM << "Removed mount " << getMountId(mount) << " on \"" << mount.getPath() << '"' << endl;
@ -247,10 +253,14 @@ void enableMount(mega::MegaApi& api, const mega::MegaMount& mount, bool temporar
auto listener = std::make_unique<MegaCmdListener>(nullptr);
const bool remember = shouldRememberChange(mount, temporarily);
api.enableMount(mount.getFlags()->getName(), listener.get(), remember);
if (!checkNoErrors(listener.get(), getActionString("enable", mount)))
{
return;
DisableMountErrorsBroadcastingGuard disableErrorBroadcasting;
api.enableMount(mount.getFlags()->getName(), listener.get(), remember);
if (!checkNoErrors(listener.get(), getActionString("enable", mount)))
{
return;
}
}
OUTSTREAM << (temporarily ? "Temporarily enabled" : "Enabled") << " mount "
@ -262,10 +272,14 @@ void disableMount(mega::MegaApi& api, const mega::MegaMount& mount, bool tempora
auto listener = std::make_unique<MegaCmdListener>(nullptr);
const bool remember = shouldRememberChange(mount, temporarily);
api.disableMount(mount.getFlags()->getName(), listener.get(), remember);
if (!checkNoErrors(listener.get(), getActionString("disable", mount)))
{
return;
DisableMountErrorsBroadcastingGuard disableErrorBroadcasting;
api.disableMount(mount.getFlags()->getName(), listener.get(), remember);
if (!checkNoErrors(listener.get(), getActionString("disable", mount)))
{
return;
}
}
OUTSTREAM << (temporarily ? "Temporarily disabled" : "Disabled") << " mount "
@ -379,10 +393,14 @@ void changeConfig(mega::MegaApi& api, const mega::MegaMount& mount, const Config
auto listener = std::make_unique<MegaCmdListener>(nullptr);
api.setMountFlags(flags, currentName.c_str(), listener.get());
if (!checkNoErrors(listener.get(), getActionString("change the flags of", mount)))
{
return;
DisableMountErrorsBroadcastingGuard disableErrorBroadcasting;
api.setMountFlags(flags, currentName.c_str(), listener.get());
if (!checkNoErrors(listener.get(), getActionString("change the flags of", mount)))
{
return;
}
}
OUTSTREAM << "Mount " << getMountId(mount) << " now has the following flags\n"