// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef ICE_GRID_SERVERCACHE_H #define ICE_GRID_SERVERCACHE_H #include #include #include #include #include namespace IceGrid { class AdapterCache; class AllocatableObjectCache; class CheckServerResult; class NodeCache; class NodeEntry; class NodeObserverTopic; class ObjectCache; class ServerCache; class CheckUpdateResult final { public: CheckUpdateResult(const std::string&, const std::string&, bool, bool, std::future&&); bool getResult(); const std::string& getServer() { return _server; } private: const std::string _server; const std::string _node; const bool _remove; const bool _noRestart; std::future _result; }; class ServerEntry final : public Allocatable { public: ServerEntry(ServerCache&, const std::string&); void sync(); void waitForSync(std::chrono::seconds); void waitForSync() { waitForSync(std::chrono::seconds(-1)); } void waitForSyncNoThrow(std::chrono::seconds); void waitForSyncNoThrow() { waitForSyncNoThrow(std::chrono::seconds(-1)); } void unsync(); bool addSyncCallback(const std::shared_ptr&); void update(const ServerInfo&, bool); void destroy(bool); ServerInfo getInfo(bool = false) const; std::string getId() const; std::shared_ptr getProxy(std::chrono::seconds&, std::chrono::seconds&, std::string&, bool = true, std::chrono::seconds = std::chrono::seconds(0)); std::shared_ptr getProxy(bool = true, std::chrono::seconds = std::chrono::seconds(0)); std::shared_ptr getAdminProxy(); std::shared_ptr getAdapter(const std::string&, bool); std::shared_ptr getAdapter(std::chrono::seconds&, std::chrono::seconds&, const std::string&, bool); float getLoad(LoadSample) const; bool canRemove(); std::shared_ptr checkUpdate(const ServerInfo&, bool); bool isDestroyed(); void loadCallback(const std::shared_ptr&, const AdapterPrxDict&, std::chrono::seconds, std::chrono::seconds); void destroyCallback(); void exception(std::exception_ptr); bool isEnabled() const override; void allocated(const std::shared_ptr&) override; void allocatedNoSync(const std::shared_ptr&) override; void released(const std::shared_ptr&) override; void releasedNoSync(const std::shared_ptr&) override; private: void syncImpl(); void waitImpl(std::chrono::seconds); void synchronized(); void synchronized(std::exception_ptr); ServerCache& _cache; const std::string _id; std::unique_ptr _loaded; std::unique_ptr _load; std::unique_ptr _destroy; std::shared_ptr _proxy; AdapterPrxDict _adapters; std::chrono::seconds _activationTimeout; std::chrono::seconds _deactivationTimeout; bool _synchronizing; bool _updated; std::exception_ptr _exception; bool _noRestart; std::vector> _callbacks; std::shared_ptr _allocationSession; mutable std::mutex _mutex; std::condition_variable _condVar; }; using ServerEntrySeq = std::vector>; class ServerCache : public CacheByString { public: ServerCache(const std::shared_ptr&, const std::string&, NodeCache&, AdapterCache&, ObjectCache&, AllocatableObjectCache&); std::shared_ptr add(const ServerInfo&); std::shared_ptr get(const std::string&) const; bool has(const std::string&) const; std::shared_ptr remove(const std::string&, bool); void preUpdate(const ServerInfo&, bool); std::shared_ptr postUpdate(const ServerInfo&, bool); void clear(const std::string&); NodeCache& getNodeCache() const { return _nodeCache; } std::shared_ptr getCommunicator() const { return _communicator; } const std::string& getInstanceName() const { return _instanceName; } const std::shared_ptr& getNodeObserverTopic() const { return _nodeObserverTopic; } void setNodeObserverTopic(const std::shared_ptr&); private: void addCommunicator(const std::shared_ptr&, const std::shared_ptr&, const std::shared_ptr&, const std::string&); void removeCommunicator(const std::shared_ptr&, const std::shared_ptr&, const std::shared_ptr&); friend struct AddCommunicator; friend struct RemoveCommunicator; const std::shared_ptr _communicator; const std::string _instanceName; NodeCache& _nodeCache; AdapterCache& _adapterCache; ObjectCache& _objectCache; AllocatableObjectCache& _allocatableObjectCache; std::shared_ptr _nodeObserverTopic; mutable std::mutex _mutex; }; }; #endif