blob: c070ba3a9f13ccb8a5439042c712c263a63209f1 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Matthew Khouzam - Initial implementation
* Marc-Andre Laperle - Create session and split getNextIndex from getNextPacket
**********************************************************************/
package org.eclipse.tracecompass.internal.lttng2.control.core.relayd.impl;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.ILttngRelaydConnector;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.AttachSessionRequest;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.AttachSessionResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.Command;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.ConnectResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.CreateSessionResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.GetMetadata;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.GetNextIndex;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.GetPacket;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.IndexResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.ListSessionsResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.MetadataPacketResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.NewStreamsResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.NextIndexReturnCode;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.SeekCommand;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.SessionResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.StreamResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.TracePacketResponse;
import org.eclipse.tracecompass.internal.lttng2.control.core.relayd.commands.ViewerCommand;
/**
* Lttng 2.4 implementation
*
* @author Matthew Khouzam
*/
public class LttngRelaydConnector_2_4 implements ILttngRelaydConnector {
private final @NonNull DataInputStream fInNet;
private final @NonNull DataOutputStream fOutNet;
/**
* Constructor needs two network streams
*
* @param inNet
* network incoming data
* @param outNet
* network outgoing data
*/
public LttngRelaydConnector_2_4(@NonNull DataInputStream inNet, @NonNull DataOutputStream outNet) {
fInNet = inNet;
fOutNet = outNet;
}
// ------------------------------------------------------------------------
// AutoCloseable
// ------------------------------------------------------------------------
@Override
public void close() throws IOException {
fInNet.close();
fOutNet.close();
}
// ------------------------------------------------------------------------
// ILttngRelaydConnector
// ------------------------------------------------------------------------
@Override
public List<SessionResponse> getSessions() throws IOException {
ViewerCommand listSessionsCmd = new ViewerCommand(Command.VIEWER_LIST_SESSIONS, 0,0);
fOutNet.write(listSessionsCmd.serialize());
fOutNet.flush();
return new ListSessionsResponse(fInNet).getSessionsList();
}
@Override
public CreateSessionResponse createSession() throws IOException {
ViewerCommand listSessionsCmd = new ViewerCommand(Command.VIEWER_CREATE_SESSION, 0, 0);
fOutNet.write(listSessionsCmd.serialize());
fOutNet.flush();
return new CreateSessionResponse(fInNet);
}
@Override
public AttachSessionResponse attachToSession(SessionResponse lttngViewerSession) throws IOException {
ViewerCommand listSessionsCmd = new ViewerCommand(Command.VIEWER_ATTACH_SESSION, 0,0);
fOutNet.write(listSessionsCmd.serialize());
/*
* only flush if you read after
*/
AttachSessionRequest attachRequest = new AttachSessionRequest(lttngViewerSession.getId(), SeekCommand.VIEWER_SEEK_LAST);
fOutNet.write(attachRequest.serialize());
fOutNet.flush();
return new AttachSessionResponse(fInNet);
}
@Override
public String getMetadata(AttachSessionResponse attachedSession) throws IOException {
for (StreamResponse stream : attachedSession.getStreamList()) {
if (stream.getMetadataFlag() == 1) {
issueCommand(Command.VIEWER_GET_METADATA);
GetMetadata metadataRequest = new GetMetadata(stream.getId());
fOutNet.write(metadataRequest.serialize());
fOutNet.flush();
MetadataPacketResponse metaDataPacket = new MetadataPacketResponse(fInNet);
return new String(metaDataPacket.getData());
}
}
return null;
}
@Override
public TracePacketResponse getPacketFromStream(IndexResponse index, long id) throws IOException {
issueCommand(Command.VIEWER_GET_PACKET);
GetPacket packetRequest = new GetPacket(id, index.getOffset(), (int) (index.getPacketSize() / 8));
fOutNet.write(packetRequest.serialize());
fOutNet.flush();
return new TracePacketResponse(fInNet);
}
@Override
public TracePacketResponse getNextPacket(StreamResponse stream) throws IOException {
IndexResponse indexReply = getNextIndex(stream);
TracePacketResponse packet = null;
if (indexReply.getStatus() == NextIndexReturnCode.VIEWER_INDEX_OK) {
packet = getPacketFromStream(indexReply, stream.getId());
}
return packet;
}
@Override
public IndexResponse getNextIndex(StreamResponse stream) throws IOException {
issueCommand(Command.VIEWER_GET_NEXT_INDEX);
GetNextIndex indexRequest = new GetNextIndex(stream.getId());
fOutNet.write(indexRequest.serialize());
fOutNet.flush();
return new IndexResponse(fInNet);
}
@Override
public List<StreamResponse> getNewStreams() throws IOException {
Command viewerGetNewStreams = Command.VIEWER_GET_NEW_STREAMS;
issueCommand(viewerGetNewStreams);
return new NewStreamsResponse(fInNet).getStreamList();
}
private void issueCommand(Command command) throws IOException {
ViewerCommand connectCommand = new ViewerCommand(command, ConnectResponse.SIZE, 0);
fOutNet.write(connectCommand.serialize());
fOutNet.flush();
}
}