private ZooKeeperUpdatingPersistentDirectory(final String name, final ZooKeeperClientProvider provider, final Path stateFile, final String path) throws IOException, InterruptedException { this.provider = provider; this.path = path; this.entries = PersistentAtomicReference.create(stateFile, ENTRIES_TYPE, Suppliers.ofInstance(EMPTY_ENTRIES)); this.reactor = new DefaultReactor(name, new Update(), RETRY_INTERVAL_MILLIS); }
private void incrementalUpdate() throws KeeperException { final MapDifference<String, byte[]> difference = Maps.difference(entries.get(), remote, BYTE_ARRAY_EQUIVALENCE); if (difference.areEqual()) { return; } final Map<String, byte[]> newRemote = Maps.newHashMap(remote); final Map<String, byte[]> create = difference.entriesOnlyOnLeft(); final Map<String, ValueDifference<byte[]>> update = difference.entriesDiffering(); final Map<String, byte[]> delete = difference.entriesOnlyOnRight(); log.debug("create: {}", create.keySet()); log.debug("update: {}", update.keySet()); log.debug("delete: {}", delete.keySet()); for (final Map.Entry<String, byte[]> entry : create.entrySet()) { write(entry.getKey(), entry.getValue()); newRemote.put(entry.getKey(), entry.getValue()); } for (final Map.Entry<String, ValueDifference<byte[]>> entry : update.entrySet()) { write(entry.getKey(), entry.getValue().leftValue()); newRemote.put(entry.getKey(), entry.getValue().leftValue()); } for (final Map.Entry<String, byte[]> entry : delete.entrySet()) { delete(entry.getKey()); newRemote.remove(entry.getKey()); } remote = newRemote; }
.newScheduler(); while (isAlive()) { try { if (!parentExists()) { log.warn("parent does not exist: {}", path); return; syncChecked(); initialized = true; incrementalUpdate(); return; } catch (KeeperException e) {
.newScheduler(); while (isAlive()) { try { if (!parentExists()) { log.warn("parent does not exist: {}", path); return; syncChecked(); initialized = true; incrementalUpdate(); return; } catch (KeeperException e) {
private void incrementalUpdate() throws KeeperException { final MapDifference<String, byte[]> difference = Maps.difference(entries.get(), remote, BYTE_ARRAY_EQUIVALENCE); if (difference.areEqual()) { return; } final Map<String, byte[]> newRemote = Maps.newHashMap(remote); final Map<String, byte[]> create = difference.entriesOnlyOnLeft(); final Map<String, ValueDifference<byte[]>> update = difference.entriesDiffering(); final Map<String, byte[]> delete = difference.entriesOnlyOnRight(); log.debug("create: {}", create.keySet()); log.debug("update: {}", update.keySet()); log.debug("delete: {}", delete.keySet()); for (final Map.Entry<String, byte[]> entry : create.entrySet()) { write(entry.getKey(), entry.getValue()); newRemote.put(entry.getKey(), entry.getValue()); } for (final Map.Entry<String, ValueDifference<byte[]>> entry : update.entrySet()) { write(entry.getKey(), entry.getValue().leftValue()); newRemote.put(entry.getKey(), entry.getValue().leftValue()); } for (final Map.Entry<String, byte[]> entry : delete.entrySet()) { delete(entry.getKey()); newRemote.remove(entry.getKey()); } remote = newRemote; }
private ZooKeeperUpdatingPersistentDirectory(final String name, final ZooKeeperClientProvider provider, final Path stateFile, final String path) throws IOException, InterruptedException { this.provider = provider; this.path = path; this.entries = PersistentAtomicReference.create(stateFile, ENTRIES_TYPE, Suppliers.ofInstance(EMPTY_ENTRIES)); this.reactor = new DefaultReactor(name, new Update(), RETRY_INTERVAL_MILLIS); }