25 #include <ibrcommon/Logger.h>
33 : eid(), _filter(), _filter_expire(0), _filter_state(FILTER_EXPIRED, FILTER_FINAL)
37 : eid(e), _filter(), _filter_expire(0), _filter_state(FILTER_EXPIRED, FILTER_FINAL)
46 ibrcommon::ThreadsafeState<FILTER_REQUEST_STATE>::Locked l = _filter_state.lock();
51 _filter_expire = std::numeric_limits<dtn::data::Size>::max();
63 ibrcommon::ThreadsafeState<FILTER_REQUEST_STATE>::Locked l = _filter_state.lock();
78 if (_filter_state == FILTER_AVAILABLE)
83 else if (require_bloomfilter)
88 return _summary.has(
id);
93 return (_filter_state == FILTER_AVAILABLE);
99 return (_last_update + 900) < timestamp;
115 ibrcommon::ThreadsafeState<FILTER_REQUEST_STATE>::Locked l = _filter_state.lock();
117 if ((_filter_expire > 0) && (_filter_expire < timestamp))
119 IBRCOMMON_LOGGER_DEBUG_TAG(
"NeighborDatabase", 15) <<
"summary vector of " << eid.getString() <<
" is expired" << IBRCOMMON_LOGGER_ENDL;
125 _filter_expire = timestamp + 60;
129 _summary.expire(timestamp);
134 for (neighbor_map::iterator iter = _entries.begin(); iter != _entries.end(); )
139 delete (*iter).second;
140 _entries.erase(iter++);
157 _transit_bundles.insert(
id);
159 IBRCOMMON_LOGGER_DEBUG_TAG(
"NeighborDatabase", 20) <<
"acquire transfer of " <<
id.toString() <<
" to " << eid.getString() <<
" (" << _transit_bundles.size() <<
" bundles in transit)" << IBRCOMMON_LOGGER_ENDL;
177 _transit_bundles.erase(
id);
179 IBRCOMMON_LOGGER_DEBUG_TAG(
"NeighborDatabase", 20) <<
"release transfer of " <<
id.toString() <<
" to " << eid.getString() <<
" (" << _transit_bundles.size() <<
" bundles in transit)" << IBRCOMMON_LOGGER_ENDL;
184 pair<data_set::iterator, bool> ret = _datasets.insert( dset );
187 _datasets.erase(ret.first);
188 _datasets.insert( dset );
198 ibrcommon::MutexLock l(*
this);
199 std::set<dtn::data::EID> ret;
201 for (neighbor_map::const_iterator iter = _entries.begin(); iter != _entries.end(); ++iter)
203 delete (*iter).second;
209 neighbor_map::iterator iter = _entries.find(eid);
210 if (iter == _entries.end())
213 pair<neighbor_map::iterator,bool> itm = _entries.insert( pair<dtn::data::EID, NeighborDatabase::NeighborEntry*>(eid, entry) );
218 (*(*iter).second).touch();
220 return *(*iter).second;
228 neighbor_map::iterator iter = _entries.find(eid);
229 if (iter == _entries.end())
235 (*(*iter).second).touch();
237 return *(*iter).second;
242 neighbor_map::iterator iter = _entries.find(eid);
243 if (iter == _entries.end())
245 delete (*iter).second;
246 _entries.erase(iter);
bool isFilterValid() const
bool isExpired(const dtn::data::Timestamp ×tamp) const
void add(const dtn::data::MetaBundle &)
const dtn::data::Timestamp & getLastUpdate() const
void remove(const dtn::data::EID &eid)
bool isTransferThresholdReached() const
void expire(const dtn::data::Timestamp ×tamp)
void update(const ibrcommon::BloomFilter &bf, const dtn::data::Number &lifetime=0)
static dtn::data::Timestamp getExpireTime(const dtn::data::Bundle &b)
bool has(const dtn::data::BundleID &, const bool require_bloomfilter=false) const
NeighborDatabase::NeighborEntry & get(const dtn::data::EID &eid, bool noCached=false)
dtn::data::Size getFreeTransferSlots() const
void acquireTransfer(const dtn::data::BundleID &id)
static dtn::data::Size max_bundles_in_transit
static dtn::data::Timestamp getTime()
void putDataset(NeighborDataset &dset)
void expire(const dtn::data::Timestamp ×tamp)
NeighborDatabase::NeighborEntry & create(const dtn::data::EID &eid)
virtual ~NeighborDatabase()
static BundleCore & getInstance()
void releaseTransfer(const dtn::data::BundleID &id)