All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.infinispan.util.IracUtils Maven / Gradle / Ivy

There is a newer version: 15.1.0.Dev04
Show newest version
package org.infinispan.util;

import static org.infinispan.metadata.impl.PrivateMetadata.getBuilder;

import java.util.Optional;

import org.infinispan.container.entries.CacheEntry;
import org.infinispan.container.versioning.irac.IracEntryVersion;
import org.infinispan.container.versioning.irac.IracTombstoneManager;
import org.infinispan.metadata.impl.IracMetadata;
import org.infinispan.metadata.impl.PrivateMetadata;
import org.infinispan.util.logging.LogSupplier;

/**
 * Utility methods from IRAC (async cross-site replication)
 *
 * @author Pedro Ruivo
 * @since 12.0
 */
public final class IracUtils {

   private IracUtils() {
   }

   public static Optional findIracMetadataFromCacheEntry(CacheEntry entry) {
      PrivateMetadata privateMetadata = entry.getInternalMetadata();
      if (privateMetadata == null) {
         return Optional.empty();
      }
      return Optional.ofNullable(privateMetadata.iracMetadata());
   }

   public static IracEntryVersion getIracVersionFromCacheEntry(CacheEntry entry) {
      return findIracMetadataFromCacheEntry(entry).map(IracMetadata::getVersion).orElse(null);
   }

   /**
    * Stores the {@link IracMetadata} into {@link CacheEntry}.
    * 

* If the {@link CacheEntry} is a remove, then the tombstone is added via {@link * IracTombstoneManager#storeTombstone(int, Object, IracMetadata)}. * * @param entry The {@link CacheEntry} to update. * @param metadata The {@link IracMetadata} to store. * @param versionGenerator The {@link IracTombstoneManager} to update. * @param logSupplier The {@link LogSupplier} to log the {@link IracMetadata} and the key. */ public static void setIracMetadata(CacheEntry entry, int segment, IracMetadata metadata, IracTombstoneManager versionGenerator, LogSupplier logSupplier) { final Object key = entry.getKey(); assert metadata != null : "[IRAC] Metadata must not be null!"; if (entry.isRemoved()) { logTombstoneAssociated(key, metadata, logSupplier); versionGenerator.storeTombstone(segment, key, metadata); } else { logIracMetadataAssociated(key, metadata, logSupplier); updateCacheEntryMetadata(entry, metadata); versionGenerator.removeTombstone(key); } } /** * Same as {@link #setIracMetadata(CacheEntry, int, IracMetadata, IracTombstoneManager, LogSupplier)} but it stores a * "full" {@link PrivateMetadata} instead of {@link IracMetadata}. *

* This method is invoked to set the version from remote site updates. Note that the tombstone is not stored in case * of a remove operation. * * @param entry The {@link CacheEntry} to update. * @param metadata The {@link PrivateMetadata} to store. * @param versionGenerator The {@link IracTombstoneManager} to update. * @param logSupplier The {@link LogSupplier} to log the {@link PrivateMetadata} and the key. */ public static void setPrivateMetadata(CacheEntry entry, int segment, PrivateMetadata metadata, IracTombstoneManager versionGenerator, LogSupplier logSupplier) { final Object key = entry.getKey(); assert metadata.iracMetadata() != null : "[IRAC] Metadata must not be null!"; if (entry.isRemoved()) { logTombstoneAssociated(key, metadata.iracMetadata(), logSupplier); versionGenerator.storeTombstone(segment, key, metadata.iracMetadata()); } else { logIracMetadataAssociated(key, metadata.iracMetadata(), logSupplier); entry.setInternalMetadata(metadata); versionGenerator.removeTombstone(key); } } public static void logUpdateDiscarded(Object key, IracMetadata metadata, LogSupplier logSupplier) { if (logSupplier.isTraceEnabled()) { logSupplier.getLog().tracef("[IRAC] Update from remote site discarded. Metadata=%s, key=%s", metadata, key); } } private static void logIracMetadataAssociated(Object key, IracMetadata metadata, LogSupplier logSupplier) { if (logSupplier.isTraceEnabled()) { logSupplier.getLog().tracef("[IRAC] IracMetadata %s associated with key '%s'", metadata, key); } } private static void logTombstoneAssociated(Object key, IracMetadata metadata, LogSupplier logSupplier) { if (logSupplier.isTraceEnabled()) { logSupplier.getLog().tracef("[IRAC] Store tombstone %s for key '%s'", metadata, key); } } private static void updateCacheEntryMetadata(CacheEntry entry, IracMetadata iracMetadata) { PrivateMetadata internalMetadata = getBuilder(entry.getInternalMetadata()) .iracMetadata(iracMetadata) .build(); entry.setInternalMetadata(internalMetadata); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy