Fixed synchronization

This commit is contained in:
M66B 2018-10-07 18:43:44 +00:00
parent 8f784c8954
commit b75088833e
1 changed files with 43 additions and 73 deletions

View File

@ -576,10 +576,7 @@ public class ServiceSynchronize extends LifecycleService {
public void notification(StoreEvent e) {
Log.i(Helper.TAG, account.name + " event: " + e.getMessage());
db.account().setAccountError(account.id, e.getMessage());
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
});
@ -588,9 +585,7 @@ public class ServiceSynchronize extends LifecycleService {
@Override
public void folderCreated(FolderEvent e) {
Log.i(Helper.TAG, "Folder created=" + e.getFolder().getFullName());
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
@Override
@ -602,17 +597,13 @@ public class ServiceSynchronize extends LifecycleService {
int count = db.folder().renameFolder(account.id, old, name);
Log.i(Helper.TAG, "Renamed to " + name + " count=" + count);
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
@Override
public void folderDeleted(FolderEvent e) {
Log.i(Helper.TAG, "Folder deleted=" + e.getFolder().getFullName());
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
});
@ -722,9 +713,7 @@ public class ServiceSynchronize extends LifecycleService {
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
}
}
@ -751,9 +740,7 @@ public class ServiceSynchronize extends LifecycleService {
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
}
}
@ -801,9 +788,7 @@ public class ServiceSynchronize extends LifecycleService {
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
}
}
}
@ -826,9 +811,7 @@ public class ServiceSynchronize extends LifecycleService {
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
} finally {
if (!capIdle)
Log.i(Helper.TAG, folder.name + " end polling");
@ -845,7 +828,7 @@ public class ServiceSynchronize extends LifecycleService {
public void run() {
try {
Log.i(Helper.TAG, folder.name + " start idle");
while (state.running && ifolder.isOpen()) {
while (state.running) {
Log.i(Helper.TAG, folder.name + " do idle");
ifolder.idle(false);
//Log.i(Helper.TAG, folder.name + " done idle");
@ -856,9 +839,7 @@ public class ServiceSynchronize extends LifecycleService {
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex));
synchronized (state) {
state.notifyAll();
}
state.thread.interrupt();
} finally {
Log.i(Helper.TAG, folder.name + " end idle");
}
@ -956,20 +937,23 @@ public class ServiceSynchronize extends LifecycleService {
while (state.running) {
EntityLog.log(this, account.name + " wait=" + account.poll_interval);
synchronized (state) {
try {
state.wait(account.poll_interval * 60 * 1000L);
} catch (InterruptedException ex) {
Log.w(Helper.TAG, account.name + " wait " + ex.toString());
}
try {
Thread.sleep(account.poll_interval * 60 * 1000L);
} catch (InterruptedException ex) {
Log.w(Helper.TAG, account.name + " wait " + ex.toString());
}
if (!istore.isConnected())
throw new StoreClosedException(istore);
if (state.running) {
EntityLog.log(this, account.name + " checking store");
if (!istore.isConnected())
throw new StoreClosedException(istore);
for (EntityFolder folder : folders.keySet())
if (!folders.get(folder).isOpen())
throw new FolderClosedException(folders.get(folder));
for (EntityFolder folder : folders.keySet()) {
EntityLog.log(this, account.name + " checking " + folder.name);
if (!folders.get(folder).isOpen())
throw new FolderClosedException(folders.get(folder));
}
}
}
Log.i(Helper.TAG, account.name + " done running=" + state.running);
} finally {
@ -1830,7 +1814,6 @@ public class ServiceSynchronize extends LifecycleService {
private ServiceState state;
private boolean running = false;
private long lastLost = 0;
private Thread main;
private EntityFolder outbox = null;
private ExecutorService lifecycle = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory);
private ExecutorService executor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory);
@ -1879,9 +1862,8 @@ public class ServiceSynchronize extends LifecycleService {
EntityLog.log(ServiceSynchronize.this, "Main start");
state = new ServiceState();
main = new Thread(new Runnable() {
private Map<Thread, ServiceState> threadState = new HashMap<>();
state.thread = new Thread(new Runnable() {
private List<ServiceState> threadState = new ArrayList<>();
@Override
public void run() {
@ -1931,7 +1913,7 @@ public class ServiceSynchronize extends LifecycleService {
for (final EntityAccount account : accounts) {
Log.i(Helper.TAG, account.host + "/" + account.user + " run");
final ServiceState astate = new ServiceState();
Thread t = new Thread(new Runnable() {
astate.thread = new Thread(new Runnable() {
@Override
public void run() {
try {
@ -1942,30 +1924,23 @@ public class ServiceSynchronize extends LifecycleService {
}
}
}, "sync.account." + account.id);
t.start();
threadState.put(t, astate);
astate.thread.start();
threadState.add(astate);
}
EntityLog.log(ServiceSynchronize.this, "Main started");
synchronized (state) {
try {
if (state.running)
state.wait();
} catch (InterruptedException ex) {
Log.w(Helper.TAG, "main wait " + ex.toString());
}
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException ex) {
Log.w(Helper.TAG, "main wait " + ex.toString());
}
// Stop monitoring accounts
for (Thread t : threadState.keySet()) {
ServiceState astate = threadState.get(t);
synchronized (astate) {
astate.running = false;
astate.notifyAll();
}
t.interrupt();
join(t);
for (ServiceState astate : threadState) {
astate.running = false;
astate.thread.interrupt();
join(astate.thread);
}
threadState.clear();
@ -1981,25 +1956,19 @@ public class ServiceSynchronize extends LifecycleService {
}
}
}, "sync.main");
main.setPriority(THREAD_PRIORITY_BACKGROUND); // will be inherited
main.start();
state.thread.setPriority(THREAD_PRIORITY_BACKGROUND); // will be inherited
state.thread.start();
}
private void stop() {
EntityLog.log(ServiceSynchronize.this, "Main stop");
synchronized (state) {
state.running = false;
state.notifyAll();
}
// stop wait or backoff
main.interrupt();
join(main);
state.running = false;
state.thread.interrupt();
join(state.thread);
EntityLog.log(ServiceSynchronize.this, "Main stopped");
main = null;
state = null;
}
@ -2066,5 +2035,6 @@ public class ServiceSynchronize extends LifecycleService {
private class ServiceState {
boolean running = true;
Thread thread;
}
}