Return-Path: X-Original-To: apmail-brooklyn-commits-archive@minotaur.apache.org Delivered-To: apmail-brooklyn-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 18E5218EE4 for ; Sat, 1 Aug 2015 15:46:13 +0000 (UTC) Received: (qmail 77278 invoked by uid 500); 1 Aug 2015 15:46:13 -0000 Delivered-To: apmail-brooklyn-commits-archive@brooklyn.apache.org Received: (qmail 77256 invoked by uid 500); 1 Aug 2015 15:46:13 -0000 Mailing-List: contact commits-help@brooklyn.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@brooklyn.incubator.apache.org Delivered-To: mailing list commits@brooklyn.incubator.apache.org Received: (qmail 77246 invoked by uid 99); 1 Aug 2015 15:46:12 -0000 Received: from Unknown (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Aug 2015 15:46:12 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 67B48C093B for ; Sat, 1 Aug 2015 15:46:12 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.77 X-Spam-Level: * X-Spam-Status: No, score=1.77 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id fTF2-nrR7nOW for ; Sat, 1 Aug 2015 15:45:57 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with SMTP id CEC91267C1 for ; Sat, 1 Aug 2015 15:45:54 +0000 (UTC) Received: (qmail 76279 invoked by uid 99); 1 Aug 2015 15:45:54 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Aug 2015 15:45:54 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 76043E05D6; Sat, 1 Aug 2015 15:45:54 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hadrian@apache.org To: commits@brooklyn.incubator.apache.org Date: Sat, 01 Aug 2015 15:46:04 -0000 Message-Id: <996c592366f04b5bac799f8c8b600ace@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [11/21] incubator-brooklyn git commit: Delete deprecated memento persisters Delete deprecated memento persisters Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/358806da Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/358806da Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/358806da Branch: refs/heads/master Commit: 358806dab5cc19c8e4a6a2dfb9913bda10f5499a Parents: b53a79a Author: Aled Sage Authored: Tue Jul 28 22:58:50 2015 +0100 Committer: Aled Sage Committed: Sat Aug 1 00:13:32 2015 +0100 ---------------------------------------------------------------------- .../AbstractBrooklynMementoPersister.java | 129 ---- .../BrooklynMementoPersisterInMemory.java | 211 ------- .../BrooklynMementoPersisterToFile.java | 147 ----- .../BrooklynMementoPersisterToMultiFile.java | 601 ------------------- .../rebind/persister/MementoFileWriter.java | 267 -------- .../rebind/persister/MementoFileWriterSync.java | 159 ----- ...mentPlaneSyncRecordPersisterToMultiFile.java | 280 --------- ...BrooklynMementoPersisterToMultiFileTest.java | 68 --- .../persister/MementoFileWriterSyncTest.java | 128 ---- .../rebind/persister/MementoFileWriterTest.java | 99 --- 10 files changed, 2089 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java deleted file mode 100644 index d3f85df..0000000 --- a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import static com.google.common.base.Preconditions.checkNotNull; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.rebind.PersistenceExceptionHandler; -import brooklyn.entity.rebind.RebindExceptionHandler; -import brooklyn.entity.rebind.dto.BrooklynMementoManifestImpl; -import brooklyn.entity.rebind.dto.MutableBrooklynMemento; -import brooklyn.mementos.BrooklynMemento; -import brooklyn.mementos.BrooklynMementoManifest; -import brooklyn.mementos.BrooklynMementoPersister; -import brooklyn.mementos.BrooklynMementoRawData; -import brooklyn.mementos.CatalogItemMemento; -import brooklyn.mementos.EnricherMemento; -import brooklyn.mementos.EntityMemento; -import brooklyn.mementos.LocationMemento; -import brooklyn.mementos.PolicyMemento; - -/** - * @deprecated since 0.7.0 for production use {@link BrooklynMementoPersisterToObjectStore} instead - */ -@Deprecated -public abstract class AbstractBrooklynMementoPersister implements BrooklynMementoPersister { - - private static final Logger log = LoggerFactory.getLogger(AbstractBrooklynMementoPersister.class); - - protected volatile MutableBrooklynMemento memento = new MutableBrooklynMemento(); - - @Override - public BrooklynMementoRawData loadMementoRawData(RebindExceptionHandler exceptionHandler) { - return null; - } - - @Override - public BrooklynMemento loadMemento(BrooklynMementoRawData mementoData, LookupContext lookupContext, RebindExceptionHandler exceptionHandler) { - // Trusting people not to cast+modify, because the in-memory persister wouldn't be used in production code - return memento; - } - - @Override - public BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) { - return loadMemento(null, lookupContext, exceptionHandler); - } - - @Override - public BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) { - return loadMementoManifest(null, exceptionHandler); - } - - @Override - public BrooklynMementoManifest loadMementoManifest(BrooklynMementoRawData mementoData, RebindExceptionHandler exceptionHandler) { - BrooklynMementoManifestImpl.Builder builder = BrooklynMementoManifestImpl.builder(); - for (EntityMemento entity : memento.getEntityMementos().values()) { - builder.entity(entity.getId(), entity.getType(), entity.getParent(), entity.getCatalogItemId()); - } - for (LocationMemento entity : memento.getLocationMementos().values()) { - builder.location(entity.getId(), entity.getType()); - } - for (PolicyMemento entity : memento.getPolicyMementos().values()) { - builder.policy(entity.getId(), entity.getType()); - } - for (EnricherMemento entity : memento.getEnricherMementos().values()) { - builder.enricher(entity.getId(), entity.getType()); - } - for (CatalogItemMemento entity : memento.getCatalogItemMementos().values()) { - builder.catalogItem(entity); - } - return builder.build(); - } - - @Override public void enableWriteAccess() {} - @Override public void disableWriteAccess(boolean graceful) {} - @Override public void stop(boolean graceful) {} - - @Override - public void checkpoint(BrooklynMemento newMemento, PersistenceExceptionHandler exceptionHandler) { - memento.reset(checkNotNull(newMemento, "memento")); - } - - public void checkpoint(BrooklynMementoRawData newMemento, PersistenceExceptionHandler exceptionHandler) { - throw new IllegalStateException("Not supported; use "+BrooklynMementoPersisterToObjectStore.class); - } - - @Override - public void delta(Delta delta, PersistenceExceptionHandler exceptionHanlder) { - memento.removeEntities(delta.removedEntityIds()); - memento.removeLocations(delta.removedLocationIds()); - memento.removePolicies(delta.removedPolicyIds()); - memento.removeEnrichers(delta.removedEnricherIds()); - memento.removeCatalogItems(delta.removedCatalogItemIds()); - memento.updateEntityMementos(delta.entities()); - memento.updateLocationMementos(delta.locations()); - memento.updatePolicyMementos(delta.policies()); - memento.updateEnricherMementos(delta.enrichers()); - memento.updateCatalogItemMementos(delta.catalogItems()); - } - - @Override - public void queueDelta(Delta delta) { - log.warn("Legacy persister ignoring queued delta: "+delta); - } - - @Override - public String getBackingStoreDescription() { - return toString(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java deleted file mode 100644 index dbb1e52..0000000 --- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import brooklyn.basic.BrooklynObject; -import brooklyn.catalog.CatalogItem; -import brooklyn.entity.Entity; -import brooklyn.entity.Feed; -import brooklyn.entity.basic.EntityInternal; -import brooklyn.entity.proxying.EntityProxy; -import brooklyn.entity.rebind.BrooklynObjectType; -import brooklyn.entity.rebind.PersistenceExceptionHandler; -import brooklyn.entity.rebind.PersistenceExceptionHandlerImpl; -import brooklyn.entity.rebind.RebindExceptionHandler; -import brooklyn.entity.rebind.RebindExceptionHandlerImpl; -import brooklyn.entity.rebind.RebindManager; -import brooklyn.location.Location; -import brooklyn.management.ManagementContext; -import brooklyn.mementos.BrooklynMemento; -import brooklyn.mementos.BrooklynMementoManifest; -import brooklyn.policy.Enricher; -import brooklyn.policy.Policy; -import brooklyn.util.collections.MutableList; -import brooklyn.util.collections.MutableMap; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.javalang.JavaClassNames; -import brooklyn.util.javalang.Reflections; -import brooklyn.util.os.Os; -import brooklyn.util.time.Duration; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Optional; -import com.google.common.base.Throwables; - -/** - * @deprecated since 0.7.0 for production use {@link BrooklynMementoPersisterToObjectStore} instead; class be moved to tests - * - * new BrooklynMementoPersisterToObjectStore(new InMemoryObjectStore(), classLoader) - * - */ -@Deprecated -public class BrooklynMementoPersisterInMemory extends AbstractBrooklynMementoPersister { - - private final ClassLoader classLoader; - private final boolean checkPersistable; - - public BrooklynMementoPersisterInMemory(ClassLoader classLoader) { - this(classLoader, true); - } - - public BrooklynMementoPersisterInMemory(ClassLoader classLoader, boolean checkPersistable) { - this.classLoader = checkNotNull(classLoader, "classLoader"); - this.checkPersistable = checkPersistable; - } - - @VisibleForTesting - @Override - public void waitForWritesCompleted(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { - } - - @VisibleForTesting - @Override - public void waitForWritesCompleted(Duration timeout) throws InterruptedException, TimeoutException { - // TODO Could wait for concurrent checkpoint/delta, but don't need to for tests - // because first waits for checkpoint/delta to have been called by RebindManagerImpl. - return; - } - - @Override - public void checkpoint(BrooklynMemento newMemento, PersistenceExceptionHandler exceptionHandler) { - super.checkpoint(newMemento, exceptionHandler); - if (checkPersistable) reserializeMemento(); - } - - @Override - public void delta(Delta delta, PersistenceExceptionHandler exceptionHandler) { - super.delta(delta, exceptionHandler); - if (checkPersistable) reserializeMemento(); - } - - private void reserializeMemento() { - // To confirm always serializable - try { - File tempDir = Os.newTempDir(JavaClassNames.cleanSimpleClassName(this)); - try { - // TODO Duplicate code for LookupContext in RebindManager - BrooklynMementoPersisterToMultiFile persister = new BrooklynMementoPersisterToMultiFile(tempDir , classLoader); - RebindExceptionHandler rebindExceptionHandler = RebindExceptionHandlerImpl.builder() - .danglingRefFailureMode(RebindManager.RebindFailureMode.FAIL_AT_END) - .rebindFailureMode(RebindManager.RebindFailureMode.FAIL_AT_END) - .build(); - PersistenceExceptionHandler persistenceExceptionHandler = PersistenceExceptionHandlerImpl.builder().build(); - persister.checkpoint(memento, persistenceExceptionHandler); - final BrooklynMementoManifest manifest = persister.loadMementoManifest(null, rebindExceptionHandler); - LookupContext dummyLookupContext = new LookupContext() { - @Override - public ManagementContext lookupManagementContext() { - return null; - } - @Override public Entity lookupEntity(String id) { - List> types = MutableList.>builder() - .add(Entity.class, EntityInternal.class, EntityProxy.class) - //TODO Doesn't support loading from catalog item osgi bundles - .add(loadClass(manifest.getEntityIdToManifest().get(id).getType())) - .build(); - return (Entity) java.lang.reflect.Proxy.newProxyInstance( - classLoader, - types.toArray(new Class[types.size()]), - new InvocationHandler() { - @Override public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { - return m.invoke(this, args); - } - }); - } - @Override public Location lookupLocation(String id) { - Class clazz = loadClass(manifest.getLocationIdToType().get(id)); - return (Location) invokeConstructor(clazz, new Object[0], new Object[] {MutableMap.of()}); - } - @Override public Policy lookupPolicy(String id) { - Class clazz = loadClass(manifest.getPolicyIdToType().get(id)); - return (Policy) invokeConstructor(clazz, new Object[0], new Object[] {MutableMap.of()}); - } - @Override public Enricher lookupEnricher(String id) { - Class clazz = loadClass(manifest.getEnricherIdToType().get(id)); - return (Enricher) invokeConstructor(clazz, new Object[0], new Object[] {MutableMap.of()}); - } - @Override public Feed lookupFeed(String id) { - Class clazz = loadClass(manifest.getFeedIdToType().get(id)); - return (Feed) invokeConstructor(clazz, new Object[0], new Object[] {MutableMap.of()}); - } - @Override public CatalogItem lookupCatalogItem(String id) { - Class clazz = loadClass(manifest.getCatalogItemMemento(id).getType()); - return (CatalogItem) invokeConstructor(clazz, new Object[0]); - } - - @Override - public BrooklynObject lookup(BrooklynObjectType type, String id) { - switch (type) { - case CATALOG_ITEM: return lookupCatalogItem(id); - case ENRICHER: return lookupEnricher(id); - case ENTITY: return lookupEntity(id); - case FEED: return lookupFeed(id); - case LOCATION: return lookupLocation(id); - case POLICY: return lookupPolicy(id); - case UNKNOWN: return null; - } - throw new IllegalStateException("Unexpected type "+type+" / id "+id); - } - @Override - public BrooklynObject peek(BrooklynObjectType type, String id) { - return lookup(type, id); - } - - private Class loadClass(String name) { - try { - return classLoader.loadClass(name); - } catch (ClassNotFoundException e) { - throw Exceptions.propagate(e); - } - } - private T invokeConstructor(Class clazz, Object[]... possibleArgs) { - for (Object[] args : possibleArgs) { - try { - Optional v = Reflections.invokeConstructorWithArgs(clazz, args, true); - if (v.isPresent()) { - return v.get(); - } - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - throw new IllegalStateException("Cannot instantiate instance of type "+clazz+"; expected constructor signature not found"); - } - }; - - // Not actually reconstituting, because need to use a real lookupContext to reconstitute all the entities - persister.loadMemento(null, dummyLookupContext, rebindExceptionHandler); - } finally { - Os.deleteRecursively(tempDir); - } - } catch (IOException e) { - throw Throwables.propagate(e); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java deleted file mode 100644 index 68dd6eb..0000000 --- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.rebind.PersistenceExceptionHandler; -import brooklyn.entity.rebind.RebindExceptionHandler; -import brooklyn.mementos.BrooklynMemento; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; -import com.google.common.base.Stopwatch; -import com.google.common.io.Files; - -/** - * @deprecated since 0.7.0 use BrooklynMementoPersisterToMultiFile instead; the single-file version - * has not been tested recently or kept up-to-date. - */ -@Deprecated -public class BrooklynMementoPersisterToFile extends AbstractBrooklynMementoPersister { - - // FIXME This is no longer used (instead we use ToMultiFile). - // Is this definitely no longer useful? Delete if not, and - // merge AbstractBrooklynMementoPersister+BrooklynMementoPerisisterInMemory. - - private static final Logger LOG = LoggerFactory.getLogger(BrooklynMementoPersisterToFile.class); - - private final File file; - private final MementoSerializer serializer; - private final Object mutex = new Object(); - - - public BrooklynMementoPersisterToFile(File file, ClassLoader classLoader) { - this.file = file; - this.serializer = new XmlMementoSerializer(classLoader); - } - - @VisibleForTesting - @Override - public void waitForWritesCompleted(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { - } - - @VisibleForTesting - @Override - public void waitForWritesCompleted(Duration timeout) throws InterruptedException, TimeoutException { - // TODO Could wait for concurrent checkpoint/delta, but don't need to for tests - // because they first wait for checkpoint/delta to have been called by RebindManagerImpl. - return; - } - - @Override - public BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) { - Stopwatch stopwatch = Stopwatch.createStarted(); - - String xml = readFile(); - serializer.setLookupContext(lookupContext); - try { - BrooklynMemento result = serializer.fromString(xml); - - if (LOG.isDebugEnabled()) LOG.debug("Loaded memento; took {}", Time.makeTimeStringRounded(stopwatch)); - return result; - - } finally { - serializer.unsetLookupContext(); - } - } - - private String readFile() { - try { - synchronized (mutex) { - return Files.asCharSource(file, Charsets.UTF_8).read(); - } - } catch (IOException e) { - LOG.error("Failed to persist memento", e); - throw Exceptions.propagate(e); - } - } - - @Override - public void checkpoint(BrooklynMemento newMemento, PersistenceExceptionHandler exceptionHandler) { - Stopwatch stopwatch = Stopwatch.createStarted(); - synchronized (mutex) { - long timeObtainedMutex = stopwatch.elapsed(TimeUnit.MILLISECONDS); - super.checkpoint(newMemento, exceptionHandler); - long timeCheckpointed = stopwatch.elapsed(TimeUnit.MILLISECONDS); - writeMemento(); - long timeWritten = stopwatch.elapsed(TimeUnit.MILLISECONDS); - - if (LOG.isDebugEnabled()) LOG.debug("Checkpointed memento; total={}ms, obtainingMutex={}ms, " + - "checkpointing={}ms, writing={}ms", - new Object[] {timeWritten, timeObtainedMutex, (timeCheckpointed-timeObtainedMutex), - (timeWritten-timeCheckpointed)}); - } - } - - @Override - public void delta(Delta delta, PersistenceExceptionHandler exceptionHandler) { - Stopwatch stopwatch = Stopwatch.createStarted(); - synchronized (mutex) { - long timeObtainedMutex = stopwatch.elapsed(TimeUnit.MILLISECONDS); - super.delta(delta, exceptionHandler); - long timeDeltad = stopwatch.elapsed(TimeUnit.MILLISECONDS); - writeMemento(); - long timeWritten = stopwatch.elapsed(TimeUnit.MILLISECONDS); - - if (LOG.isDebugEnabled()) LOG.debug("Checkpointed memento; total={}ms, obtainingMutex={}ms, " + - "delta'ing={}ms, writing={}", - new Object[] {timeWritten, timeObtainedMutex, (timeDeltad-timeObtainedMutex), - (timeWritten-timeDeltad)}); - } - } - - private void writeMemento() { - assert Thread.holdsLock(mutex); - try { - Files.write(serializer.toString(memento), file, Charsets.UTF_8); - } catch (IOException e) { - LOG.error("Failed to persist memento", e); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java deleted file mode 100644 index afb3d61..0000000 --- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java +++ /dev/null @@ -1,601 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.rebind.BrooklynObjectType; -import brooklyn.entity.rebind.PersistenceExceptionHandler; -import brooklyn.entity.rebind.RebindExceptionHandler; -import brooklyn.entity.rebind.dto.BrooklynMementoImpl; -import brooklyn.entity.rebind.dto.BrooklynMementoManifestImpl; -import brooklyn.mementos.BrooklynMemento; -import brooklyn.mementos.BrooklynMementoManifest; -import brooklyn.mementos.BrooklynMementoPersister; -import brooklyn.mementos.BrooklynMementoRawData; -import brooklyn.mementos.CatalogItemMemento; -import brooklyn.mementos.EnricherMemento; -import brooklyn.mementos.EntityMemento; -import brooklyn.mementos.LocationMemento; -import brooklyn.mementos.PolicyMemento; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.text.Strings; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; -import brooklyn.util.xstream.XmlUtil; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; -import com.google.common.base.Stopwatch; -import com.google.common.io.Files; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; - -/** - * @deprecated since 0.7.0 use {@link BrooklynMementoPersisterToObjectStore} instead; - * it has a multi-file filesystem backend for equivalent functionality, but is pluggable - * to support other storage backends - */ -@Deprecated -public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersister { - - private static final Logger LOG = LoggerFactory.getLogger(BrooklynMementoPersisterToMultiFile.class); - - private static final int SHUTDOWN_TIMEOUT_MS = 10*1000; - - private final File dir; - - private final File entitiesDir; - private final File locationsDir; - private final File policiesDir; - private final File enrichersDir; - private final File catalogItemsDir; - - private final ConcurrentMap> entityWriters = new ConcurrentHashMap>(); - private final ConcurrentMap> locationWriters = new ConcurrentHashMap>(); - private final ConcurrentMap> policyWriters = new ConcurrentHashMap>(); - private final ConcurrentMap> enricherWriters = new ConcurrentHashMap>(); - private final ConcurrentMap> catalogItemWriters = new ConcurrentHashMap>(); - - private final MementoSerializer serializer; - - private final ListeningExecutorService executor; - - private static final int MAX_SERIALIZATION_ATTEMPTS = 5; - - private volatile boolean running = true; - - - public BrooklynMementoPersisterToMultiFile(File dir, ClassLoader classLoader) { - this.dir = checkNotNull(dir, "dir"); - MementoSerializer rawSerializer = new XmlMementoSerializer(classLoader); - this.serializer = new RetryingMementoSerializer(rawSerializer, MAX_SERIALIZATION_ATTEMPTS); - - checkDirIsAccessible(dir); - - entitiesDir = new File(dir, "entities"); - entitiesDir.mkdir(); - checkDirIsAccessible(entitiesDir); - - locationsDir = new File(dir, "locations"); - locationsDir.mkdir(); - checkDirIsAccessible(locationsDir); - - policiesDir = new File(dir, "policies"); - policiesDir.mkdir(); - checkDirIsAccessible(policiesDir); - - enrichersDir = new File(dir, "enrichers"); - enrichersDir.mkdir(); - checkDirIsAccessible(enrichersDir); - - catalogItemsDir = new File(dir, "catalog"); - catalogItemsDir.mkdir(); - checkDirIsAccessible(catalogItemsDir); - - File planeDir = new File(dir, "plane"); - planeDir.mkdir(); - checkDirIsAccessible(planeDir); - - this.executor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); - - LOG.info("Memento-persister will use directory {}", dir); - } - - @Override public void enableWriteAccess() { - // no-op -- means subsequent writes will not be enabled - } - - @Override public void disableWriteAccess(boolean graceful) { - stop(graceful); - } - - @Override - public void stop(boolean graceful) { - running = false; - if (graceful) { - executor.shutdown(); - try { - executor.awaitTermination(SHUTDOWN_TIMEOUT_MS, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - } else { - executor.shutdownNow(); - } - } - - @Override - public BrooklynMementoRawData loadMementoRawData(RebindExceptionHandler exceptionHandler) { - return null; - } - - @Override - public BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) throws IOException { - return loadMementoManifest(null, exceptionHandler); - } - - @Override - public BrooklynMementoManifest loadMementoManifest(BrooklynMementoRawData mementoData, RebindExceptionHandler exceptionHandler) throws IOException { - if (!running) { - throw new IllegalStateException("Persister not running; cannot load memento manifest from "+dir); - } - - Stopwatch stopwatch = Stopwatch.createStarted(); - - FileFilter fileFilter = new FileFilter() { - @Override public boolean accept(File file) { - return !file.getName().endsWith(".tmp"); - } - }; - File[] entityFiles; - File[] locationFiles; - File[] policyFiles; - File[] enricherFiles; - File[] catalogItemFiles; - try { - entityFiles = entitiesDir.listFiles(fileFilter); - locationFiles = locationsDir.listFiles(fileFilter); - policyFiles = policiesDir.listFiles(fileFilter); - enricherFiles = enrichersDir.listFiles(fileFilter); - catalogItemFiles = catalogItemsDir.listFiles(fileFilter); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e); - throw new IllegalStateException("Failed to list memento files in "+dir, e); - } - - LOG.info("Loading memento manifest from {}; {} entities, {} locations, {} policies, {} enrichers", - new Object[] {dir, entityFiles.length, locationFiles.length, policyFiles.length, enricherFiles.length}); - - BrooklynMementoManifestImpl.Builder builder = BrooklynMementoManifestImpl.builder(); - - try { - for (File file : entityFiles) { - try { - String contents = readFile(file); - String id = (String) XmlUtil.xpath(contents, "/entity/id"); - String type = (String) XmlUtil.xpath(contents, "/entity/type"); - String parentId = (String) XmlUtil.xpath(contents, "/entity/parent"); - String catalogItemId = (String) XmlUtil.xpath(contents, "/entity/catalogItemId"); - builder.entity(id, type, Strings.emptyToNull(parentId), Strings.emptyToNull(catalogItemId)); - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "File "+file, e); - } - } - for (File file : locationFiles) { - try { - String contents = readFile(file); - String id = (String) XmlUtil.xpath(contents, "/location/id"); - String type = (String) XmlUtil.xpath(contents, "/location/type"); - builder.location(id, type); - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.LOCATION, "File "+file, e); - } - } - for (File file : policyFiles) { - try { - String contents = readFile(file); - String id = (String) XmlUtil.xpath(contents, "/policy/id"); - String type = (String) XmlUtil.xpath(contents, "/policy/type"); - builder.policy(id, type); - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.POLICY, "File "+file, e); - } - } - for (File file : enricherFiles) { - try { - String contents = readFile(file); - String id = (String) XmlUtil.xpath(contents, "/enricher/id"); - String type = (String) XmlUtil.xpath(contents, "/enricher/type"); - builder.enricher(id, type); - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENRICHER, "File "+file, e); - } - } - for (File file : catalogItemFiles) { - try { - String contents = readFile(file); - String id = (String) XmlUtil.xpath(contents, "/catalogItem/id"); - String type = (String) XmlUtil.xpath(contents, "/catalogItem/type"); - builder.enricher(id, type); - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.CATALOG_ITEM, "File "+file, e); - } - } - - if (LOG.isDebugEnabled()) LOG.debug("Loaded memento manifest; took {}", Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS))); - return builder.build(); - - } finally { - serializer.unsetLookupContext(); - } - } - - @Override - public BrooklynMemento loadMemento(LookupContext lookupContext, RebindExceptionHandler exceptionHandler) throws IOException { - return loadMemento(null, lookupContext, exceptionHandler); - } - - @Override - public BrooklynMemento loadMemento(BrooklynMementoRawData mementoData, LookupContext lookupContext, RebindExceptionHandler exceptionHandler) throws IOException { - if (!running) { - throw new IllegalStateException("Persister not running; cannot load memento from "+dir); - } - - Stopwatch stopwatch = Stopwatch.createStarted(); - - FileFilter fileFilter = new FileFilter() { - @Override public boolean accept(File file) { - return !file.getName().endsWith(".tmp"); - } - }; - File[] entityFiles; - File[] locationFiles; - File[] policyFiles; - File[] enricherFiles; - File[] catalogItemFiles; - try { - entityFiles = entitiesDir.listFiles(fileFilter); - locationFiles = locationsDir.listFiles(fileFilter); - policyFiles = policiesDir.listFiles(fileFilter); - enricherFiles = enrichersDir.listFiles(fileFilter); - catalogItemFiles = catalogItemsDir.listFiles(fileFilter); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e); - throw new IllegalStateException("Failed to list memento files in "+dir, e); - } - - LOG.info("Loading memento from {}; {} entities, {} locations, {} policies, {} enrichers and {} catalog items", - new Object[] {dir, entityFiles.length, locationFiles.length, policyFiles.length, enricherFiles.length, catalogItemFiles.length}); - - BrooklynMementoImpl.Builder builder = BrooklynMementoImpl.builder(); - - serializer.setLookupContext(lookupContext); - try { - for (File file : entityFiles) { - try { - EntityMemento memento = (EntityMemento) serializer.fromString(readFile(file)); - if (memento == null) { - LOG.warn("No entity-memento deserialized from file "+file+"; ignoring and continuing"); - } else { - builder.entity(memento); - if (memento.isTopLevelApp()) { - builder.applicationId(memento.getId()); - } - } - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "File "+file, e); - } - } - for (File file : locationFiles) { - try { - LocationMemento memento = (LocationMemento) serializer.fromString(readFile(file)); - if (memento == null) { - LOG.warn("No location-memento deserialized from file "+file+"; ignoring and continuing"); - } else { - builder.location(memento); - } - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.LOCATION, "File "+file, e); - } - } - for (File file : policyFiles) { - try { - PolicyMemento memento = (PolicyMemento) serializer.fromString(readFile(file)); - if (memento == null) { - LOG.warn("No policy-memento deserialized from file "+file+"; ignoring and continuing"); - } else { - builder.policy(memento); - } - } catch (Exception e) { - exceptionHandler.onLoadMementoFailed(BrooklynObjectType.POLICY, "File "+file, e); - } - } - for (File file : enricherFiles) { - EnricherMemento memento = (EnricherMemento) serializer.fromString(readFile(file)); - if (memento == null) { - LOG.warn("No enricher-memento deserialized from file "+file+"; ignoring and continuing"); - } else { - builder.enricher(memento); - } - } - for (File file : catalogItemFiles) { - CatalogItemMemento memento = (CatalogItemMemento) serializer.fromString(readFile(file)); - if (memento == null) { - LOG.warn("No catalog-item-memento deserialized from file "+file+"; ignoring and continuing"); - } else { - builder.catalogItem(memento); - } - } - - if (LOG.isDebugEnabled()) LOG.debug("Loaded memento; took {}", Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS))); - return builder.build(); - - } finally { - serializer.unsetLookupContext(); - } - } - - @Override - public void checkpoint(BrooklynMemento newMemento, PersistenceExceptionHandler exceptionHandler) { - if (!running) { - if (LOG.isDebugEnabled()) LOG.debug("Ignoring checkpointing entire memento, because not running"); - return; - } - if (LOG.isDebugEnabled()) LOG.debug("Checkpointing entire memento"); - - for (EntityMemento m : newMemento.getEntityMementos().values()) { - persist(m); - } - for (LocationMemento m : newMemento.getLocationMementos().values()) { - persist(m); - } - for (PolicyMemento m : newMemento.getPolicyMementos().values()) { - persist(m); - } - for (EnricherMemento m : newMemento.getEnricherMementos().values()) { - persist(m); - } - for (CatalogItemMemento m : newMemento.getCatalogItemMementos().values()) { - persist(m); - } - LOG.warn("Using legacy persister; feeds will not be persisted"); - } - - @Override - public void checkpoint(BrooklynMementoRawData newMemento, PersistenceExceptionHandler exceptionHandler) { - throw new IllegalStateException("Not supported; use "+BrooklynMementoPersisterToObjectStore.class); - } - - @Override - public void delta(Delta delta, PersistenceExceptionHandler exceptionHandler) { - if (!running) { - if (LOG.isDebugEnabled()) LOG.debug("Ignoring checkpointed delta of memento, because not running"); - return; - } - if (LOG.isTraceEnabled()) LOG.trace("Checkpointed delta of memento; updating {} entities, {} locations, {} policies and {} enrichers; " + - "removing {} entities, {} locations {} policies and {} enrichers", - new Object[] {delta.entities(), delta.locations(), delta.policies(), delta.enrichers(), - delta.removedEntityIds(), delta.removedLocationIds(), delta.removedPolicyIds(), delta.removedEnricherIds()}); - - for (EntityMemento entity : delta.entities()) { - persist(entity); - } - for (LocationMemento location : delta.locations()) { - persist(location); - } - for (PolicyMemento policy : delta.policies()) { - persist(policy); - } - for (EnricherMemento enricher : delta.enrichers()) { - persist(enricher); - } - for (CatalogItemMemento catalogItem : delta.catalogItems()) { - persist(catalogItem); - } - for (String id : delta.removedEntityIds()) { - deleteEntity(id); - } - for (String id : delta.removedLocationIds()) { - deleteLocation(id); - } - for (String id : delta.removedPolicyIds()) { - deletePolicy(id); - } - for (String id : delta.removedEnricherIds()) { - deleteEnricher(id); - } - for (String id : delta.removedCatalogItemIds()) { - deleteCatalogItem(id); - } - } - - @Override - public void queueDelta(Delta delta) { - LOG.warn("Legacy persister ignoring queued delta: "+delta); - } - - @VisibleForTesting - public File getDir() { - return dir; - } - - @Override - @VisibleForTesting - public void waitForWritesCompleted(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { - waitForWritesCompleted(Duration.of(timeout, unit)); - } - - public void waitForWritesCompleted(Duration timeout) throws InterruptedException, TimeoutException { - for (MementoFileWriter writer : entityWriters.values()) { - writer.waitForWriteCompleted(timeout); - } - for (MementoFileWriter writer : locationWriters.values()) { - writer.waitForWriteCompleted(timeout); - } - for (MementoFileWriter writer : policyWriters.values()) { - writer.waitForWriteCompleted(timeout); - } - for (MementoFileWriter writer : enricherWriters.values()) { - writer.waitForWriteCompleted(timeout); - } - for (MementoFileWriter writer : catalogItemWriters.values()) { - writer.waitForWriteCompleted(timeout); - } - } - - // TODO Promote somewhere sensible; share code with BrooklynLauncher.checkPersistenceDirAccessible - public static void checkDirIsAccessible(File dir) { - if (!(dir.exists() && dir.isDirectory() && dir.canRead() && dir.canWrite())) { - throw new IllegalStateException("Invalid directory "+dir+" because "+ - (!dir.exists() ? "does not exist" : - (!dir.isDirectory() ? "not a directory" : - (!dir.canRead() ? "not readable" : - (!dir.canWrite() ? "not writable" : "unknown reason"))))); - } - } - - private String readFile(File file) throws IOException { - return Files.asCharSource(file, Charsets.UTF_8).read(); - } - - private void persist(EntityMemento entity) { - MementoFileWriter writer = entityWriters.get(entity.getId()); - if (writer == null) { - entityWriters.putIfAbsent(entity.getId(), new MementoFileWriter(getFileFor(entity), executor, serializer)); - writer = entityWriters.get(entity.getId()); - } - writer.write(entity); - } - - private void persist(LocationMemento location) { - MementoFileWriter writer = locationWriters.get(location.getId()); - if (writer == null) { - locationWriters.putIfAbsent(location.getId(), new MementoFileWriter(getFileFor(location), executor, serializer)); - writer = locationWriters.get(location.getId()); - } - writer.write(location); - } - - private void persist(PolicyMemento policy) { - MementoFileWriter writer = policyWriters.get(policy.getId()); - if (writer == null) { - policyWriters.putIfAbsent(policy.getId(), new MementoFileWriter(getFileFor(policy), executor, serializer)); - writer = policyWriters.get(policy.getId()); - } - writer.write(policy); - } - - private void persist(EnricherMemento enricher) { - MementoFileWriter writer = enricherWriters.get(enricher.getId()); - if (writer == null) { - enricherWriters.putIfAbsent(enricher.getId(), new MementoFileWriter(getFileFor(enricher), executor, serializer)); - writer = enricherWriters.get(enricher.getId()); - } - writer.write(enricher); - } - - private void persist(CatalogItemMemento catalogItem) { - MementoFileWriter writer = catalogItemWriters.get(catalogItem.getId()); - if (writer == null) { - catalogItemWriters.putIfAbsent(catalogItem.getId(), new MementoFileWriter(getFileFor(catalogItem), executor, serializer)); - writer = catalogItemWriters.get(catalogItem.getId()); - } - writer.write(catalogItem); - } - - private void deleteEntity(String id) { - MementoFileWriter writer = entityWriters.get(id); - if (writer != null) { - writer.delete(); - } - } - - private void deleteLocation(String id) { - MementoFileWriter writer = locationWriters.get(id); - if (writer != null) { - writer.delete(); - } - } - - private void deletePolicy(String id) { - MementoFileWriter writer = policyWriters.get(id); - if (writer != null) { - writer.delete(); - } - } - - private void deleteEnricher(String id) { - MementoFileWriter writer = enricherWriters.get(id); - if (writer != null) { - writer.delete(); - } - } - - private void deleteCatalogItem(String id) { - MementoFileWriter writer = catalogItemWriters.get(id); - if (writer != null) { - writer.delete(); - } - } - - private File getFileFor(EntityMemento entity) { - return getFileFor(entitiesDir, entity.getId()); - } - - private File getFileFor(LocationMemento location) { - return getFileFor(locationsDir, location.getId()); - } - - private File getFileFor(PolicyMemento policy) { - return getFileFor(policiesDir, policy.getId()); - } - - private File getFileFor(EnricherMemento enricher) { - return getFileFor(enrichersDir, enricher.getId()); - } - - private File getFileFor(CatalogItemMemento catalogItem) { - return getFileFor(catalogItemsDir, catalogItem.getId()); - } - - private File getFileFor(File parent, String id) { - return new File(parent, Strings.makeValidFilename(id)); - } - - @Override - public String getBackingStoreDescription() { - return toString(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriter.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriter.java b/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriter.java deleted file mode 100644 index f6b1a3a..0000000 --- a/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriter.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; -import com.google.common.base.Objects; -import com.google.common.base.Stopwatch; -import com.google.common.io.Files; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; - -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -/** - * For asynchronously writing to a file. - * - * This class is thread-safe. If a write is in progress, one will be scheduled. If a write is already - * scheduled, we will just rely on the existing one; otherwise we will write now. - * - * @author aled - * @deprecated since 0.7.0; used only by now-deprecated {@link BrooklynMementoPersisterToMultiFile}, - * impl largely moved to {@link FileBasedStoreObjectAccessor} - */ -@Deprecated -public class MementoFileWriter { - - private static final Logger LOG = LoggerFactory.getLogger(MementoFileWriter.class); - - private final File file; - private final File tmpFile; - private final ListeningExecutorService executor; - private final MementoSerializer serializer; - private final AtomicBoolean executing = new AtomicBoolean(); - private final AtomicReference requireWrite = new AtomicReference(); - private final AtomicBoolean requireDelete = new AtomicBoolean(); - private final AtomicBoolean deleted = new AtomicBoolean(); - private final AtomicLong modCount = new AtomicLong(); - - /** - * @param file - * @param executor A sequential executor (e.g. SingleThreadedExecutor, or equivalent) - * @param serializer - */ - public MementoFileWriter(File file, ListeningExecutorService executor, MementoSerializer serializer) { - this.file = file; - this.executor = executor; - this.serializer = serializer; - this.tmpFile = new File(file.getParentFile(), file.getName()+".tmp"); - } - - public void write(T val) { - requireWrite.set(val); - if (requireDelete.get() || deleted.get()) { - LOG.warn("Not writing {}, because already deleted", file); - } else if (executing.compareAndSet(false, true)) { - if (LOG.isTraceEnabled()) LOG.trace("Submitting write task for {}", file); - writeAsync(); - } else { - if (LOG.isTraceEnabled()) LOG.trace("Execution already in-progress for {}; recorded write-requirement; returning", file); - } - } - - public void delete() { - if (deleted.get() || requireDelete.get()) { - if (LOG.isDebugEnabled()) LOG.debug("Duplicate call to delete {}; ignoring", file); - return; - } - - requireWrite.set(null); - requireDelete.set(true); - if (executing.compareAndSet(false, true)) { - if (LOG.isTraceEnabled()) LOG.trace("Submitting delete task for {}", file); - deleteAsync(); - } else { - if (LOG.isTraceEnabled()) LOG.trace("Execution already in-progress for {}; recorded delete-requirement; returning", file); - } - } - - /** - * This method must only be used for testing. If required in production, then revisit implementation! - */ - @VisibleForTesting - public void waitForWriteCompleted(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { - waitForWriteCompleted(Duration.of(timeout, unit)); - } - - @VisibleForTesting - public void waitForWriteCompleted(Duration timeout) throws InterruptedException, TimeoutException { - // Every time we finish writing, we increment a counter. We note the current val, and then - // wait until we can guarantee that a complete additional write has been done. Not sufficient - // to wait for `writeCount > origWriteCount` because we might have read the value when it was - // almost finished a write. - - long timeoutMillis = timeout.toMilliseconds(); - long startTime = System.currentTimeMillis(); - long maxEndtime = (timeoutMillis > 0) ? (startTime + timeoutMillis) : (timeoutMillis < 0) ? startTime : Long.MAX_VALUE; - long origModCount = modCount.get(); - while (true) { - if (modCount.get() > (origModCount+1)) { - return; - } else if (requireWrite.get() != null) { - // must continue waiting for mods+1 - } else if (executing.get()) { - // must wait for either this invocation to complete, or mods+1 (because might have already updated) - } else { - return; - } - - if (System.currentTimeMillis() > maxEndtime) { - throw new TimeoutException("Timeout waiting for pending complete of rebind-periodic-delta, after "+Time.makeTimeStringRounded(timeout)); - } - Thread.sleep(10); - } - } - - private void deleteAsync() { - ListenableFuture future = executor.submit(new Callable() { - @Override public Void call() throws IOException { - try { - deleteNow(); - return null; - } catch (Throwable t) { - if (executor.isShutdown()) { - LOG.debug("Error deleting "+file+" (but executor shutdown)", t); - return null; // just return without throwing; no more work to do - } else { - LOG.error("Error deleting "+file, t); - throw Exceptions.propagate(t); - } - } - }}); - addPostExecListener(future); - } - - private void writeAsync() { - ListenableFuture future = executor.submit(new Callable() { - @Override public Void call() throws IOException { - try { - writeNow(); - return null; - } catch (Throwable t) { - if (executor.isShutdown()) { - LOG.debug("Error writing to "+file+" (but executor shutdown)", t); - return null; // just return without throwing; no more work to do - } else { - LOG.error("Error writing to "+file, t); - throw Exceptions.propagate(t); - } - } - }}); - addPostExecListener(future); - } - - private void addPostExecListener(ListenableFuture future) { - future.addListener( - new Runnable() { - @Override public void run() { - if (LOG.isTraceEnabled()) LOG.trace("Write complete for {}", file); - try { - executing.set(false); - if (requireDelete.get()) { - if (executing.compareAndSet(false, true)) { - if (LOG.isTraceEnabled()) LOG.trace("Submitting delete-task for {} (in post-exec) due to recorded delete-requirement", file); - deleteAsync(); - } else { - if (LOG.isTraceEnabled()) LOG.trace("Delete-requirement for {} (in post-exec) handled by other thread; returning", file); - } - - } else if (requireWrite.get() != null) { - if (executing.compareAndSet(false, true)) { - if (LOG.isTraceEnabled()) LOG.trace("Submitting write task for {} (in post-exec) due to recorded write-requirement", file); - writeAsync(); - } else { - if (LOG.isTraceEnabled()) LOG.trace("Write-requirement for {} (in post-exec) handled by other thread; returning", file); - } - } else { - if (LOG.isTraceEnabled()) LOG.trace("No pending exec-requirements for {}", file); - } - } catch (Throwable t) { - if (executor.isShutdown()) { - LOG.debug("Error in post-exec for "+file+" (but executor shutdown)", t); - return; // just return without throwing; no more work to do - } else { - LOG.error("Error in post-exec for "+file, t); - throw Exceptions.propagate(t); - } - } - } - }, - MoreExecutors.sameThreadExecutor()); - } - - private void writeNow() throws IOException { - T val = requireWrite.getAndSet(null); - - /* - * Need to guarantee "happens before", with any thread that has written - * fields of these mementos. In particular, saw failures where SshMachineLocation - * had null address field. Our hypothesis is that another thread wrote the memento, - * but that no synchronization subsequently happened so we did not see all the values - * in that memento from this thread. - * - * See PeriodicDeltaChangeListener.persistNow for the corresponding synchronization, - * that guarantees its thread made the writes visible. - */ - synchronized (new Object()) {} - - Stopwatch stopwatch = Stopwatch.createStarted(); - - // Write to the temp file, then atomically move it to the permanent file location - Files.write(serializer.toString(val), tmpFile, Charsets.UTF_8); - Files.move(tmpFile, file); - - modCount.incrementAndGet(); - - if (LOG.isTraceEnabled()) LOG.trace("Wrote {}, took {}; modified file {} times", - new Object[] {file, Time.makeTimeStringRounded(stopwatch), modCount}); - } - - private void deleteNow() throws IOException { - if (LOG.isTraceEnabled()) LOG.trace("Deleting {} and {}", file, tmpFile); - deleted.set(true); - requireDelete.set(false); - - file.delete(); - tmpFile.delete(); - - modCount.incrementAndGet(); - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("file", file).toString(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriterSync.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriterSync.java b/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriterSync.java deleted file mode 100644 index ea49111..0000000 --- a/core/src/main/java/brooklyn/entity/rebind/persister/MementoFileWriterSync.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; -import com.google.common.base.Objects; -import com.google.common.base.Stopwatch; -import com.google.common.io.Files; - -/** - * For synchronously writing to a file - all calls block. - * - * This class is thread-safe. If a write/delete/append is in progress, then subsequent calls will - * block. - * - * @author aled - * @deprecated since 0.7.0 we use {@link PersistenceObjectStore} instances now, and when we need sync behaviour we just wait - */ -@Deprecated -public class MementoFileWriterSync { - - private static final Logger LOG = LoggerFactory.getLogger(MementoFileWriterSync.class); - - private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private final File file; - private final File tmpFile; - private final MementoSerializer serializer; - private final AtomicLong modCount = new AtomicLong(); - - /** - * @param file - * @param serializer - */ - public MementoFileWriterSync(File file, MementoSerializer serializer) { - this(file, serializer, "tmp"); - } - - public MementoFileWriterSync(File file, MementoSerializer serializer, String tmpFileSuffix) { - this.file = file; - this.serializer = serializer; - this.tmpFile = new File(file.getParentFile(), file.getName()+"."+tmpFileSuffix); - } - - public boolean exists() { - return file.exists(); - } - - public void write(T val) { - try { - lock.writeLock().lockInterruptibly(); - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - try { - Stopwatch stopwatch = Stopwatch.createStarted(); - - // Write to the temp file, then atomically move it to the permanent file location - Files.write(serializer.toString(val), tmpFile, Charsets.UTF_8); - Files.move(tmpFile, file); - modCount.incrementAndGet(); - - if (LOG.isTraceEnabled()) LOG.trace("Wrote {}, took {}; modified file {} times", - new Object[] {file, Time.makeTimeStringRounded(stopwatch), modCount}); - } catch (IOException e) { - throw Exceptions.propagate(e); - } finally { - lock.writeLock().unlock(); - } - } - - public void append(T val) { - try { - lock.writeLock().lockInterruptibly(); - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - try { - Stopwatch stopwatch = Stopwatch.createStarted(); - - // Write to the temp file, then atomically move it to the permanent file location - Files.append(serializer.toString(val), file, Charsets.UTF_8); - modCount.incrementAndGet(); - - if (LOG.isTraceEnabled()) LOG.trace("Wrote {}, took {}; modified file {} times", - new Object[] {file, Time.makeTimeStringRounded(stopwatch), modCount}); - } catch (IOException e) { - throw Exceptions.propagate(e); - } finally { - lock.writeLock().unlock(); - } - } - - public void delete() { - try { - lock.writeLock().lockInterruptibly(); - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - try { - Stopwatch stopwatch = Stopwatch.createStarted(); - - file.delete(); - tmpFile.delete(); - modCount.incrementAndGet(); - - if (LOG.isTraceEnabled()) LOG.trace("Deleted {}, took {}; modified file {} times", - new Object[] {file, Time.makeTimeStringRounded(stopwatch), modCount}); - } finally { - lock.writeLock().unlock(); - } - } - - @VisibleForTesting - public void waitForWriteCompleted(Duration timeout) throws InterruptedException, TimeoutException { - boolean locked = lock.writeLock().tryLock(timeout.toMilliseconds(), TimeUnit.MILLISECONDS); - if (locked) { - lock.writeLock().unlock(); - } else { - throw new TimeoutException("Timeout waiting for lock on "+file); - } - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("file", file).toString(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToMultiFile.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToMultiFile.java b/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToMultiFile.java deleted file mode 100644 index fcade26..0000000 --- a/core/src/main/java/brooklyn/management/ha/ManagementPlaneSyncRecordPersisterToMultiFile.java +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.management.ha; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToMultiFile; -import brooklyn.entity.rebind.persister.FileBasedStoreObjectAccessor; -import brooklyn.entity.rebind.persister.MementoFileWriterSync; -import brooklyn.entity.rebind.persister.MementoSerializer; -import brooklyn.entity.rebind.persister.RetryingMementoSerializer; -import brooklyn.entity.rebind.persister.XmlMementoSerializer; -import brooklyn.entity.rebind.plane.dto.ManagementPlaneSyncRecordImpl; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -import com.google.common.annotations.Beta; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; -import com.google.common.base.Stopwatch; -import com.google.common.io.Files; - -/** - * Structure of files is: - *
    - *
  • {@code plane/} - top-level directory - *
      - *
    • {@code master} - contains the id of the management-node that is currently master - *
    • {@code change.log} - log of changes made - *
    • {@code nodes/} - sub-directory, containing one file per management-node - *
        - *
      • {@code a9WiuVKp} - file named after the management-node's id, containing the management node's current state - *
      • {@code E1eDXQF3} - *
      - *
    - *
- * - * All writes are done synchronously. - * - * @since 0.7.0 - * - * @author aled - * @deprecated since 0.7.0 use {@link ManagementPlaneSyncRecordPersisterToObjectStore} e.g. with {@link FileBasedStoreObjectAccessor} - */ -@Beta -@Deprecated -public class ManagementPlaneSyncRecordPersisterToMultiFile implements ManagementPlaneSyncRecordPersister { - - // TODO Multiple node appending to change.log could cause strange interleaving, or perhaps even data loss? - // But this file is not critical to functionality. - - // TODO Should ManagementPlaneSyncRecordPersister.Delta be different so can tell what is a significant event, - // and thus log it in change.log - currently only subset of significant things being logged. - - private static final Logger LOG = LoggerFactory.getLogger(ManagementPlaneSyncRecordPersisterToMultiFile.class); - - private static final Duration SHUTDOWN_TIMEOUT = Duration.TEN_SECONDS; - - private final String tmpSuffix; - private final File dir; - private final File nodesDir; - - // TODO Leak if we go through lots of managers; but tiny! - private final ConcurrentMap> nodeWriters = new ConcurrentHashMap>(); - - private final MementoFileWriterSync masterWriter; - - private final MementoFileWriterSync changeLogWriter; - - private final MementoSerializer serializer; - - private static final int MAX_SERIALIZATION_ATTEMPTS = 5; - - private volatile boolean running = true; - - /** - * @param dir Directory to write management-plane data - * @param classLoader ClassLoader to use when deserializing data - * @param id Unique identifier, e.g. used for temp file suffix in case multpile concurrent writers - */ - public ManagementPlaneSyncRecordPersisterToMultiFile(File dir, ClassLoader classLoader, String id) { - this.dir = checkNotNull(dir, "dir"); - MementoSerializer rawSerializer = new XmlMementoSerializer(checkNotNull(classLoader, "classLoader")); - this.serializer = new RetryingMementoSerializer(rawSerializer, MAX_SERIALIZATION_ATTEMPTS); - this.tmpSuffix = checkNotNull(id, "id")+".tmp"; // important to end in .tmp for loadMemento's file filter - - BrooklynMementoPersisterToMultiFile.checkDirIsAccessible(dir); - - nodesDir = new File(dir, "nodes"); - nodesDir.mkdir(); - BrooklynMementoPersisterToMultiFile.checkDirIsAccessible(nodesDir); - - masterWriter = new MementoFileWriterSync(getFileForMaster(), serializer, tmpSuffix); - changeLogWriter = new MementoFileWriterSync(getFileForChangeLog(), MementoSerializer.NOOP, tmpSuffix); - - LOG.info("ManagementPlaneMemento-persister will use directory {}", dir); - } - - @Override - public void stop() { - running = false; - try { - for (MementoFileWriterSync writer : nodeWriters.values()) { - try { - writer.waitForWriteCompleted(SHUTDOWN_TIMEOUT); - } catch (TimeoutException e) { - LOG.warn("Timeout during shutdown, waiting for write of "+writer+"; continuing"); - } - } - try { - masterWriter.waitForWriteCompleted(SHUTDOWN_TIMEOUT); - } catch (TimeoutException e) { - LOG.warn("Timeout during shutdown, waiting for write of "+masterWriter+"; continuing"); - } - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - } - - @VisibleForTesting - public File getDir() { - return dir; - } - - @Override - public ManagementPlaneSyncRecord loadSyncRecord() throws IOException { - if (!running) { - throw new IllegalStateException("Persister not running; cannot load memento from "+dir); - } - - // Note this is called a lot - every time we check the heartbeats - if (LOG.isTraceEnabled()) LOG.trace("Loading management-plane memento from {}", dir); - - Stopwatch stopwatch = Stopwatch.createStarted(); - - ManagementPlaneSyncRecordImpl.Builder builder = ManagementPlaneSyncRecordImpl.builder(); - - // Be careful about order: if the master-file says nodeX then nodeX's file must have an up-to-date timestamp. - // Therefore read master file first, followed by the other node-files. - File masterFile = getFileForMaster(); - String masterNodeId = (String) (masterFile.exists() ? serializer.fromString(readFile(masterFile)) : null); - if (masterNodeId == null) { - LOG.warn("No entity-memento deserialized from file "+masterFile+"; ignoring and continuing"); - } else { - builder.masterNodeId(masterNodeId); - } - - // Load node-files - FileFilter fileFilter = new FileFilter() { - @Override public boolean accept(File file) { - return !file.getName().endsWith(".tmp"); - } - }; - File[] nodeFiles = nodesDir.listFiles(fileFilter); - - for (File file : nodeFiles) { - ManagementNodeSyncRecord memento = (ManagementNodeSyncRecord) serializer.fromString(readFile(file)); - if (memento == null) { - LOG.warn("No manager-memento deserialized from file "+file+" (possibly just stopped?); ignoring and continuing"); - } else { - builder.node(memento); - } - } - - if (LOG.isTraceEnabled()) LOG.trace("Loaded management-plane memento; took {}", Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS))); - return builder.build(); - } - - @Override - public void delta(Delta delta) { - if (!running) { - if (LOG.isDebugEnabled()) LOG.debug("Persister not running; ignoring checkpointed delta of manager-memento"); - return; - } - if (LOG.isTraceEnabled()) LOG.trace("Checkpointed delta of manager-memento; updating {}", delta); - - for (ManagementNodeSyncRecord m : delta.getNodes()) { - persist(m); - } - for (String id : delta.getRemovedNodeIds()) { - deleteNode(id); - } - switch (delta.getMasterChange()) { - case NO_CHANGE: - break; // no-op - case SET_MASTER: - persistMaster(checkNotNull(delta.getNewMasterOrNull())); - break; - case CLEAR_MASTER: - persistMaster(null); - break; // no-op - default: - throw new IllegalStateException("Unknown state for master-change: "+delta.getMasterChange()); - } - } - - private void persistMaster(String nodeId) { - masterWriter.write(nodeId); - changeLogWriter.append(Time.makeDateString()+": set master to "+nodeId+"\n"); - } - - @Override - @VisibleForTesting - public void waitForWritesCompleted(Duration timeout) throws InterruptedException, TimeoutException { - for (MementoFileWriterSync writer : nodeWriters.values()) { - writer.waitForWriteCompleted(timeout); - } - masterWriter.waitForWriteCompleted(timeout); - } - - private String readFile(File file) throws IOException { - return Files.asCharSource(file, Charsets.UTF_8).read(); - } - - private void persist(ManagementNodeSyncRecord node) { - MementoFileWriterSync writer = getOrCreateNodeWriter(node.getNodeId()); - boolean fileExists = writer.exists(); - writer.write(node); - if (!fileExists) { - changeLogWriter.append(Time.makeDateString()+": created node "+node.getNodeId()+"\n"); - } - if (node.getStatus() == ManagementNodeState.TERMINATED || node.getStatus() == ManagementNodeState.FAILED) { - changeLogWriter.append(Time.makeDateString()+": set node "+node.getNodeId()+" status to "+node.getStatus()+"\n"); - } - } - - private void deleteNode(String nodeId) { - getOrCreateNodeWriter(nodeId).delete(); - changeLogWriter.append(Time.makeDateString()+": deleted node "+nodeId+"\n"); - } - - private MementoFileWriterSync getOrCreateNodeWriter(String nodeId) { - MementoFileWriterSync writer = nodeWriters.get(nodeId); - if (writer == null) { - nodeWriters.putIfAbsent(nodeId, new MementoFileWriterSync(getFileForNode(nodeId), serializer, tmpSuffix)); - writer = nodeWriters.get(nodeId); - } - return writer; - } - - private File getFileForNode(String nodeId) { - return new File(nodesDir, nodeId); - } - - private File getFileForMaster() { - return new File(dir, "master"); - } - - private File getFileForChangeLog() { - return new File(dir, "change.log"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/358806da/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFileTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFileTest.java b/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFileTest.java deleted file mode 100644 index 6dc9aa1a..0000000 --- a/core/src/test/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFileTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.entity.rebind.persister; - -import java.io.File; - -import org.testng.annotations.AfterMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.rebind.PersistenceExceptionHandlerImpl; -import brooklyn.entity.rebind.RebindManagerImpl; -import brooklyn.management.internal.LocalManagementContext; -import brooklyn.test.entity.LocalManagementContextForTests; -import brooklyn.util.javalang.JavaClassNames; -import brooklyn.util.os.Os; -import brooklyn.util.time.Duration; - -/** - * @author Andrea Turli - * @deprecated just tests the deprecated {@link BrooklynMementoPersisterToMultiFile} - */ -public class BrooklynMementoPersisterToMultiFileTest extends BrooklynMementoPersisterTestFixture { - - protected File mementoDir; - - @Override - protected LocalManagementContext newPersistingManagementContext() { - mementoDir = Os.newTempDir(JavaClassNames.cleanSimpleClassName(this)); - Os.deleteOnExitRecursively(mementoDir); - - LocalManagementContext mgmt = new LocalManagementContextForTests(); - ((RebindManagerImpl) mgmt.getRebindManager()).setPeriodicPersistPeriod(Duration.millis(100)); - persister = new BrooklynMementoPersisterToMultiFile(mementoDir, BrooklynMementoPersisterToMultiFileTest.class.getClassLoader()); - mgmt.getRebindManager().setPersister(persister, PersistenceExceptionHandlerImpl.builder().build()); - mgmt.getHighAvailabilityManager().disabled(); - mgmt.getRebindManager().startPersistence(); - return mgmt; - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - super.tearDown(); - mementoDir = Os.deleteRecursively(mementoDir).asNullOrThrowing(); - } - - @Test(groups="Integration") - public void testLoadAndCheckpointRawMemento() throws Exception { - // test here is deliberately no-op; - // checkpoint routines not supported for this (deprecated) persister - } - -}