1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-06 14:16:32 +02:00

Fix TWK-1395

We now queue DatabaseCommand_SetPlaylistRevision in a playlist-local
queue before we send them to the Database Queue to ensure that only
one DatabaseCommand_SetPlaylistRevision is run per playlist at a time.
This commit is contained in:
Uwe L. Korn
2014-06-19 16:57:10 +01:00
parent 58d0414498
commit 5a9c3d39c4
5 changed files with 72 additions and 5 deletions

View File

@@ -354,7 +354,17 @@ Playlist::createNewRevision( const QString& newrev, const QString& oldrev, const
added, added,
entries ); entries );
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); connect( cmd, SIGNAL( finished() ),
this, SLOT( setPlaylistRevisionFinished() ) );
if ( d->queuedSetPlaylistRevision )
{
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
}
else
{
d->queuedSetPlaylistRevision = true;
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
}
} }
@@ -389,7 +399,17 @@ Playlist::updateEntries( const QString& newrev, const QString& oldrev, const QLi
orderedguids, orderedguids,
entries ); entries );
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); connect( cmd, SIGNAL( finished() ),
this, SLOT( setPlaylistRevisionFinished() ) );
if ( d->queuedSetPlaylistRevision )
{
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
}
else
{
d->queuedSetPlaylistRevision = true;
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
}
} }
@@ -561,6 +581,22 @@ Playlist::onResolvingFinished()
} }
void
Playlist::setPlaylistRevisionFinished()
{
Q_D( Playlist );
if ( d->queuedSetPlaylistRevisionCmds.length() > 0 )
{
DatabaseCommand_SetPlaylistRevision* cmd = d->queuedSetPlaylistRevisionCmds.dequeue();
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
}
else
{
d->queuedSetPlaylistRevision = false;
}
}
void void
Playlist::addEntry( const query_ptr& query ) Playlist::addEntry( const query_ptr& query )
{ {

View File

@@ -272,6 +272,7 @@ protected:
private slots: private slots:
void onResultsChanged(); void onResultsChanged();
void onResolvingFinished(); void onResolvingFinished();
void setPlaylistRevisionFinished();
private: private:
Playlist(); Playlist();

View File

@@ -26,6 +26,8 @@
#include "playlist/RevisionQueueItem.h" #include "playlist/RevisionQueueItem.h"
class DatabaseCommand_SetPlaylistRevision;
namespace Tomahawk namespace Tomahawk
{ {
@@ -35,6 +37,7 @@ class PlaylistPrivate
public: public:
PlaylistPrivate( Playlist* q ) PlaylistPrivate( Playlist* q )
: q_ptr( q ) : q_ptr( q )
, queuedSetPlaylistRevision( false )
{ {
} }
@@ -42,6 +45,7 @@ public:
: q_ptr( q ) : q_ptr( q )
, source( _author ) , source( _author )
, lastmodified( 0 ) , lastmodified( 0 )
, queuedSetPlaylistRevision( false )
{ {
} }
@@ -63,6 +67,7 @@ public:
, creator( _creator ) , creator( _creator )
, lastmodified( _lastmod ) , lastmodified( _lastmod )
, createdOn( _createdOn ) , createdOn( _createdOn )
, queuedSetPlaylistRevision( false )
, shared( _shared ) , shared( _shared )
{ {
} }
@@ -82,6 +87,7 @@ public:
, creator( _creator ) , creator( _creator )
, lastmodified( 0 ) , lastmodified( 0 )
, createdOn( 0 ) // will be set by db command , createdOn( 0 ) // will be set by db command
, queuedSetPlaylistRevision( false )
, shared( _shared ) , shared( _shared )
, initEntries( _entries ) , initEntries( _entries )
{ {
@@ -100,10 +106,12 @@ private:
QString creator; QString creator;
unsigned int lastmodified; unsigned int lastmodified;
unsigned int createdOn; unsigned int createdOn;
bool queuedSetPlaylistRevision;
bool shared; bool shared;
bool loaded; bool loaded;
QQueue<_detail::Closure*> queuedOps; QQueue<_detail::Closure*> queuedOps;
QQueue<DatabaseCommand_SetPlaylistRevision*> queuedSetPlaylistRevisionCmds;
QList< plentry_ptr > initEntries; QList< plentry_ptr > initEntries;
QList< plentry_ptr > entries; QList< plentry_ptr > entries;

View File

@@ -274,7 +274,7 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib )
tDebug() << "Not updating current revision, optimistic locking fail" << currentRevision << m_oldrev; tDebug() << "Not updating current revision, optimistic locking fail" << currentRevision << m_oldrev;
// This will fail if we run two SetPlaylistRevisions commands on the same playlist concurrently // This will fail if we run two SetPlaylistRevisions commands on the same playlist concurrently
// Q_ASSERT( !source()->isLocal() ); Q_ASSERT( !source()->isLocal() );
} }
} }

View File

@@ -244,7 +244,18 @@ DynamicPlaylist::createNewRevision( const QString& newrev,
if ( !d->autoLoad ) if ( !d->autoLoad )
cmd->setPlaylist( d->weakSelf ); cmd->setPlaylist( d->weakSelf );
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); connect( cmd, SIGNAL( finished() ),
this, SLOT( setPlaylistRevisionFinished() ) );
if ( d->queuedSetPlaylistRevision )
{
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
}
else
{
d->queuedSetPlaylistRevision = true;
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
}
} }
@@ -280,7 +291,18 @@ DynamicPlaylist::createNewRevision( const QString& newrev,
if ( !d->autoLoad ) if ( !d->autoLoad )
cmd->setPlaylist( d->weakSelf ); cmd->setPlaylist( d->weakSelf );
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); connect( cmd, SIGNAL( finished() ),
this, SLOT( setPlaylistRevisionFinished() ) );
if ( d->queuedSetPlaylistRevision )
{
d->queuedSetPlaylistRevisionCmds.enqueue( cmd );
}
else
{
d->queuedSetPlaylistRevision = true;
Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) );
}
} }