Skip to content

Commit 281a005

Browse files
committed
Curl engine build experiment
1 parent bd8f216 commit 281a005

File tree

7 files changed

+73
-9
lines changed

7 files changed

+73
-9
lines changed

.github/workflows/buildLinux64.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Build LinuxArm64
2+
on:
3+
workflow_dispatch:
4+
5+
jobs:
6+
build:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- name: Checkout code
10+
uses: actions/checkout@v3
11+
12+
- name: Configure JDK
13+
uses: actions/setup-java@v1
14+
with:
15+
java-version: 17
16+
17+
- name: Run build
18+
- run: ./gradlew build
19+
20+
- name: Upload artifacts
21+
uses: actions/upload-artifact@v3
22+
with:
23+
name: kotlin-native-arm-build
24+
path: sample/build/bin/linuxArm64/releaseExecutable

lambda-runtime/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ kotlin {
1313
implementation(libs.kotlin.serialization.json)
1414
implementation(libs.kotlin.io.core)
1515
implementation(libs.kotlin.date.time)
16-
implementation(libs.ktor.client.cio)
16+
//implementation(libs.ktor.client.cio)
17+
implementation(libs.ktor.client.curl)
1718
implementation(libs.ktor.client.logging)
1819
implementation(libs.ktor.content.negotiation)
1920
implementation(libs.ktor.content.json)

lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/LambdaRuntime.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ import io.github.trueangle.knative.lambda.runtime.handler.LambdaStreamHandler
99
import io.github.trueangle.knative.lambda.runtime.log.Log
1010
import io.github.trueangle.knative.lambda.runtime.log.LogLevel
1111
import io.ktor.client.HttpClient
12-
import io.ktor.client.engine.cio.CIO
12+
import io.ktor.client.engine.curl.Curl
1313
import io.ktor.client.plugins.HttpTimeout
1414
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
15-
import io.ktor.client.plugins.logging.LogLevel as KtorLogLevel
1615
import io.ktor.client.plugins.logging.Logger
1716
import io.ktor.client.plugins.logging.Logging
1817
import io.ktor.http.content.OutgoingContent.WriteChannelContent
@@ -24,9 +23,11 @@ import io.ktor.utils.io.writeStringUtf8
2423
import kotlinx.coroutines.runBlocking
2524
import kotlinx.serialization.json.Json
2625
import kotlin.system.exitProcess
26+
import kotlin.time.TimeSource
27+
import io.ktor.client.plugins.logging.LogLevel as KtorLogLevel
2728

2829
object LambdaRuntime {
29-
private val httpClient = HttpClient(CIO) {
30+
private val httpClient = HttpClient(Curl) {
3031
install(HttpTimeout)
3132
install(ContentNegotiation) {
3233
json(Json { explicitNulls = false })
@@ -44,6 +45,7 @@ object LambdaRuntime {
4445
internal val client = LambdaClient(httpClient)
4546

4647
inline fun <reified I, reified O> run(crossinline initHandler: () -> LambdaHandler<I, O>) = runBlocking {
48+
val initMark = TimeSource.Monotonic.markNow()
4749
val handler = try {
4850
initHandler()
4951
} catch (e: Exception) {
@@ -52,13 +54,16 @@ object LambdaRuntime {
5254
client.reportError(e.asInitError())
5355
exitProcess(1)
5456
}
57+
println("initHandler time " + initMark.elapsedNow().inWholeMilliseconds)
5558

5659
val inputTypeInfo = typeInfo<I>()
5760
val outputTypeInfo = typeInfo<O>()
5861

5962
while (true) {
6063
try {
64+
val mark = TimeSource.Monotonic.markNow()
6165
val (event, context) = client.retrieveNextEvent<I>(inputTypeInfo)
66+
println("retrieveNextEvent time " + mark.elapsedNow().inWholeMilliseconds)
6267

6368
with(Log) {
6469
setContext(context)
@@ -71,8 +76,13 @@ object LambdaRuntime {
7176
client.streamResponse(context, response)
7277
} else {
7378
handler as LambdaBufferedHandler<I, O>
79+
val handlerMark = TimeSource.Monotonic.markNow()
7480
val response = bufferedResponse(context) { handler.handleRequest(event, context) }
81+
println("handleRequest time " + handlerMark.elapsedNow().inWholeMilliseconds)
82+
83+
val sendResponseMark = TimeSource.Monotonic.markNow()
7584
client.sendResponse(context, response, outputTypeInfo)
85+
println("sendResponse time " + sendResponseMark.elapsedNow().inWholeMilliseconds)
7686
}
7787
} catch (e: LambdaRuntimeException) {
7888
Log.error(e)

lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/api/LambdaRuntimeClient.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,37 @@ import io.ktor.http.contentType
2424
import io.ktor.util.reflect.TypeInfo
2525
import kotlinx.serialization.json.Json
2626
import kotlin.time.Duration.Companion.minutes
27+
import kotlin.time.TimeSource
2728
import io.ktor.http.ContentType.Application.Json as ContentTypeJson
2829

2930
@PublishedApi
3031
internal class LambdaClient(private val httpClient: HttpClient) {
3132
private val invokeUrl = "http://${LambdaEnvironment.RUNTIME_API}/2018-06-01/runtime"
3233

3334
suspend fun <T> retrieveNextEvent(bodyType: TypeInfo): Pair<T, Context> {
35+
val requestMark = TimeSource.Monotonic.markNow()
3436
val response = httpClient.get {
3537
url("${invokeUrl}/invocation/next")
3638
timeout {
3739
requestTimeoutMillis = 60 * 1000 * 30 // todo
3840
}
3941
}
42+
println("retrieveNextEvent requestMark " + requestMark.elapsedNow().inWholeMilliseconds)
4043

44+
val contextMark = TimeSource.Monotonic.markNow()
4145
val context = contextFromResponseHeaders(response)
46+
47+
println("retrieveNextEvent contextMark " + contextMark.elapsedNow().inWholeMilliseconds)
48+
49+
val bodyMark = TimeSource.Monotonic.markNow()
4250
val body = try {
4351
response.body(bodyType) as T
4452
} catch (e: Exception) {
4553
throw EventBodyParseException(cause = e, context = context)
4654
}
4755

56+
println("retrieveNextEvent bodyMark " + bodyMark.elapsedNow().inWholeMilliseconds)
57+
4858
return body to context
4959
}
5060

sample/build.gradle.kts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,22 @@ kotlin {
88
val isArm64 = System.getProperty("os.arch") == "aarch64"
99
val nativeTarget = if (isArm64) linuxArm64() else linuxX64()
1010

11-
nativeTarget.binaries {
12-
executable {
13-
entryPoint = "com.github.trueangle.knative.lambda.runtime.sample.main"
11+
nativeTarget.apply {
12+
/*compilations.getByName("main") {
13+
cinterops {
14+
val libcurl by creating {
15+
definitionFile.set(project.file("src/nativeInterop/cinterop/libcurl.def"))
16+
*//* packageName("com.github.trueangle.knative.lambda.runtime.sample.libcurl")
17+
compilerOpts("-I/path")
18+
includeDirs.allHeaders("path")*//*
19+
}
20+
}
21+
}*/
22+
binaries {
23+
executable {
24+
//linkerOpts = mutableListOf("-L/opt/homebrew/Cellar/curl/8.9.1/lib", "-I/opt/homebrew/Cellar/curl/8.9.1/include", "-lcurl")
25+
entryPoint = "com.github.trueangle.knative.lambda.runtime.sample.main"
26+
}
1427
}
1528
}
1629

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package = libcurl
2+
headers = curl/curl.h
3+
headerFilter = curl/*
4+
5+
#compilerOpts.linux = -I/opt/homebrew/Cellar/curl/8.9.1/include
6+
#linkerOpts.linux = -L/opt/homebrew/Cellar/curl/8.9.1/lib -lcurl
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.github.trueangle.knative.lambda.runtime.sample
22

3-
import com.github.trueangle.knative.lambda.runtime.sample.handler.ObjectBodyLambdaHandler
3+
import com.github.trueangle.knative.lambda.runtime.sample.handler.StringBodyLambdaHandler
44
import io.github.trueangle.knative.lambda.runtime.LambdaRuntime
55

6-
fun main() = LambdaRuntime.run { ObjectBodyLambdaHandler() }
6+
fun main() = LambdaRuntime.run { StringBodyLambdaHandler() }

0 commit comments

Comments
 (0)