Ticket #5584: wait-schemalock.patch

File wait-schemalock.patch, 4.9 KB (added by Nigel, 12 years ago)

Please test me

  • dbutil.cpp

     
    205205        return true;
    206206    }
    207207
     208    // HACK: If an upgrade failed, the schemalock table may still be locked.
     209    //       Both backup commands currently try to lock all tables,
     210    //       and thus will silently sit waiting forever.
     211    if (isSchemaLocked())
     212    {
     213        MythTimer elapsedTimer;
     214        elapsedTimer.start();
     215
     216        do
     217        {
     218            VERBOSE(VB_IMPORTANT, "Database schema are locked. Waiting...");
     219            sleep(1);
     220        }
     221        while (isSchemaLocked() && (elapsedTimer.elapsed() < 10000));
     222
     223        if (isSchemaLocked())
     224        {
     225            VERBOSE(VB_IMPORTANT, "Still locked. Cannot backup/upgrade DB");
     226            return false;
     227        }
     228    }
     229
    208230    QString backupScript = GetShareDir() + "mythconverg_backup.pl";
    209231    backupScript = gContext->GetSetting("DatabaseBackupScript", backupScript);
    210232
     
    680702    return count;
    681703}
    682704
     705bool DBUtil::IsTableLocked(const QString &name)
     706{
     707    DatabaseParams dbParams = gContext->GetDatabaseParams();
     708    MSqlQuery      query(MSqlQuery::InitCon());
     709
     710    query.exec("SHOW OPEN TABLES FROM " + dbParams.dbName);
     711    while (query.next())
     712        if (query.value(1).toString() == name && query.value(2).toInt() > 0)
     713            return true;
     714
     715    return false;
     716}
     717
    683718/**
    684719 * \brief Try to get a lock on the table schemalock.
    685720 *
     
    713748    query.exec("UNLOCK TABLES;");  // Should this _just_ unlock schemalock?
    714749}
    715750
     751bool DBUtil::isSchemaLocked(void)
     752{
     753    return IsTableLocked("schemalock");
     754}
     755
    716756/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • dbutil.h

     
    3434    static bool IsNewDatabase(void);
    3535    static bool IsBackupInProgress(void);
    3636    static int  CountClients(void);
     37    static bool IsTableLocked(const QString &);
    3738
    3839    static bool lockSchema(MSqlQuery &);
    3940    static void unlockSchema(MSqlQuery &);
     41    static bool isSchemaLocked(void);
    4042
    41 
    4243    static const int kUnknownVersionNumber;
    4344
    4445  protected:
  • schemawizard.cpp

     
    105105        VERBOSE(VB_IMPORTANT, "Database schema is old."
    106106                              " Waiting to see if DB is being upgraded.");
    107107
    108         MSqlQuery query(MSqlQuery::InitCon());
    109108        bool      backupRunning  = false;
    110109        bool      upgradeRunning = false;
    111110
     
    127126                continue;
    128127            }
    129128
    130             if (!lockSchema(query))
     129            if (isSchemaLocked())
    131130            {
    132131                VERBOSE(VB_IMPORTANT,
    133132                        "Waiting for Database Upgrade to complete.");
     
    140139            }
    141140
    142141            Compare();
    143             unlockSchema(query);
    144142
    145143            if (m_expertMode)  // Experts don't like to wait around :-)
    146144                break;
     
    187185{
    188186    bool     connections;   // Are (other) FE/BEs connected?
    189187    bool     gui;           // Was gContext Init'ed gui=true?
     188    bool     locked;        // Database schemalock
    190189    bool     upgradable;    // Can/should we upgrade?
    191190    bool     validDBMS;     // Do we measure up to minDBMS* ?
    192191    QString  warnOldDBMS;
    193192    QString  warnOtherCl;
     193    QString  warnSchLock;
    194194
    195195
    196196
     
    205205
    206206    connections = CountClients() > 1;
    207207    gui         = GetMythUI()->IsScreenSetup();
     208    locked      = isSchemaLocked();
    208209    validDBMS   = (minDBMSmajor == 0)   // If the caller provided no version,
    209210                  ? true                // the upgrade code can't be fussy!
    210211                  : CompareDBMSVersion(minDBMSmajor,
    211212                                       minDBMSminor, minDBMSpoint) >= 0;
    212213    upgradable  = validDBMS && (versionsBehind > 0)
     214                            && !locked
    213215                            && (upgradeAllowed || m_expertMode);
    214216
    215217
     
    223225                         "  You seem to be running MySQL version %5.")
    224226                      .arg(name).arg(minDBMSmajor).arg(minDBMSminor)
    225227                      .arg(minDBMSpoint).arg(GetDBMSVersion());
     228    if (locked)
     229        warnSchLock = tr("Error: It appears that an earlier schema upgrade"
     230                         " has crashed. (TABLE schemlock is locked) "
     231                         " Please check all backend logs.");
    226232
    227233
    228 
    229234    //
    230235    // 1. Deal with the trivial cases (No user prompting required)
    231236    //
     
    291296                              " but that may cause problems.");
    292297        }
    293298    }
     299    else if (locked)
     300    {
     301        message = warnSchLock;
     302        returnValue = MYTH_SCHEMA_ERROR;
     303    }
    294304    else if (!validDBMS)
    295305    {
    296306        message = warnOldDBMS;