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