1
#include "source/extensions/resource_monitors/injected_resource/injected_resource_monitor.h"
2

            
3
#include "envoy/extensions/resource_monitors/injected_resource/v3/injected_resource.pb.h"
4

            
5
#include "source/common/common/assert.h"
6

            
7
#include "absl/strings/numbers.h"
8

            
9
namespace Envoy {
10
namespace Extensions {
11
namespace ResourceMonitors {
12
namespace InjectedResourceMonitor {
13

            
14
InjectedResourceMonitor::InjectedResourceMonitor(
15
    const envoy::extensions::resource_monitors::injected_resource::v3::InjectedResourceConfig&
16
        config,
17
    Server::Configuration::ResourceMonitorFactoryContext& context)
18
11
    : filename_(config.filename()),
19
11
      watcher_(context.mainThreadDispatcher().createFilesystemWatcher()), api_(context.api()) {
20
11
  THROW_IF_NOT_OK(
21
11
      watcher_->addWatch(filename_, Filesystem::Watcher::Events::MovedTo, [this](uint32_t) {
22
11
        onFileChanged();
23
11
        return absl::OkStatus();
24
11
      }));
25
11
}
26

            
27
11
void InjectedResourceMonitor::onFileChanged() { file_changed_ = true; }
28

            
29
8142
void InjectedResourceMonitor::updateResourceUsage(Server::ResourceUpdateCallbacks& callbacks) {
30
8142
  if (file_changed_) {
31
18
    file_changed_ = false;
32
18
    TRY_ASSERT_MAIN_THREAD {
33
18
      auto file_or_error = api_.fileSystem().fileReadToEnd(filename_);
34
18
      THROW_IF_NOT_OK_REF(file_or_error.status());
35
17
      const std::string contents = file_or_error.value();
36
17
      double pressure;
37
17
      if (absl::SimpleAtod(contents, &pressure)) {
38
16
        if (pressure < 0 || pressure > 1) {
39
2
          throw EnvoyException("pressure out of range");
40
2
        }
41
14
        pressure_ = pressure;
42
14
        error_.reset();
43
14
      } else {
44
1
        throw EnvoyException("failed to parse injected resource pressure");
45
1
      }
46
17
    }
47
17
    END_TRY
48
18
    catch (const EnvoyException& error) {
49
4
      error_ = error;
50
4
      pressure_.reset();
51
4
    }
52
18
  }
53

            
54
8142
  ASSERT(pressure_.has_value() != error_.has_value());
55
8142
  if (pressure_.has_value()) {
56
8138
    callbacks.onSuccess({*pressure_});
57
8140
  } else {
58
4
    callbacks.onFailure(*error_);
59
4
  }
60
8142
}
61

            
62
} // namespace InjectedResourceMonitor
63
} // namespace ResourceMonitors
64
} // namespace Extensions
65
} // namespace Envoy