summaryrefslogtreecommitdiff
path: root/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-21 11:34:34 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-21 11:34:34 +0200
commit68ef3700ed2f69bcf0118bb69eda71e6b1f4d54f (patch)
tree73201888564accde4cfa107f4ffdb15e9f93d45c /opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc
parentc7fff03408ee3109d0a39a96c043584a2d8f67ca (diff)
feat(trace): Add support for writing traces
This change adds a new API for writing traces in a trace format. Currently, writing is only supported by the OpenDC VM format, but over time the other formats will also have support for writing added.
Diffstat (limited to 'opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc')
-rw-r--r--opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Table.kt7
-rw-r--r--opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/TableWriter.kt151
-rw-r--r--opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Trace.kt30
-rw-r--r--opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/internal/TableImpl.kt3
-rw-r--r--opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt21
5 files changed, 209 insertions, 3 deletions
diff --git a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Table.kt b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Table.kt
index 031ee269..b0181cbc 100644
--- a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Table.kt
+++ b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Table.kt
@@ -45,4 +45,11 @@ public interface Table {
* Open a [TableReader] for this table.
*/
public fun newReader(): TableReader
+
+ /**
+ * Open a [TableWriter] for this table.
+ *
+ * @throws UnsupportedOperationException if writing is not supported by the table.
+ */
+ public fun newWriter(): TableWriter
}
diff --git a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/TableWriter.kt b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/TableWriter.kt
new file mode 100644
index 00000000..423ce86a
--- /dev/null
+++ b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/TableWriter.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * 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 OR COPYRIGHT HOLDERS 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.opendc.trace
+
+/**
+ * Base class for writing workload traces.
+ */
+public interface TableWriter : AutoCloseable {
+ /**
+ * Start a new row in the table.
+ */
+ public fun startRow()
+
+ /**
+ * Flush the current row to the table.
+ */
+ public fun endRow()
+
+ /**
+ * Resolve the index of the specified [column] for this writer.
+ *
+ * @param column The column to lookup.
+ * @return The zero-based index of the column or a negative value if the column is not present in this table.
+ */
+ public fun resolve(column: TableColumn<*>): Int
+
+ /**
+ * Determine whether the [TableReader] supports the specified [column].
+ */
+ public fun hasColumn(column: TableColumn<*>): Boolean = resolve(column) >= 0
+
+ /**
+ * Set [column] to [value].
+ *
+ * @param index The zero-based index of the column to set the value for.
+ * @param value The value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun set(index: Int, value: Any)
+
+ /**
+ * Set [column] to boolean [value].
+ *
+ * @param index The zero-based index of the column to set the value for.
+ * @param value The boolean value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setBoolean(index: Int, value: Boolean)
+
+ /**
+ * Set [column] to integer [value].
+ *
+ * @param index The zero-based index of the column to set the value for.
+ * @param value The integer value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setInt(index: Int, value: Int)
+
+ /**
+ * Set [column] to long [value].
+ *
+ * @param index The zero-based index of the column to set the value for.
+ * @param value The long value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setLong(index: Int, value: Long)
+
+ /**
+ * Set [column] to double [value].
+ *
+ * @param index The zero-based index of the column to set the value for.
+ * @param value The double value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setDouble(index: Int, value: Double)
+
+ /**
+ * Set [column] to [value].
+ *
+ * @param column The column to set the value for.
+ * @param value The value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun <T : Any> set(column: TableColumn<T>, value: T): Unit = set(resolve(column), value)
+
+ /**
+ * Set [column] to boolean [value].
+ *
+ * @param column The column to set the value for.
+ * @param value The boolean value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setBoolean(column: TableColumn<Boolean>, value: Boolean): Unit = setBoolean(resolve(column), value)
+
+ /**
+ * Set [column] to integer [value].
+ *
+ * @param column The column to set the value for.
+ * @param value The integer value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setInt(column: TableColumn<Int>, value: Int): Unit = setInt(resolve(column), value)
+
+ /**
+ * Set [column] to long [value].
+ *
+ * @param column The column to set the value for.
+ * @param value The long value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setLong(column: TableColumn<Long>, value: Long): Unit = setLong(resolve(column), value)
+
+ /**
+ * Set [column] to double [value].
+ *
+ * @param column The column to set the value for.
+ * @param value The double value to set the column to.
+ * @throws IllegalArgumentException if the column is not valid for this method.
+ */
+ public fun setDouble(column: TableColumn<Double>, value: Double): Unit = setDouble(resolve(column), value)
+
+ /**
+ * Flush any buffered content to the underlying target.
+ */
+ public fun flush()
+
+ /**
+ * Close the writer so that no more rows can be written.
+ */
+ public override fun close()
+}
diff --git a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Trace.kt b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Trace.kt
index 6d0014cb..64e8f272 100644
--- a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Trace.kt
+++ b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/Trace.kt
@@ -51,21 +51,45 @@ public interface Trace {
* Open a [Trace] at the specified [path] in the given [format].
*
* @param path The path to the trace.
+ * @param format The format of the trace to open.
* @throws IllegalArgumentException if [format] is not supported.
*/
- public fun open(path: File, format: String): Trace {
- return open(path.toPath(), format)
- }
+ @JvmStatic
+ public fun open(path: File, format: String): Trace = open(path.toPath(), format)
/**
* Open a [Trace] at the specified [path] in the given [format].
*
* @param path The [Path] to the trace.
+ * @param format The format of the trace to open.
* @throws IllegalArgumentException if [format] is not supported.
*/
+ @JvmStatic
public fun open(path: Path, format: String): Trace {
val provider = requireNotNull(TraceFormat.byName(format)) { "Unknown format $format" }
return TraceImpl(provider, path)
}
+
+ /**
+ * Create a [Trace] at the specified [path] in the given [format].
+ *
+ * @param path The [Path] to the trace.
+ * @param format The format of the trace to create.
+ */
+ @JvmStatic
+ public fun create(path: File, format: String): Trace = create(path.toPath(), format)
+
+ /**
+ * Create a [Trace] at the specified [path] in the given [format].
+ *
+ * @param path The [Path] to the trace.
+ * @param format The format of the trace to create.
+ */
+ @JvmStatic
+ public fun create(path: Path, format: String): Trace {
+ val provider = requireNotNull(TraceFormat.byName(format)) { "Unknown format $format" }
+ provider.create(path)
+ return TraceImpl(provider, path)
+ }
}
}
diff --git a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/internal/TableImpl.kt b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/internal/TableImpl.kt
index fd0a0f04..24551edb 100644
--- a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/internal/TableImpl.kt
+++ b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/internal/TableImpl.kt
@@ -25,6 +25,7 @@ package org.opendc.trace.internal
import org.opendc.trace.Table
import org.opendc.trace.TableColumn
import org.opendc.trace.TableReader
+import org.opendc.trace.TableWriter
import java.util.*
/**
@@ -44,6 +45,8 @@ internal class TableImpl(val trace: TraceImpl, override val name: String) : Tabl
override fun newReader(): TableReader = trace.format.newReader(trace.path, name)
+ override fun newWriter(): TableWriter = trace.format.newWriter(trace.path, name)
+
override fun toString(): String = "Table[name=$name]"
override fun hashCode(): Int = Objects.hash(trace, name)
diff --git a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt
index e04dd948..f2e610db 100644
--- a/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt
+++ b/opendc-trace/opendc-trace-api/src/main/kotlin/org/opendc/trace/spi/TraceFormat.kt
@@ -23,6 +23,7 @@
package org.opendc.trace.spi
import org.opendc.trace.TableReader
+import org.opendc.trace.TableWriter
import java.nio.file.Path
import java.util.*
@@ -36,6 +37,15 @@ public interface TraceFormat {
public val name: String
/**
+ * Construct an empty trace at [path].
+ *
+ * @param path The path where to create the empty trace.
+ * @throws IllegalArgumentException If [path] is invalid.
+ * @throws UnsupportedOperationException If the table does not support trace creation.
+ */
+ public fun create(path: Path)
+
+ /**
* Return the name of the tables available in the trace at the specified [path].
*
* @param path The path to the trace.
@@ -64,6 +74,17 @@ public interface TraceFormat {
public fun newReader(path: Path, table: String): TableReader
/**
+ * Open a [TableWriter] for the specified [table].
+ *
+ * @param path The path to the trace to open.
+ * @param table The name of the table to open a [TableWriter] for.
+ * @throws IllegalArgumentException If [table] does not exist.
+ * @throws UnsupportedOperationException If the format does not support writing.
+ * @return A [TableWriter] instance for the table.
+ */
+ public fun newWriter(path: Path, table: String): TableWriter
+
+ /**
* A helper object for resolving providers.
*/
public companion object {