/* This file is part of VoltDB.
* Copyright (C) 2008-2017 VoltDB Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
package org.voltcore.agreement.maker;
import static com.natpryce.makeiteasy.MakeItEasy.a;
import static com.natpryce.makeiteasy.MakeItEasy.listOf;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
import static com.natpryce.makeiteasy.Property.newProperty;
import java.util.List;
import java.util.Set;
import org.voltcore.messaging.SiteFailureForwardMessage;
import org.voltcore.messaging.SiteFailureMessage;
import org.voltcore.utils.Pair;
import com.google_voltpatches.common.collect.ImmutableSet;
import com.google_voltpatches.common.collect.Sets;
import com.google_voltpatches.common.primitives.Longs;
import com.natpryce.makeiteasy.Donor;
import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.Property;
import com.natpryce.makeiteasy.PropertyLookup;
public class SiteFailureMessageMaker {
public final static Property<Pair<Long, ?>,Long> pSite = newProperty();
public final static Property<Pair<Long,Long>,Long> pSafe = newProperty();
public final static Instantiator<Pair<Long,Long>> safePair =
new Instantiator<Pair<Long,Long>>() {
@Override
public Pair<Long, Long> instantiate(
PropertyLookup<Pair<Long, Long>> lookup) {
return Pair.of(
lookup.valueOf(pSite, Long.MIN_VALUE),
lookup.valueOf(pSafe, Long.MIN_VALUE)
);
}
};
@SuppressWarnings("unchecked")
public static Donor<List<Pair<Long,Long>>> sfmSafe(long h1, long s1) {
return listOf(
a(safePair,with(pSite,h1),with(pSafe,s1))
);
}
@SuppressWarnings("unchecked")
public static Donor<List<Pair<Long,Long>>> sfmSafe(
long h1, long s1, long h2, long s2) {
return listOf(
a(safePair,with(pSite,h1),with(pSafe,s1)),
a(safePair,with(pSite,h2),with(pSafe,s2))
);
}
@SuppressWarnings("unchecked")
public static Donor<List<Pair<Long,Long>>> sfmSafe(
long h1, long s1, long h2, long s2,
long h3, long s3) {
return listOf(
a(safePair,with(pSite,h1),with(pSafe,s1)),
a(safePair,with(pSite,h2),with(pSafe,s2)),
a(safePair,with(pSite,h3),with(pSafe,s3))
);
}
@SuppressWarnings("unchecked")
public static Donor<List<Pair<Long,Long>>> sfmSafe(
long h1, long s1, long h2, long s2,
long h3, long s3, long h4, long s4) {
return listOf(
a(safePair,with(pSite,h1),with(pSafe,s1)),
a(safePair,with(pSite,h2),with(pSafe,s2)),
a(safePair,with(pSite,h3),with(pSafe,s3)),
a(safePair,with(pSite,h4),with(pSafe,s4))
);
}
public static Set<Long> sfmFailed(long...vals) {
return ImmutableSet.copyOf(Longs.asList(vals));
}
public static Set<Long> sfmSurvived(long...vals) {
return ImmutableSet.copyOf(Longs.asList(vals));
}
public static Set<Long> sfmDecided(long...vals) {
return ImmutableSet.copyOf(Longs.asList(vals));
}
public static final Property<SiteFailureMessage,Long> sfmSource = newProperty();
public static final Property<SiteFailureMessage, Iterable<Long>> sfmFailures = newProperty();
public static final Property<SiteFailureMessage, Iterable<Long>> sfmDecision = newProperty();
public static final Property<SiteFailureMessage, Iterable<Long>> sfmSurvivors = newProperty();
public static final Property<SiteFailureMessage, Iterable<Pair<Long,Long>>> sfmSafeTxns = newProperty();
public final static Instantiator<SiteFailureMessage> SiteFailureMessage =
new Instantiator<SiteFailureMessage>() {
@Override
@SuppressWarnings("unchecked")
public SiteFailureMessage instantiate(PropertyLookup<SiteFailureMessage> lookup) {
SiteFailureMessage.Builder builder = new SiteFailureMessage.Builder();
builder.survivors(Sets.newHashSet(lookup.valueOf(sfmSurvivors, Longs.asList(1))));
builder.failures(Sets.newHashSet(lookup.valueOf(sfmFailures, Longs.asList(1))));
builder.decisions(Sets.newHashSet(lookup.valueOf(sfmDecision, Longs.asList(1))));
for (Pair<Long,Long> sp: lookup.valueOf(sfmSafeTxns, listOf(a(safePair)))) {
builder.safeTxnId(sp.getFirst(), sp.getSecond());
}
SiteFailureMessage msg = builder.build();
long source = lookup.valueOf(sfmSource,1L);
msg.m_sourceHSId = source;
return msg;
}
};
public static final Property<SiteFailureForwardMessage,Long> fsfmSource = newProperty();
public static final Property<SiteFailureForwardMessage,SiteFailureMessage> fsfmMsg = newProperty();
public final static Instantiator<SiteFailureForwardMessage> FailureSiteForwardMessage =
new Instantiator<SiteFailureForwardMessage>() {
@Override
public SiteFailureForwardMessage instantiate(
PropertyLookup<SiteFailureForwardMessage> lookup) {
@SuppressWarnings("unchecked")
SiteFailureMessage msg = lookup.valueOf(fsfmMsg, make(a(SiteFailureMessage)));
SiteFailureForwardMessage fwd = new SiteFailureForwardMessage(msg);
fwd.m_sourceHSId = lookup.valueOf(fsfmSource,1L);
return fwd;
}
};
}