/* * Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved. * * Licensed 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 com.hazelcast.internal.cluster.impl.operations; import com.hazelcast.instance.MemberImpl; import com.hazelcast.internal.cluster.impl.ClusterDataSerializerHook; import com.hazelcast.internal.cluster.impl.ClusterHeartbeatManager; import com.hazelcast.internal.cluster.impl.ClusterServiceImpl; import com.hazelcast.internal.cluster.impl.MembersViewMetadata; import com.hazelcast.logging.ILogger; import com.hazelcast.nio.ObjectDataInput; import com.hazelcast.nio.ObjectDataOutput; import java.io.IOException; import static com.hazelcast.internal.cluster.impl.operations.VersionedClusterOperation.isGreaterOrEqualV39; /** A heartbeat sent from one cluster member to another. The sent timestamp is the cluster clock time of the sending member */ public final class HeartbeatOp extends AbstractClusterOperation { private MembersViewMetadata senderMembersViewMetadata; private String targetUuid; private long timestamp; public HeartbeatOp() { } public HeartbeatOp(MembersViewMetadata senderMembersViewMetadata, String targetUuid, long timestamp) { this.senderMembersViewMetadata = senderMembersViewMetadata; this.targetUuid = targetUuid; this.timestamp = timestamp; } @Override public void run() { ClusterServiceImpl service = getService(); ClusterHeartbeatManager heartbeatManager = service.getClusterHeartbeatManager(); if (senderMembersViewMetadata != null) { heartbeatManager.handleHeartbeat(senderMembersViewMetadata, targetUuid, timestamp); } else { // version 3.8 MemberImpl member = getHeartBeatingMember(service); if (member != null) { heartbeatManager.onHeartbeat(member, timestamp); } } } private MemberImpl getHeartBeatingMember(ClusterServiceImpl service) { MemberImpl member = service.getMember(getCallerAddress()); ILogger logger = getLogger(); if (member == null) { if (logger.isFineEnabled()) { logger.fine("Heartbeat received from an unknown endpoint: " + getCallerAddress()); } return null; } return member; } @Override public int getId() { return ClusterDataSerializerHook.HEARTBEAT; } @Override protected void writeInternal(ObjectDataOutput out) throws IOException { super.writeInternal(out); if (isGreaterOrEqualV39(out.getVersion())) { out.writeObject(senderMembersViewMetadata); out.writeUTF(targetUuid); } out.writeLong(timestamp); } @Override protected void readInternal(ObjectDataInput in) throws IOException { super.readInternal(in); if (isGreaterOrEqualV39(in.getVersion())) { senderMembersViewMetadata = in.readObject(); targetUuid = in.readUTF(); } timestamp = in.readLong(); } }