Don't fsync a KMFolder after everytime addMsg is called.

Instead when checking for new mail sync just before expunging the local
account or just before deleting mail from the pop server. I guess syncing
isn't currently as issue for imap.

There is a question of whether/when sync should be called for other
operations such as moving messages between folders.

svn path=/trunk/kdenetwork/kmail/; revision=105142
wilder-work
Don Sanders 25 years ago
parent c51b01e9b6
commit 6b45aa141a
  1. 5
      kmacctexppop.cpp
  2. 15
      kmacctlocal.cpp
  3. 8
      kmfolder.cpp
  4. 2
      kmfolder.h
  5. 36
      kmfoldermgr.cpp
  6. 3
      kmfoldermgr.h

@ -33,6 +33,7 @@
#include <kmessagebox.h>
#include <qtooltip.h>
#include "kmbroadcaststatus.h"
#include "kmfoldermgr.h"
#include <kwin.h>
#include <kbuttonbox.h>
@ -666,7 +667,7 @@ void KMAcctExpPop::processRemainingQueuedMessagesAndSaveUidList()
":" + QString("%1").arg(mPort) );
KConfig config( seenUidList );
config.writeEntry( "seenUidList", uidsOfNextSeenMsgs );
config.sync();
config.sync();
}
void KMAcctExpPop::slotGetNextMsg()
@ -683,7 +684,7 @@ void KMAcctExpPop::slotGetNextMsg()
if (next == idsOfMsgsPendingDownload.end()) {
processRemainingQueuedMessagesAndSaveUidList();
kernel->folderMgr()->syncAllFolders();
if (mLeaveOnServer || idsOfMsgsToDelete.isEmpty()) {
KURL url = getUrl();

@ -12,6 +12,7 @@
#include "kmacctfolder.h"
#include "kmglobal.h"
#include "kmbroadcaststatus.h"
#include "kmfoldermgr.h"
#include <kapp.h>
#include <kconfig.h>
@ -173,6 +174,13 @@ void KMAcctLocal::processNewMail(bool)
msg->setStatus(msg->headerField("Status").latin1(),
msg->headerField("X-Status").latin1());
addedOk = processNewMsg(msg);
/*
if (msg->parent()) {
int count = msg->parent()->count();
if (count != 1 && msg->parent()->operator[](count - 1) == msg)
msg->parent()->unGetMsg(count - 1);
}
*/
if (addedOk)
hasNewMail = true;
}
@ -188,9 +196,10 @@ void KMAcctLocal::processNewMail(bool)
if (addedOk)
{
rc = mailFolder.expunge();
if (rc)
KMessageBox::information( 0, i18n("Cannot remove mail from\nmailbox `%1':\n%2").arg(mailFolder.location()).arg(strerror(rc)));
kernel->folderMgr()->syncAllFolders();
rc = mailFolder.expunge();
if (rc)
KMessageBox::information( 0, i18n("Cannot remove mail from\nmailbox `%1':\n%2").arg(mailFolder.location()).arg(strerror(rc)));
KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission completed." ));
}
// else warning is written already

@ -337,8 +337,8 @@ void KMFolder::close(bool aForced)
void KMFolder::sync()
{
if (mOpenCount > 0)
if (!mStream || !fsync(fileno(mStream)) ||
!mIndexStream || !fsync(fileno(mIndexStream))) {
if (!mStream || fsync(fileno(mStream)) ||
!mIndexStream || fsync(fileno(mIndexStream))) {
kdDebug(5006) << "Error: Could not sync folder" << endl;
kdDebug(5006) << "Abnormally terminating to prevent data loss, now." << endl;
exit(1);
@ -1462,7 +1462,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret, bool imapQuiet)
size = ftell(mStream) - offs;
error = ferror(mStream);
if (error || fsync( fileno( mStream ))) {
if (error) {
kdDebug(5006) << "Error: Could not add message to folder (No space left on device?)" << endl;
if (ftell(mStream) > revert) {
kdDebug(5006) << "Undoing changes" << endl;
@ -1527,7 +1527,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret, bool imapQuiet)
fflush(mIndexStream);
error = ferror(mIndexStream);
if (error || fsync( fileno( mIndexStream ))) {
if (error) {
kdDebug(5006) << "Error: Could not add message to folder (No space left on device?)" << endl;
if (ftell(mIndexStream) > revert) {
kdDebug(5006) << "Undoing changes" << endl;

@ -167,7 +167,7 @@ public:
others still use it (e.g. other mail reader windows). */
virtual void close(bool force=FALSE);
/* sync buffers to disk */
/* fsync buffers to disk */
virtual void sync();
/** Test if folder is opened. */

@ -88,7 +88,7 @@ void KMFolderMgr::setBasePath(const QString& aBasePath)
}
else
mBasePath = aBasePath;
dir.setPath(mBasePath);
if (!dir.exists())
@ -111,8 +111,8 @@ KMFolder* KMFolderMgr::createFolder(const QString& fName, bool sysFldr,
KMFolderDir *aFolderDir)
{
KMFolder* fld;
KMFolderDir *fldDir = aFolderDir;
KMFolderDir *fldDir = aFolderDir;
if (!aFolderDir)
fldDir = &mDir;
fld = fldDir->createFolder(fName, sysFldr);
@ -156,9 +156,9 @@ KMFolder* KMFolderMgr::findIdString(const QString& folderId, KMFolderDir *dir)
}
else {
folder = static_cast<KMFolder*>(node);
if (folder->idString()==folderId)
if (folder->idString()==folderId)
return folder;
}
}
}
return 0;
}
@ -242,23 +242,23 @@ void KMFolderMgr::reload(void)
}
//-----------------------------------------------------------------------------
void KMFolderMgr::createFolderList(QStringList *str,
void KMFolderMgr::createFolderList(QStringList *str,
QValueList<QGuardedPtr<KMFolder> > *folders)
{
createFolderList( str, folders, 0, "" );
}
//-----------------------------------------------------------------------------
void KMFolderMgr::createI18nFolderList(QStringList *str,
void KMFolderMgr::createI18nFolderList(QStringList *str,
QValueList<QGuardedPtr<KMFolder> > *folders)
{
createFolderList( str, folders, 0, QString::null, true );
}
//-----------------------------------------------------------------------------
void KMFolderMgr::createFolderList(QStringList *str,
void KMFolderMgr::createFolderList(QStringList *str,
QValueList<QGuardedPtr<KMFolder> > *folders,
KMFolderDir *adir,
KMFolderDir *adir,
const QString& prefix,
bool i18nized)
{
@ -280,5 +280,23 @@ void KMFolderMgr::createFolderList(QStringList *str,
}
}
//-----------------------------------------------------------------------------
void KMFolderMgr::syncAllFolders( KMFolderDir *adir )
{
KMFolderNode* cur;
KMFolderDir* fdir = adir ? adir : &mDir;
for (cur=fdir->first(); cur; cur=fdir->next()) {
if (cur->isDir())
continue;
KMFolder *folder = static_cast<KMFolder*>(cur);
if (folder->isOpened())
folder->sync();
if (folder->child())
syncAllFolders( folder->child() );
}
}
//-----------------------------------------------------------------------------
#include "kmfoldermgr.moc"

@ -66,6 +66,9 @@ public:
virtual void createI18nFolderList( QStringList *str,
QValueList<QGuardedPtr<KMFolder> > *folders );
/* fsync all open folders to disk */
virtual void syncAllFolders( KMFolderDir *adir = 0 );
public slots:
/** Compacts all folders (they know is it needed) */
void compactAll();

Loading…
Cancel
Save