From 6789c1f0322ebc54f22fac741327cf1f89aa3c0c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 10 Sep 2011 06:00:19 +0200 Subject: [PATCH] * Improved collection syncing, this should prevent any dupes. --- src/libtomahawk/database/databasecommand.h | 4 +- src/libtomahawk/database/databaseworker.cpp | 4 +- src/libtomahawk/network/dbsyncconnection.cpp | 47 +++++++++++++------- src/libtomahawk/network/dbsyncconnection.h | 9 ++-- src/libtomahawk/network/portfwdthread.cpp | 9 ++++ src/libtomahawk/network/servent.cpp | 4 +- 6 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/libtomahawk/database/databasecommand.h b/src/libtomahawk/database/databasecommand.h index 3ce9b6873..d7cc6683e 100644 --- a/src/libtomahawk/database/databasecommand.h +++ b/src/libtomahawk/database/databasecommand.h @@ -23,8 +23,8 @@ #include #include #include +#include -#include "source.h" #include "typedefs.h" #include "database/op.h" @@ -107,4 +107,6 @@ private: Q_DECLARE_METATYPE( DatabaseCommand ) +#include "source.h" + #endif // DATABASECOMMAND_H diff --git a/src/libtomahawk/database/databaseworker.cpp b/src/libtomahawk/database/databaseworker.cpp index 93791cdab..2a8997237 100644 --- a/src/libtomahawk/database/databaseworker.cpp +++ b/src/libtomahawk/database/databaseworker.cpp @@ -110,7 +110,7 @@ DatabaseWorker::doWork() try { { - tDebug() << "Executing cmd:" << cmd->guid(); +// tDebug() << "Executing cmd:" << cmd->guid(); cmd->_exec( m_dbimpl ); // runs actual SQL stuff if ( cmd->loggable() ) @@ -180,7 +180,7 @@ DatabaseWorker::doWork() if( cmd->doesMutates() ) m_dbimpl->database().rollback(); -// Q_ASSERT( false ); + Q_ASSERT( false ); } catch(...) { diff --git a/src/libtomahawk/network/dbsyncconnection.cpp b/src/libtomahawk/network/dbsyncconnection.cpp index 4422b0bba..d8c7ccdc8 100644 --- a/src/libtomahawk/network/dbsyncconnection.cpp +++ b/src/libtomahawk/network/dbsyncconnection.cpp @@ -46,7 +46,7 @@ using namespace Tomahawk; -DBSyncConnection::DBSyncConnection( Servent* s, source_ptr src ) +DBSyncConnection::DBSyncConnection( Servent* s, const source_ptr& src ) : Connection( s ) , m_source( src ) , m_state( UNKNOWN ) @@ -205,8 +205,8 @@ DBSyncConnection::handleMsg( msg_ptr msg ) msg->is( Msg::DBOP ) && msg->payload() == "ok" ) { -// qDebug() << "No ops to apply, we are synced."; changeState( SYNCED ); + // calc the collection stats, to updates the "X tracks" in the sidebar etc // this is done automatically if you run a dbcmd to add files. DatabaseCommand_CollectionStats* cmd = new DatabaseCommand_CollectionStats( m_source ); @@ -233,19 +233,10 @@ DBSyncConnection::handleMsg( msg_ptr msg ) if ( !cmd ) { qDebug() << "UNKNOWN DBOP CMD"; - - if ( !msg->is( Msg::FRAGMENT ) ) // last msg in this batch - lastOpApplied(); return; } QSharedPointer cmdsp = QSharedPointer(cmd); - if ( !msg->is( Msg::FRAGMENT ) ) // last msg in this batch - { - changeState( SAVING ); // just DB work left to complete - connect( cmd, SIGNAL( finished() ), SLOT( lastOpApplied() ) ); - } - if ( m_recentTempOps.contains( cmd->guid() ) ) { qDebug() << "Ignoring dupe temporary command:" << cmd->guid(); @@ -260,7 +251,13 @@ DBSyncConnection::handleMsg( msg_ptr msg ) else m_recentTempOps << cmd->guid(); - Database::instance()->enqueue( cmdsp ); + m_cmds << cmdsp; + + if ( !msg->is( Msg::FRAGMENT ) ) // last msg in this batch + { + changeState( SAVING ); // just DB work left to complete + executeCommands(); + } return; } @@ -285,11 +282,26 @@ DBSyncConnection::handleMsg( msg_ptr msg ) void -DBSyncConnection::lastOpApplied() +DBSyncConnection::executeCommands() { - changeState( SYNCED ); - // check again, until peer responds we have no new ops to process - check(); + while ( !m_cmds.isEmpty() ) + { + QSharedPointer cmd = m_cmds.takeFirst(); + connect( cmd.data(), SIGNAL( finished() ), SLOT( onCommandFinished() ) ); + Database::instance()->enqueue( cmd ); + } +} + + +void +DBSyncConnection::onCommandFinished() +{ + if ( m_cmds.isEmpty() ) + { + changeState( SYNCED ); + // check again, until peer responds we have no new ops to process + check(); + } } @@ -315,7 +327,6 @@ DBSyncConnection::sendOpsData( QString sinceguid, QString lastguid, QList< dbop_ if ( m_lastSentOp == lastguid ) ops.clear(); - qDebug() << Q_FUNC_INFO << sinceguid << lastguid << "Num ops to send:" << ops.length(); m_lastSentOp = lastguid; if ( ops.length() == 0 ) { @@ -323,6 +334,8 @@ DBSyncConnection::sendOpsData( QString sinceguid, QString lastguid, QList< dbop_ return; } + qDebug() << Q_FUNC_INFO << sinceguid << lastguid << "Num ops to send:" << ops.length(); + int i; for( i = 0; i < ops.length(); ++i ) { diff --git a/src/libtomahawk/network/dbsyncconnection.h b/src/libtomahawk/network/dbsyncconnection.h index 0f4e24c8a..22650f31c 100644 --- a/src/libtomahawk/network/dbsyncconnection.h +++ b/src/libtomahawk/network/dbsyncconnection.h @@ -28,6 +28,8 @@ #include "database/op.h" #include "typedefs.h" +class DatabaseCommand; + class DBSyncConnection : public Connection { Q_OBJECT @@ -45,7 +47,7 @@ public: SHUTDOWN }; - explicit DBSyncConnection( Servent* s, Tomahawk::source_ptr src ); + explicit DBSyncConnection( Servent* s, const Tomahawk::source_ptr& src ); virtual ~DBSyncConnection(); void setup(); @@ -69,19 +71,20 @@ private slots: void fetchOpsData( const QString& sinceguid ); void sendOpsData( QString sinceguid, QString lastguid, QList< dbop_ptr > ops ); - void lastOpApplied(); + void onCommandFinished(); void check(); void idleTimeout(); private: - void compareAndRequest(); void synced(); void changeState( State newstate ); + void executeCommands(); Tomahawk::source_ptr m_source; QVariantMap m_us, m_uscache; + QList< QSharedPointer > m_cmds; QString m_lastop; QString m_lastSentOp; QStringList m_recentTempOps; diff --git a/src/libtomahawk/network/portfwdthread.cpp b/src/libtomahawk/network/portfwdthread.cpp index 0f7e5aece..7204d3d52 100644 --- a/src/libtomahawk/network/portfwdthread.cpp +++ b/src/libtomahawk/network/portfwdthread.cpp @@ -19,6 +19,7 @@ #include "portfwdthread.h" #include +#include #include #include #include @@ -53,6 +54,14 @@ PortFwdThread::work() qsrand( QTime( 0, 0, 0 ).secsTo( QTime::currentTime() ) ); m_portfwd = new Portfwd(); + foreach( QHostAddress ha, QNetworkInterface::allAddresses() ) + { + if( ha.toString() == "127.0.0.1" ) continue; + if( ha.toString().contains( ":" ) ) continue; //ipv6 + + m_portfwd->addBlockedDevice( ha.toString().toStdString() ); + } + // try and pick an available port: if( m_portfwd->init( 2000 ) ) { diff --git a/src/libtomahawk/network/servent.cpp b/src/libtomahawk/network/servent.cpp index a980d43a7..73b1906e6 100644 --- a/src/libtomahawk/network/servent.cpp +++ b/src/libtomahawk/network/servent.cpp @@ -441,7 +441,7 @@ Servent::socketConnected() { QTcpSocketExtra* sock = (QTcpSocketExtra*)sender(); -// qDebug() << "Servent::SocketConnected" << thread() << "socket:" << sock; + tDebug() << "Servent::SocketConnected" << thread() << "socket:" << sock; Connection* conn = sock->_conn.data(); handoverSocket( conn, sock ); @@ -536,7 +536,7 @@ Servent::connectToPeer( const QString& ha, int port, const QString &key, Connect if ( ( ha == m_externalAddress.toString() || ha == m_externalHostname ) && ( port == m_externalPort ) ) { - qDebug() << "ERROR: Tomahawk won't try to connect to" << ha << ":" << port << ": identified as ourselves."; + tDebug() << "ERROR: Tomahawk won't try to connect to" << ha << ":" << port << ": identified as ourselves."; return; }