sapling/eden/fs/notifications/Notifications.h
Wez Furlong 28f7b4a0b0 eden: show desktop notification for blob/tree fetch errors
Summary:
This commit causes a desktop notification to be shown if we generate
EIO or ETIMEDOUT responses via fuse; the prompt is intended to make it obvious
to the user that they need to connect to the VPN.

The commit by itself doesn't show a notification, it allows configuring a
command that can be run to do something to show a notification.

The test plan includes one such configuration for our corp environment.

* It doesn't trigger for thrift-originated downloads (eg: prefetch), only for
  VFS operations through FUSE.
* Ideally we'd know exactly when we have a network related error in the store
  code and use that to trigger the notification.  However, we have a rather
  convoluted set of importers and fallbacks today, one of which is interpreting
  a generic response returned from a pipe, so it is not especially clear
  exactly where we should locate the logic

Reviewed By: chadaustin

Differential Revision: D17513364

fbshipit-source-id: 45134f3672679cb5580cb0c1bc12a0d6e38525ca
2020-02-10 08:28:49 -08:00

47 lines
1.4 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This software may be used and distributed according to the terms of the
* GNU General Public License version 2.
*/
#pragma once
#include <folly/Synchronized.h>
#include "eden/fs/config/ReloadableConfig.h"
namespace facebook {
namespace eden {
class ReloadableConfig;
class Notifications {
public:
explicit Notifications(ReloadableConfig& edenConfig) : config_(edenConfig) {}
/**
* Show a generic "something went wrong" notification to the interactive
* user.
* This is implemented by invoking the command specified by the
* configuration value named:
* notifications:generic-connectivity-notification-cmd
* The intent is that that command will show a desktop "toast" notification
* to the user, but in some environments it is possible that it might instead
* trigger eg: a Workplace Messenger chat notification.
* This Notifications instance will throttle the rate at which these
* occur based on the value of the notifications:interval configuration
* which defaults to a reasonable value to avoid spamming the user.
*/
void showGenericErrorNotification(const std::exception& err);
private:
bool canShowNotification();
ReloadableConfig& config_;
folly::Synchronized<std::optional<std::chrono::steady_clock::time_point>>
lastShown_;
};
} // namespace eden
} // namespace facebook