Added sync/download yield

This commit is contained in:
M66B 2020-09-02 10:12:43 +02:00
parent 83b4c13284
commit 9a2b0d167f
1 changed files with 29 additions and 5 deletions

View File

@ -135,6 +135,10 @@ class Core {
private static final int SYNC_CHUNCK_SIZE = 200; private static final int SYNC_CHUNCK_SIZE = 200;
private static final int SYNC_BATCH_SIZE = 20; private static final int SYNC_BATCH_SIZE = 20;
private static final int DOWNLOAD_BATCH_SIZE = 20; private static final int DOWNLOAD_BATCH_SIZE = 20;
private static final int SYNC_YIELD_COUNT = 100;
private static final long SYNC_YIELD_DURATION = 1000; // milliseconds
private static final int DOWNLOAD_YIELD_COUNT = 25;
private static final long DOWNLOAD_YIELD_DURATION = 1000; // milliseconds
private static final long YIELD_DURATION = 200L; // milliseconds private static final long YIELD_DURATION = 200L; // milliseconds
private static final long JOIN_WAIT = 180 * 1000L; // milliseconds private static final long JOIN_WAIT = 180 * 1000L; // milliseconds
private static final long FUTURE_RECEIVED = 30 * 24 * 3600 * 1000L; // milliseconds private static final long FUTURE_RECEIVED = 30 * 24 * 3600 * 1000L; // milliseconds
@ -2344,6 +2348,7 @@ class Core {
fp.add(GmailFolder.FetchProfileItem.THRID); fp.add(GmailFolder.FetchProfileItem.THRID);
// Add/update local messages // Add/update local messages
int synced = 0;
Long[] ids = new Long[imessages.length]; Long[] ids = new Long[imessages.length];
Log.i(folder.name + " add=" + imessages.length); Log.i(folder.name + " add=" + imessages.length);
for (int i = imessages.length - 1; i >= 0 && state.isRunning() && state.isRecoverable(); i -= SYNC_BATCH_SIZE) { for (int i = imessages.length - 1; i >= 0 && state.isRunning() && state.isRecoverable(); i -= SYNC_BATCH_SIZE) {
@ -2399,6 +2404,15 @@ class Core {
false, download && initialize == 0, false, download && initialize == 0,
rules, state, stats); rules, state, stats);
ids[from + j] = (message == null || message.ui_hide ? null : message.id); ids[from + j] = (message == null || message.ui_hide ? null : message.id);
if (message != null && full.contains(isub[j]))
if ((++synced % SYNC_YIELD_COUNT) == 0)
try {
Log.i(folder.name + " yield synced=" + synced);
Thread.sleep(SYNC_YIELD_DURATION);
} catch (InterruptedException ex) {
Log.w(ex);
}
} catch (MessageRemovedException ex) { } catch (MessageRemovedException ex) {
Log.w(folder.name, ex); Log.w(folder.name, ex);
} catch (FolderClosedException ex) { } catch (FolderClosedException ex) {
@ -2442,6 +2456,7 @@ class Core {
db.folder().setFolderSyncState(folder.id, "downloading"); db.folder().setFolderSyncState(folder.id, "downloading");
// Download messages/attachments // Download messages/attachments
int downloaded = 0;
Log.i(folder.name + " download=" + imessages.length); Log.i(folder.name + " download=" + imessages.length);
for (int i = imessages.length - 1; i >= 0 && state.isRunning() && state.isRecoverable(); i -= DOWNLOAD_BATCH_SIZE) { for (int i = imessages.length - 1; i >= 0 && state.isRunning() && state.isRecoverable(); i -= DOWNLOAD_BATCH_SIZE) {
int from = Math.max(0, i - DOWNLOAD_BATCH_SIZE + 1); int from = Math.max(0, i - DOWNLOAD_BATCH_SIZE + 1);
@ -2461,12 +2476,19 @@ class Core {
for (int j = isub.length - 1; j >= 0 && state.isRunning() && state.isRecoverable(); j--) for (int j = isub.length - 1; j >= 0 && state.isRunning() && state.isRecoverable(); j--)
try { try {
if (ids[from + j] != null) if (ids[from + j] != null)
downloadMessage( if (downloadMessage(
context, context,
account, folder, account, folder,
istore, ifolder, istore, ifolder,
(MimeMessage) isub[j], ids[from + j], (MimeMessage) isub[j], ids[from + j],
state, stats); state, stats))
if ((++downloaded % DOWNLOAD_YIELD_COUNT) == 0)
try {
Log.i(folder.name + " yield downloaded=" + downloaded);
Thread.sleep(DOWNLOAD_YIELD_DURATION);
} catch (InterruptedException ex) {
Log.w(ex);
}
} catch (FolderClosedException ex) { } catch (FolderClosedException ex) {
throw ex; throw ex;
} catch (Throwable ex) { } catch (Throwable ex) {
@ -3163,18 +3185,18 @@ class Core {
} }
} }
private static void downloadMessage( private static boolean downloadMessage(
Context context, Context context,
EntityAccount account, EntityFolder folder, EntityAccount account, EntityFolder folder,
IMAPStore istore, IMAPFolder ifolder, IMAPStore istore, IMAPFolder ifolder,
MimeMessage imessage, long id, State state, SyncStats stats) throws MessagingException, IOException { MimeMessage imessage, long id, State state, SyncStats stats) throws MessagingException, IOException {
if (state.getNetworkState().isRoaming()) if (state.getNetworkState().isRoaming())
return; return false;
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
EntityMessage message = db.message().getMessage(id); EntityMessage message = db.message().getMessage(id);
if (message == null || message.ui_hide) if (message == null || message.ui_hide)
return; return false;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
long maxSize = prefs.getInt("download", MessageHelper.DEFAULT_DOWNLOAD_SIZE); long maxSize = prefs.getInt("download", MessageHelper.DEFAULT_DOWNLOAD_SIZE);
@ -3254,6 +3276,8 @@ class Core {
db.attachment().setError(attachment.id, Log.formatThrowable(ex, false)); db.attachment().setError(attachment.id, Log.formatThrowable(ex, false));
} }
} }
return fetch;
} }
private static void reportEmptyMessage(Context context, State state, EntityAccount account, IMAPStore istore) { private static void reportEmptyMessage(Context context, State state, EntityAccount account, IMAPStore istore) {