// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef ICE_GRID_ADAPTERCACHE_H #define ICE_GRID_ADAPTERCACHE_H #include #include #include #include #include #include namespace IceGrid { class AdapterCache; class SynchronizationCallback; typedef IceUtil::Handle SynchronizationCallbackPtr; class ServerEntry; typedef IceUtil::Handle ServerEntryPtr; typedef std::vector ServerEntrySeq; class AdapterEntry; typedef IceUtil::Handle AdapterEntryPtr; class ServerAdapterEntry; typedef IceUtil::Handle ServerAdapterEntryPtr; struct LocatorAdapterInfo { std::string id; AdapterPrx proxy; int activationTimeout; int deactivationTimeout; }; typedef std::vector LocatorAdapterInfoSeq; class GetAdapterInfoResult : public IceUtil::Shared { public: void add(const ServerAdapterEntryPtr&); AdapterInfoSeq get(); private: AdapterInfoSeq _adapters; std::vector _results; }; typedef IceUtil::Handle GetAdapterInfoResultPtr; class AdapterEntry : public virtual IceUtil::Shared { public: AdapterEntry(AdapterCache&, const std::string&, const std::string&); virtual bool addSyncCallback(const SynchronizationCallbackPtr&, const std::set&) = 0; virtual void getLocatorAdapterInfo(LocatorAdapterInfoSeq&, int&, bool&, bool&, std::string&, const std::set&) = 0; virtual float getLeastLoadedNodeLoad(LoadSample) const = 0; virtual AdapterInfoSeq getAdapterInfoNoEndpoints() const = 0; virtual GetAdapterInfoResultPtr getAdapterInfoAsync() const = 0; virtual AdapterPrx getProxy(const std::string&, bool) const = 0; virtual bool canRemove(); std::string getId() const; std::string getApplication() const; protected: AdapterCache& _cache; const std::string _id; std::string _application; }; typedef IceUtil::Handle AdapterEntryPtr; class ServerAdapterEntry : public AdapterEntry { public: ServerAdapterEntry(AdapterCache&, const std::string&, const std::string&, const std::string&, int, const ServerEntryPtr&); virtual bool addSyncCallback(const SynchronizationCallbackPtr&, const std::set&); virtual void getLocatorAdapterInfo(LocatorAdapterInfoSeq&, int&, bool&, bool&, std::string&, const std::set&); virtual float getLeastLoadedNodeLoad(LoadSample) const; virtual AdapterInfoSeq getAdapterInfoNoEndpoints() const; virtual GetAdapterInfoResultPtr getAdapterInfoAsync() const; virtual AdapterPrx getProxy(const std::string&, bool) const; void getLocatorAdapterInfo(LocatorAdapterInfoSeq&) const; const std::string& getReplicaGroupId() const { return _replicaGroupId; } int getPriority() const; std::string getServerId() const; std::string getNodeName() const; private: const std::string _replicaGroupId; const int _priority; const ServerEntryPtr _server; }; typedef IceUtil::Handle ServerAdapterEntryPtr; class ReplicaGroupEntry : public AdapterEntry, public IceUtil::Monitor { public: ReplicaGroupEntry(AdapterCache&, const std::string&, const std::string&, const LoadBalancingPolicyPtr&, const std::string&); virtual bool addSyncCallback(const SynchronizationCallbackPtr&, const std::set&); virtual void getLocatorAdapterInfo(LocatorAdapterInfoSeq&, int&, bool&, bool&, std::string&, const std::set&); virtual float getLeastLoadedNodeLoad(LoadSample) const; virtual AdapterInfoSeq getAdapterInfoNoEndpoints() const; virtual GetAdapterInfoResultPtr getAdapterInfoAsync() const; virtual AdapterPrx getProxy(const std::string&, bool) const { return 0; } void addReplica(const std::string&, const ServerAdapterEntryPtr&); bool removeReplica(const std::string&); void update(const std::string&, const LoadBalancingPolicyPtr&, const std::string&); bool hasAdaptersFromOtherApplications() const; const std::string& getFilter() const { return _filter; } private: LoadBalancingPolicyPtr _loadBalancing; int _loadBalancingNReplicas; LoadSample _loadSample; std::string _filter; std::vector _replicas; int _lastReplica; bool _requestInProgress; }; typedef IceUtil::Handle ReplicaGroupEntryPtr; class AdapterCache : public CacheByString { public: AdapterCache(const Ice::CommunicatorPtr&); void addServerAdapter(const AdapterDescriptor&, const ServerEntryPtr&, const std::string&); void addReplicaGroup(const ReplicaGroupDescriptor&, const std::string&); AdapterEntryPtr get(const std::string&) const; void removeServerAdapter(const std::string&); void removeReplicaGroup(const std::string&); protected: virtual AdapterEntryPtr addImpl(const std::string&, const AdapterEntryPtr&); virtual void removeImpl(const std::string&); private: const Ice::CommunicatorPtr _communicator; }; }; #endif