// InternalHeartbeatTxn updates the transaction status and heartbeat // timestamp after receiving transaction heartbeat messages from // coordinator. The range will return the current status for this // transaction to the coordinator. func (r *Range) InternalHeartbeatTxn(args *proto.InternalHeartbeatTxnRequest, reply *proto.InternalHeartbeatTxnResponse) { // Create the actual key to the system-local transaction table. key := engine.MakeKey(engine.KeyLocalTransactionPrefix, args.Key) var txn proto.Transaction if _, err := engine.GetProto(r.engine, key, &txn); err != nil { reply.SetGoError(err) return } if txn.Status == proto.PENDING { if !args.Header().Timestamp.Less(txn.LastHeartbeat) { txn.LastHeartbeat = args.Header().Timestamp } if err := engine.PutProto(r.engine, key, &txn); err != nil { reply.SetGoError(err) return } } reply.Status = txn.Status }