Ticket #1728: 05_cache_pruning_and_cleanup.patch

File 05_cache_pruning_and_cleanup.patch, 7.2 KB (added by Janne <janne-mythtv@…>, 14 years ago)
  • libs/libmythtv/eitcache.h

    === libs/libmythtv/eitcache.h
    ==================================================================
     
    1010
    1111// Qt headers
    1212#include <qmap.h>
     13#include <qmutex.h>
    1314#include <qstring.h>
    1415
    1516typedef QMap<uint64_t, uint64_t> key_map_t;
     
    2021    EITCache();
    2122   ~EITCache() {};
    2223
    23     bool IsNewEIT(const uint tsid,       const uint eventid,
    24                   const uint serviceid,  const uint tableid,
    25                   const uint version,
    26                   const unsigned char * const eitdata,
    27                   const uint eitlength);
     24    bool IsNewEIT(const uint onid, const uint tsid,
     25                  const uint serviceid, const uint eventid,
     26                  const uint tableid, const uint version,
     27                  const uint endtime);
    2828
     29    uint PruneOldEntries(uint timestamp);
     30
    2931    void ResetStatistics(void);
    3032    QString GetStatistics(void) const;
    3133
     
    3335    // event key cache
    3436    key_map_t   eventMap;
    3537
     38    QMutex      eventMapLock;
     39
    3640    // statistics
    3741    uint        accessCnt;
    3842    uint        hitCnt;
  • libs/libmythtv/eithelper.cpp

    === libs/libmythtv/eithelper.cpp
    ==================================================================
     
    210210    for (uint i = 0; i < eit->EventCount(); i++)
    211211    {
    212212        // Skip event if we have already processed it before...
    213         if (!eitcache->IsNewEIT(
    214                 eit->TSID(),      eit->EventID(i),
    215                 eit->ServiceID(), eit->TableID(),
    216                 eit->Version(),
    217                 eit->Descriptors(i), eit->DescriptorsLength(i)))
     213        if (!eitcache->IsNewEIT(eit->OriginalNetworkID(), eit->TSID(),
     214                                eit->ServiceID(), eit->EventID(i),
     215                                eit->TableID(), eit->Version(),
     216                                eit->StartTimeKey(i)+eit->DurationInSeconds(i)))
    218217        {
    219218            continue;
    220219        }
  • libs/libmythtv/eitcache.cpp

    === libs/libmythtv/eitcache.cpp
    ==================================================================
     
    2525
    2626QString EITCache::GetStatistics(void) const
    2727{
     28    QMutexLocker locker(&eventMapLock);
    2829    return QString(
    2930        "EITCache::statistics: Accesses: %1, Hits: %2, "
    30         "Table Upgrades %3, New Versions: %4")
    31         .arg(accessCnt).arg(hitCnt).arg(tblChgCnt).arg(verChgCnt);
     31        "Table Upgrades %3, New Versions: %4, Entries: %5")
     32        .arg(accessCnt).arg(hitCnt).arg(tblChgCnt).arg(verChgCnt).arg(eventMap.size());
    3233}
    3334
    34 static uint64_t construct_key(uint tsid, uint eventid, uint serviceid)
     35static uint64_t construct_key(uint onid, uint tsid, uint serviceid, uint eventid)
    3536{
    36     return (((uint64_t) tsid      << 48) | ((uint64_t) eventid   << 32) |
    37             ((uint64_t) serviceid << 16));
     37    return (((uint64_t) onid      << 48) | ((uint64_t) tsid    << 32) |
     38            ((uint64_t) serviceid << 16) | ((uint64_t) eventid      ));
    3839}
    3940
    40 static uint64_t construct_sig(uint tableid, uint version, uint chksum)
     41static uint64_t construct_sig(uint tableid, uint version, uint endtime)
    4142{
    4243    return (((uint64_t) tableid   << 40) | ((uint64_t) version   << 32) |
    43             ((uint64_t) chksum));
     44            ((uint64_t) endtime));
    4445}
    4546
    4647static uint extract_table_id(uint64_t sig)
     
    5354    return (sig >> 32) & 0x1f;
    5455}
    5556
    56 bool EITCache::IsNewEIT(const uint tsid,      const uint eventid,
    57                         const uint serviceid, const uint tableid,
    58                         const uint version,
    59                         const unsigned char * const /*eitdata*/,
    60                         const uint /*eitlength*/)
     57static uint extract_endtime(uint64_t sig)
    6158{
     59    return sig & 0xffff;
     60}
     61
     62bool EITCache::IsNewEIT(const uint onid, const uint tsid,
     63                        const uint serviceid, const uint eventid,
     64                        const uint tableid, const uint version,
     65                        const uint endtime)
     66{
    6267    accessCnt++;
    6368
    64     uint64_t key = construct_key(tsid, eventid, serviceid);
     69    uint64_t key = construct_key(onid, tsid, serviceid, eventid);
     70
     71    QMutexLocker locker(&eventMapLock);
    6572    key_map_t::const_iterator it = eventMap.find(key);
    6673
    6774    if (it != eventMap.end())
     
    8794        }
    8895    }
    8996
    90     eventMap[key] = construct_sig(tableid, version, 0 /*chksum*/);
     97    eventMap[key] = construct_sig(tableid, version, endtime);
    9198
    9299    return true;
    93100}
    94101
     102uint EITCache::PruneOldEntries(uint timestamp)
     103{
     104    QMutexLocker locker(&eventMapLock);
     105    uint size = eventMap.size();
     106    key_map_t::iterator it = eventMap.begin();
     107    while (it != eventMap.end())
     108    {
     109        if (extract_endtime(*it) < timestamp)
     110        {
     111            key_map_t::iterator tmp = it;
     112            ++tmp;
     113            eventMap.erase(it);
     114            it = tmp;
     115        }
     116        else
     117            ++it;
     118    }
     119    return size -  eventMap.size();
     120}
     121
    95122/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • programs/mythbackend/eitactivescanner.cpp

    === programs/mythbackend/eitactivescanner.cpp
    ==================================================================
     
    6363
    6464    while (!exitThread)
    6565    {
    66         if (ismaster && (QDateTime::currentDateTime() > activeScanNextTrig)
    67             && !cardList->isEmpty())
     66        QDateTime now = QDateTime::currentDateTime();
     67
     68        if (ismaster && (now > activeScanNextTrig) && !cardList->isEmpty())
    6869        {
    6970            cerr << eitCache->GetStatistics() << endl;
    7071            if (activeScanNextCard == cardIDToSourceID.end())
     
    9899
    99100            activeScanNextCard++;
    100101        }
    101         // TODO: prune old eit cache entries every now and then
     102
     103        if (now > nextPruneCacheTime)
     104        {
     105            // prune cache entries that ended more than kPruneCacheTimeOffset ago
     106            uint prunedEntries = eitCache->PruneOldEntries(now.addSecs(-kPruneCacheTimeOffset).toTime_t());
     107            nextPruneCacheTime.addSecs(kPruneCacheTimeOffset);
     108
     109            VERBOSE(VB_GENERAL, QString("Pruned %1 entries from the eit cache")
     110                        .arg(prunedEntries));
     111        }
    102112           
    103113        exitThreadCond.wait(200); // sleep up to 200 ms.
    104114    }
     
    190200        activeScanNextTrig = QDateTime::currentDateTime();
    191201        activeScanTrigTime = max_seconds_per_source / cardList->size();
    192202        activeScanNextCard = cardIDToSourceID.begin();
     203        nextPruneCacheTime = QDateTime::currentDateTime().addSecs(kPruneCacheTimeOffset);
    193204    }
    194205}
  • programs/mythbackend/eitactivescanner.h

    === programs/mythbackend/eitactivescanner.h
    ==================================================================
     
    4848    QMap<int, uint>            cardIDToSourceID;
    4949    QMap<int, uint>::iterator  activeScanNextCard;
    5050
    51     bool             ismaster;
     51    bool                ismaster;
     52
     53    QDateTime           nextPruneCacheTime;
     54
     55    static const int    kPruneCacheTimeOffset = 21600; // six hours
    5256};
    5357
    5458#endif //EITACTIVESCANNER_H