mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2026-06-13 14:38:43 +00:00
ProxyTypes
This commit is contained in:
@@ -1031,7 +1031,7 @@ public partial class EpConnection : NetworkConnection, IStore
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
async Task AuthenticatonCompleted()
|
void AuthenticatonCompleted()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (this.Instance == null)
|
if (this.Instance == null)
|
||||||
@@ -1070,8 +1070,11 @@ public partial class EpConnection : NetworkConnection, IStore
|
|||||||
|
|
||||||
var proxyTypes = Instance.Warehouse.GetProxyTypesByDomain(_remoteDomain);
|
var proxyTypes = Instance.Warehouse.GetProxyTypesByDomain(_remoteDomain);
|
||||||
|
|
||||||
|
if (proxyTypes != null)
|
||||||
|
{
|
||||||
var typeDefNames = new List<string>();
|
var typeDefNames = new List<string>();
|
||||||
|
|
||||||
|
|
||||||
foreach (var kk in proxyTypes)
|
foreach (var kk in proxyTypes)
|
||||||
{
|
{
|
||||||
foreach (var kv in kk.Value)
|
foreach (var kv in kk.Value)
|
||||||
@@ -1079,6 +1082,7 @@ public partial class EpConnection : NetworkConnection, IStore
|
|||||||
typeDefNames.Add(kv.Key);
|
typeDefNames.Add(kv.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeDefNames.Count > 0)
|
if (typeDefNames.Count > 0)
|
||||||
{
|
{
|
||||||
GetTypeDefIds(typeDefNames.ToArray()).Then(ids =>
|
GetTypeDefIds(typeDefNames.ToArray()).Then(ids =>
|
||||||
@@ -1105,6 +1109,12 @@ public partial class EpConnection : NetworkConnection, IStore
|
|||||||
_openReply?.Trigger(true);
|
_openReply?.Trigger(true);
|
||||||
_openReply = null;
|
_openReply = null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_openReply?.Trigger(true);
|
||||||
|
_openReply = null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,10 +44,10 @@ for (int batch = 0; batch < resourceCount; batch += batchSize)
|
|||||||
{
|
{
|
||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
|
|
||||||
Console.WriteLine(capturedI);
|
//Console.WriteLine(capturedI);
|
||||||
proxies[capturedI] = await connnection.Get($"sys/sensor_{capturedI}");
|
proxies[capturedI] = await connnection.Get($"sys/sensor_{capturedI}");
|
||||||
|
|
||||||
Console.WriteLine(proxies[capturedI].Instance.Link);
|
//Console.WriteLine(proxies[capturedI].Instance.Link);
|
||||||
|
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ Console.WriteLine($"[Server-T2] Creating {resourceCount} resources on port {port
|
|||||||
var wh = new Warehouse();
|
var wh = new Warehouse();
|
||||||
|
|
||||||
await wh.Put("sys", new MemoryStore());
|
await wh.Put("sys", new MemoryStore());
|
||||||
var server = await wh.Put("sys/server", new EpServer() { Port = (ushort)port });
|
var server = await wh.Put("sys/server", new EpServer() { Port = (ushort)port,
|
||||||
|
AllowUnauthorizedAccess = true});
|
||||||
|
|
||||||
long memBefore = GC.GetTotalMemory(forceFullCollection: true);
|
long memBefore = GC.GetTotalMemory(forceFullCollection: true);
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ namespace Esiur.Tests.RPC.Client
|
|||||||
{
|
{
|
||||||
public static async Task<TestResults> DoTest(string address,
|
public static async Task<TestResults> DoTest(string address,
|
||||||
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
||||||
Dictionary<string, byte[]> dataWorkloads,
|
//Dictionary<string, byte[]> dataWorkloads,
|
||||||
Dictionary<string, int[]> intWorkloads,
|
//Dictionary<string, int[]> intWorkloads,
|
||||||
int warmupDelayMs = 3000,
|
int warmupDelayMs = 3000,
|
||||||
int postHandshakeDelayMs = 2000,
|
int postHandshakeDelayMs = 2000,
|
||||||
int sampleDelayMs = 3000)
|
int sampleDelayMs = 3000)
|
||||||
@@ -19,7 +19,7 @@ namespace Esiur.Tests.RPC.Client
|
|||||||
var rt = new TestResults();
|
var rt = new TestResults();
|
||||||
|
|
||||||
using var mon = new PerProcessNetMonitor(Process.GetCurrentProcess().Id);
|
using var mon = new PerProcessNetMonitor(Process.GetCurrentProcess().Id);
|
||||||
//mon.Start();
|
mon.Start();
|
||||||
|
|
||||||
Console.WriteLine($"\n== Esiur @ {address} ==");
|
Console.WriteLine($"\n== Esiur @ {address} ==");
|
||||||
|
|
||||||
@@ -60,45 +60,45 @@ namespace Esiur.Tests.RPC.Client
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in dataWorkloads)
|
//foreach (var w in dataWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Bytes Workload: " + w.Key);
|
// Console.Write("Bytes Workload: " + w.Key);
|
||||||
var res = await service.EchoBytes(w.Value);
|
// var res = await service.EchoBytes(w.Value);
|
||||||
|
|
||||||
|
|
||||||
if (!w.Value.SequenceEqual(res))
|
// if (!w.Value.SequenceEqual(res))
|
||||||
throw new Exception("No match");
|
// throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Bytes.Add(w.Key, (ctx, crx));
|
// rt.Bytes.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in intWorkloads)
|
//foreach (var w in intWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Ints Workload: " + w.Key);
|
// Console.Write("Ints Workload: " + w.Key);
|
||||||
var res = await service.EchoIntArray(w.Value);
|
// var res = await service.EchoIntArray(w.Value);
|
||||||
|
|
||||||
|
|
||||||
if (!w.Value.SequenceEqual(res))
|
// if (!w.Value.SequenceEqual(res))
|
||||||
throw new Exception("No match");
|
// throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
|
|
||||||
rt.Ints.Add(w.Key, (ctx, crx));
|
// rt.Ints.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
await Task.Delay(sampleDelayMs);
|
||||||
|
|
||||||
|
|||||||
@@ -122,13 +122,13 @@ public static class ExperimentResultWriter
|
|||||||
IReadOnlyList<(string Protocol, string Category, string Workload, int Count, NumberStats Tx, NumberStats Rx)> rows)
|
IReadOnlyList<(string Protocol, string Category, string Workload, int Count, NumberStats Tx, NumberStats Rx)> rows)
|
||||||
{
|
{
|
||||||
var csv = new StringBuilder();
|
var csv = new StringBuilder();
|
||||||
csv.AppendLine("protocol,category,workload,samples,tx_avg_bytes,tx_min_bytes,tx_max_bytes,tx_median_bytes,rx_avg_bytes,rx_min_bytes,rx_max_bytes,rx_median_bytes");
|
csv.AppendLine("protocol,category,workload,samples,tx_avg_bytes,tx_stddev_bytes,tx_min_bytes,tx_max_bytes,tx_median_bytes,rx_avg_bytes,rx_stddev_bytes,rx_min_bytes,rx_max_bytes,rx_median_bytes");
|
||||||
foreach (var x in rows)
|
foreach (var x in rows)
|
||||||
{
|
{
|
||||||
csv.AppendLine(string.Join(",",
|
csv.AppendLine(string.Join(",",
|
||||||
Csv(x.Protocol), Csv(x.Category), Csv(x.Workload), x.Count,
|
Csv(x.Protocol), Csv(x.Category), Csv(x.Workload), x.Count,
|
||||||
D(x.Tx.Average), D(x.Tx.Minimum), D(x.Tx.Maximum), D(x.Tx.Median),
|
D(x.Tx.Average), D(x.Tx.StandardDeviation), D(x.Tx.Minimum), D(x.Tx.Maximum), D(x.Tx.Median),
|
||||||
D(x.Rx.Average), D(x.Rx.Minimum), D(x.Rx.Maximum), D(x.Rx.Median)));
|
D(x.Rx.Average), D(x.Rx.StandardDeviation), D(x.Rx.Minimum), D(x.Rx.Maximum), D(x.Rx.Median)));
|
||||||
}
|
}
|
||||||
File.WriteAllText(path, csv.ToString());
|
File.WriteAllText(path, csv.ToString());
|
||||||
}
|
}
|
||||||
@@ -151,14 +151,14 @@ public static class ExperimentResultWriter
|
|||||||
IReadOnlyList<(string Protocol, string Category, string Workload, int Count, NumberStats Payload, NumberStats Serialize, NumberStats Deserialize)> rows)
|
IReadOnlyList<(string Protocol, string Category, string Workload, int Count, NumberStats Payload, NumberStats Serialize, NumberStats Deserialize)> rows)
|
||||||
{
|
{
|
||||||
var csv = new StringBuilder();
|
var csv = new StringBuilder();
|
||||||
csv.AppendLine("protocol,category,workload,samples,payload_avg_bytes,payload_min_bytes,payload_max_bytes,payload_median_bytes,serialize_avg_ms,serialize_min_ms,serialize_max_ms,serialize_median_ms,deserialize_avg_ms,deserialize_min_ms,deserialize_max_ms,deserialize_median_ms");
|
csv.AppendLine("protocol,category,workload,samples,payload_avg_bytes,payload_stddev_bytes,payload_min_bytes,payload_max_bytes,payload_median_bytes,serialize_avg_ms,serialize_stddev_ms,serialize_min_ms,serialize_max_ms,serialize_median_ms,deserialize_avg_ms,deserialize_stddev_ms,deserialize_min_ms,deserialize_max_ms,deserialize_median_ms");
|
||||||
foreach (var x in rows)
|
foreach (var x in rows)
|
||||||
{
|
{
|
||||||
csv.AppendLine(string.Join(",",
|
csv.AppendLine(string.Join(",",
|
||||||
Csv(x.Protocol), Csv(x.Category), Csv(x.Workload), x.Count,
|
Csv(x.Protocol), Csv(x.Category), Csv(x.Workload), x.Count,
|
||||||
D(x.Payload.Average), D(x.Payload.Minimum), D(x.Payload.Maximum), D(x.Payload.Median),
|
D(x.Payload.Average), D(x.Payload.StandardDeviation), D(x.Payload.Minimum), D(x.Payload.Maximum), D(x.Payload.Median),
|
||||||
D(x.Serialize.Average), D(x.Serialize.Minimum), D(x.Serialize.Maximum), D(x.Serialize.Median),
|
D(x.Serialize.Average), D(x.Serialize.StandardDeviation), D(x.Serialize.Minimum), D(x.Serialize.Maximum), D(x.Serialize.Median),
|
||||||
D(x.Deserialize.Average), D(x.Deserialize.Minimum), D(x.Deserialize.Maximum), D(x.Deserialize.Median)));
|
D(x.Deserialize.Average), D(x.Deserialize.StandardDeviation), D(x.Deserialize.Minimum), D(x.Deserialize.Maximum), D(x.Deserialize.Median)));
|
||||||
}
|
}
|
||||||
File.WriteAllText(path, csv.ToString());
|
File.WriteAllText(path, csv.ToString());
|
||||||
}
|
}
|
||||||
@@ -232,19 +232,24 @@ public static class ExperimentResultWriter
|
|||||||
private static string D(double value)
|
private static string D(double value)
|
||||||
=> value.ToString("0.###", CultureInfo.InvariantCulture);
|
=> value.ToString("0.###", CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
public readonly record struct NumberStats(double Average, double Minimum, double Maximum, double Median)
|
public readonly record struct NumberStats(double Average, double Minimum, double Maximum, double Median, double StandardDeviation)
|
||||||
{
|
{
|
||||||
public static NumberStats From(IEnumerable<double> values)
|
public static NumberStats From(IEnumerable<double> values)
|
||||||
{
|
{
|
||||||
var sorted = values.OrderBy(x => x).ToArray();
|
var sorted = values.OrderBy(x => x).ToArray();
|
||||||
if (sorted.Length == 0)
|
if (sorted.Length == 0)
|
||||||
return new NumberStats(double.NaN, double.NaN, double.NaN, double.NaN);
|
return new NumberStats(double.NaN, double.NaN, double.NaN, double.NaN, double.NaN);
|
||||||
|
|
||||||
|
var avg = sorted.Average();
|
||||||
var median = sorted.Length % 2 == 1
|
var median = sorted.Length % 2 == 1
|
||||||
? sorted[sorted.Length / 2]
|
? sorted[sorted.Length / 2]
|
||||||
: (sorted[sorted.Length / 2 - 1] + sorted[sorted.Length / 2]) / 2.0;
|
: (sorted[sorted.Length / 2 - 1] + sorted[sorted.Length / 2]) / 2.0;
|
||||||
|
|
||||||
return new NumberStats(sorted.Average(), sorted[0], sorted[^1], median);
|
// Calculate standard deviation
|
||||||
|
var variance = sorted.Aggregate(0.0, (sum, x) => sum + Math.Pow(x - avg, 2)) / sorted.Length;
|
||||||
|
var stdDev = Math.Sqrt(variance);
|
||||||
|
|
||||||
|
return new NumberStats(avg, sorted[0], sorted[^1], median, stdDev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ public class GrpcTest
|
|||||||
|
|
||||||
public static async Task<TestResults> DoTest(string address,
|
public static async Task<TestResults> DoTest(string address,
|
||||||
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
||||||
Dictionary<string, byte[]> dataWorkloads,
|
//Dictionary<string, byte[]> dataWorkloads,
|
||||||
Dictionary<string, int[]> intWorkloads,
|
//Dictionary<string, int[]> intWorkloads,
|
||||||
int warmupDelayMs = 3000,
|
int warmupDelayMs = 3000,
|
||||||
int postHandshakeDelayMs = 2000,
|
int postHandshakeDelayMs = 2000,
|
||||||
int sampleDelayMs = 3000)
|
int sampleDelayMs = 3000)
|
||||||
@@ -63,50 +63,50 @@ public class GrpcTest
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in dataWorkloads)
|
//foreach (var w in dataWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Bytes Workload: " + w.Key);
|
// Console.Write("Bytes Workload: " + w.Key);
|
||||||
|
|
||||||
var br = new BytesRequest() { Data = ByteString.CopyFrom(w.Value) };
|
// var br = new BytesRequest() { Data = ByteString.CopyFrom(w.Value) };
|
||||||
var res = await service.EchoBytesAsync(br);
|
// var res = await service.EchoBytesAsync(br);
|
||||||
|
|
||||||
|
|
||||||
//if (!w.Value.SequenceEqual(rt))
|
// //if (!w.Value.SequenceEqual(rt))
|
||||||
// throw new Exception("No match");
|
// // throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Bytes.Add(w.Key, (ctx, crx));
|
// rt.Bytes.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in intWorkloads)
|
//foreach (var w in intWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Ints Workload: " + w.Key);
|
// Console.Write("Ints Workload: " + w.Key);
|
||||||
|
|
||||||
var ir = new IntArrayRequest();
|
// var ir = new IntArrayRequest();
|
||||||
ir.Array.AddRange(w.Value);
|
// ir.Array.AddRange(w.Value);
|
||||||
|
|
||||||
var res = await service.EchoIntArrayAsync(ir);
|
// var res = await service.EchoIntArrayAsync(ir);
|
||||||
|
|
||||||
|
|
||||||
//if (!w.Value.SequenceEqual(rt))
|
// //if (!w.Value.SequenceEqual(rt))
|
||||||
// throw new Exception("No match");
|
// // throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Ints.Add(w.Key, (ctx, crx));
|
// rt.Ints.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
await Task.Delay(sampleDelayMs);
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ public class JsonTest
|
|||||||
|
|
||||||
public static async Task<TestResults> DoTest(string address,
|
public static async Task<TestResults> DoTest(string address,
|
||||||
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
||||||
Dictionary<string, byte[]> dataWorkloads,
|
//Dictionary<string, byte[]> dataWorkloads,
|
||||||
Dictionary<string, int[]> intWorkloads,
|
//Dictionary<string, int[]> intWorkloads,
|
||||||
int warmupDelayMs = 3000,
|
int warmupDelayMs = 3000,
|
||||||
int postHandshakeDelayMs = 2000,
|
int postHandshakeDelayMs = 2000,
|
||||||
int sampleDelayMs = 3000)
|
int sampleDelayMs = 3000)
|
||||||
@@ -54,45 +54,45 @@ public class JsonTest
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in dataWorkloads)
|
//foreach (var w in dataWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Bytes Workload: " + w.Key);
|
// Console.Write("Bytes Workload: " + w.Key);
|
||||||
|
|
||||||
var res = await JsonRpcCallAsync(http, "EchoBytes", w.Value);
|
// var res = await JsonRpcCallAsync(http, "EchoBytes", w.Value);
|
||||||
|
|
||||||
|
|
||||||
//if (!w.Value.SequenceEqual(rt))
|
// //if (!w.Value.SequenceEqual(rt))
|
||||||
// throw new Exception("No match");
|
// // throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Bytes.Add(w.Key, (ctx, crx));
|
// rt.Bytes.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in intWorkloads)
|
//foreach (var w in intWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Ints Workload: " + w.Key);
|
// Console.Write("Ints Workload: " + w.Key);
|
||||||
|
|
||||||
var res = await JsonRpcCallAsync(http, "EchoIntArray", w.Value);
|
// var res = await JsonRpcCallAsync(http, "EchoIntArray", w.Value);
|
||||||
|
|
||||||
//if (!w.Value.SequenceEqual(rt))
|
// //if (!w.Value.SequenceEqual(rt))
|
||||||
// throw new Exception("No match");
|
// // throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Ints.Add(w.Key, (ctx, crx));
|
// rt.Ints.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
await Task.Delay(sampleDelayMs);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,446 @@
|
|||||||
|
using Esiur.Data;
|
||||||
|
using Esiur.Tests.RPC.EsiurServer;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Esiur.Tests.RPC.Client;
|
||||||
|
|
||||||
|
|
||||||
|
public static class ModelGenerator
|
||||||
|
{
|
||||||
|
public sealed class GenOptions
|
||||||
|
{
|
||||||
|
public int Lines { get; init; } = 20; // items count
|
||||||
|
public int Attachments { get; init; } = 0; // 0..N
|
||||||
|
public int AttachmentBytes { get; init; } = 0;// per attachment
|
||||||
|
public int Payments { get; init; } = 1; // 0..N
|
||||||
|
public bool IncludeV2Fields { get; init; } = false;
|
||||||
|
public bool IncludeUnicode { get; init; } = true; // Arabic/emoji sprinkled in
|
||||||
|
public int VariantPerLine { get; init; } = 1; // ad-hoc KV per line
|
||||||
|
public Currency Currency { get; init; } = Currency.USD;
|
||||||
|
|
||||||
|
public int RiskScores { get; set; } = 20;
|
||||||
|
public int Seed { get; init; } = 12345;
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class WorkItem
|
||||||
|
{
|
||||||
|
public required string Name { get; init; }
|
||||||
|
public required BusinessDocument Payload { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<(string, List<WorkItem>)> BuildWorkloads()
|
||||||
|
{
|
||||||
|
var result = new List<(string, List<WorkItem>)>();
|
||||||
|
|
||||||
|
// Small
|
||||||
|
{
|
||||||
|
var items = new List<WorkItem>();
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
var doc = ModelGenerator.MakeBusinessDocument(new ModelGenerator.GenOptions
|
||||||
|
{
|
||||||
|
Lines = 5,
|
||||||
|
Payments = 3,
|
||||||
|
Attachments = 0,
|
||||||
|
IncludeV2Fields = (i % 2 == 0),
|
||||||
|
IncludeUnicode = true,
|
||||||
|
RiskScores = 500,
|
||||||
|
Seed = 1000 + i
|
||||||
|
});
|
||||||
|
|
||||||
|
items.Add(new WorkItem { Name = $"S-{i}", Payload = doc });
|
||||||
|
}
|
||||||
|
result.Add(("Small", items));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Medium
|
||||||
|
{
|
||||||
|
var items = new List<WorkItem>();
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
var doc = ModelGenerator.MakeBusinessDocument(new ModelGenerator.GenOptions
|
||||||
|
{
|
||||||
|
Lines = 20,
|
||||||
|
Payments = 5,
|
||||||
|
Attachments = 1,
|
||||||
|
AttachmentBytes = 8 * 1024,
|
||||||
|
IncludeV2Fields = (i % 3 == 0),
|
||||||
|
IncludeUnicode = true,
|
||||||
|
RiskScores = 1000,
|
||||||
|
Seed = 2000 + i
|
||||||
|
});
|
||||||
|
items.Add(new WorkItem { Name = $"M-{i}", Payload = doc });
|
||||||
|
}
|
||||||
|
result.Add(("Medium", items));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Large
|
||||||
|
{
|
||||||
|
var items = new List<WorkItem>();
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
var doc = ModelGenerator.MakeBusinessDocument(new ModelGenerator.GenOptions
|
||||||
|
{
|
||||||
|
Lines = 100,
|
||||||
|
Payments = 20,
|
||||||
|
Attachments = 3,
|
||||||
|
AttachmentBytes = 64 * 1024,
|
||||||
|
IncludeV2Fields = (i % 2 == 1),
|
||||||
|
IncludeUnicode = true,
|
||||||
|
RiskScores = 3000,
|
||||||
|
Seed = 3000 + i
|
||||||
|
});
|
||||||
|
items.Add(new WorkItem { Name = $"L-{i}", Payload = doc });
|
||||||
|
}
|
||||||
|
result.Add(("Large", items));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
public static BusinessDocument MakeBusinessDocument(GenOptions? options = null)
|
||||||
|
{
|
||||||
|
var opt = options ?? new GenOptions();
|
||||||
|
var rng = new Random(opt.Seed);
|
||||||
|
|
||||||
|
var seller = MakeParty(rng, opt.IncludeV2Fields, isSeller: true, opt.IncludeUnicode);
|
||||||
|
var buyer = MakeParty(rng, opt.IncludeV2Fields, isSeller: false, opt.IncludeUnicode);
|
||||||
|
|
||||||
|
var createdAt = DateTime.UtcNow.AddMinutes(-rng.Next(0, 60 * 24));
|
||||||
|
var doc = new BusinessDocument
|
||||||
|
{
|
||||||
|
Header = new DocumentHeader
|
||||||
|
{
|
||||||
|
DocId = Guid.NewGuid().ToByteArray(),
|
||||||
|
Type = (DocType)rng.Next(0, 4),
|
||||||
|
Version = 1,
|
||||||
|
CreatedAt = createdAt,
|
||||||
|
UpdatedAt = null,
|
||||||
|
Currency = opt.Currency,
|
||||||
|
Notes = opt.IncludeUnicode ? SampleNoteUnicode(rng) : SampleNoteAscii(rng),
|
||||||
|
Meta = new Map<string, Variant>
|
||||||
|
{
|
||||||
|
["source"] = VStr("benchmark"),
|
||||||
|
["region"] = VStr("ME"),
|
||||||
|
["channel"] = VStr(rng.Next(0, 2) == 0 ? "online" : "pos"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Seller = seller,
|
||||||
|
Buyer = buyer,
|
||||||
|
Items = new LineItem[opt.Lines],
|
||||||
|
Payments = opt.Payments > 0 ? new Payment[opt.Payments] : null,
|
||||||
|
Attachments = opt.Attachments > 0 ? new Attachment[opt.Attachments] : null,
|
||||||
|
|
||||||
|
RiskScores = RandomRiskScores(rng, opt.RiskScores),
|
||||||
|
//RelatedDocs_v2 = opt.IncludeV2Fields ? new List<Guid> { Guid.NewGuid(), Guid.NewGuid() } : null
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Items
|
||||||
|
for (int i = 0; i < opt.Lines; i++)
|
||||||
|
doc.Items[i] = MakeLineItem(rng, i + 1, opt.IncludeV2Fields, opt.VariantPerLine, opt.IncludeUnicode);
|
||||||
|
|
||||||
|
// Payments
|
||||||
|
if (doc.Payments != null)
|
||||||
|
{
|
||||||
|
var grand = doc.Items.Sum(L => L.UnitPrice * L.Qty * (double)(1.0 - (L.Discount ?? 0.0) / 100.0));
|
||||||
|
var remain = grand;
|
||||||
|
for (int i = 0; i < opt.Payments; i++)
|
||||||
|
{
|
||||||
|
var last = (i == opt.Payments - 1);
|
||||||
|
var amt = last ? remain : RoundMoney((double)rng.NextDouble() * remain * 0.7 + 1.0);
|
||||||
|
remain = Math.Max(0.0, remain - amt);
|
||||||
|
doc.Payments[i] = MakePayment(rng, amt, opt.IncludeV2Fields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attachments
|
||||||
|
if (doc.Attachments != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < opt.Attachments; i++)
|
||||||
|
doc.Attachments[i] = MakeAttachment(rng, i, opt.AttachmentBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a slightly modified copy of an existing document to test delta/partial updates.
|
||||||
|
/// Changes: tweak 5–10% of line items (qty/price), add or edit a payment, and bump UpdatedAt.
|
||||||
|
/// </summary>
|
||||||
|
public static BusinessDocument MakeDelta(BusinessDocument v1, int seed, double changeRatio = 0.07)
|
||||||
|
{
|
||||||
|
var rng = new Random(seed);
|
||||||
|
var v2 = DeepClone(v1);
|
||||||
|
|
||||||
|
v2.Header.UpdatedAt = DateTime.UtcNow;
|
||||||
|
var toChange = Math.Max(1, (int)Math.Round(v2.Items.Length * changeRatio));
|
||||||
|
|
||||||
|
// change random lines
|
||||||
|
for (int i = 0; i < toChange; i++)
|
||||||
|
{
|
||||||
|
var idx = rng.Next(0, v2.Items.Length);
|
||||||
|
var li = v2.Items[idx];
|
||||||
|
li.Qty = RoundQty(li.Qty + (double)(rng.NextDouble() * 2.0 - 1.0)); // ±1
|
||||||
|
li.UnitPrice = RoundMoney(li.UnitPrice * (double)(0.95 + rng.NextDouble() * 0.1)); // ±5%
|
||||||
|
if (li.Ext == null) li.Ext = new Map<string, Variant>();
|
||||||
|
li.Ext["lastEdit"] = VDate(DateTime.UtcNow);
|
||||||
|
//li.ExtKeys = li.Ext.Keys.ToArray();
|
||||||
|
//li.ExtValues = li.Ext.Values.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (v2.Payments == null || rng.Next(0, 3) == 0)
|
||||||
|
{
|
||||||
|
if (v2.Payments == null)
|
||||||
|
{
|
||||||
|
if (v2.Payments == null) v2.Payments = new Payment[1];
|
||||||
|
v2.Payments[0] = (MakePayment(rng, RoundMoney((double)rng.NextDouble() * 50.0 + 10.0), includeV2: true));
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
v2.Payments = v2.Payments.Append((MakePayment(rng, RoundMoney((double)rng.NextDouble() * 50.0 + 10.0), includeV2: true))).ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var p = v2.Payments[rng.Next(0, v2.Payments.Length)];
|
||||||
|
p.Fee = (p.Fee ?? 0.0) + 0.25;
|
||||||
|
p.Reference = "ADJ-" + rng.Next(10000, 99999).ToString(CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
return v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------- Builders --------------------------
|
||||||
|
|
||||||
|
private static int[] RandomRiskScores(Random rng, int count)
|
||||||
|
{
|
||||||
|
|
||||||
|
var rt = new int[count];// rng.Next(100, 1000)];
|
||||||
|
for (var i = 0; i < rt.Length; i++)
|
||||||
|
rt[i] = (int)rng.Next();
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Party MakeParty(Random rng, bool includeV2, bool isSeller, bool unicode)
|
||||||
|
{
|
||||||
|
return new Party
|
||||||
|
{
|
||||||
|
Id = (ulong)rng.NextInt64(), //Guid.NewGuid().ToByteArray(),
|
||||||
|
Name = unicode ? (isSeller ? "Delta Systems — دلتا" : "Client التجربة ✅") : (isSeller ? "Delta Systems" : "Client Demo"),
|
||||||
|
TaxId = isSeller ? $"TX-{rng.Next(100000, 999999)}" : null,
|
||||||
|
Email = (isSeller ? "sales" : "contact") + "@example.com",
|
||||||
|
Phone = "+964-7" + rng.Next(100000000, 999999999).ToString(CultureInfo.InvariantCulture),
|
||||||
|
Address = new Address
|
||||||
|
{
|
||||||
|
Line1 = rng.Next(0, 2) == 0 ? "Street 14" : "Tech Park",
|
||||||
|
City = "Baghdad",
|
||||||
|
Region = "BG",
|
||||||
|
Country = "IQ",
|
||||||
|
PostalCode = rng.Next(0, 2) == 0 ? "10001" : null
|
||||||
|
},
|
||||||
|
PreferredLanguage = includeV2 ? (rng.Next(0, 2) == 0 ? "ar-IQ" : "en-US") : null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LineItem MakeLineItem(Random rng, int lineNo, bool includeV2, int variantKvp, bool unicode)
|
||||||
|
{
|
||||||
|
var isProduct = rng.Next(0, 100) < 80;
|
||||||
|
var desc = unicode
|
||||||
|
? (isProduct ? $"وحدة قياس — Item {lineNo} 🔧" : $"خدمة دعم — Service {lineNo} ✨")
|
||||||
|
: (isProduct ? $"Item {lineNo}" : $"Service {lineNo}");
|
||||||
|
|
||||||
|
var li = new LineItem
|
||||||
|
{
|
||||||
|
LineNo = lineNo,
|
||||||
|
Type = isProduct ? LineType.Product : LineType.Service,
|
||||||
|
SKU = isProduct ? ("SKU-" + rng.Next(1000, 9999)) : "",
|
||||||
|
Description = desc,
|
||||||
|
Qty = RoundQty((double)(rng.NextDouble() * 9.0 + 1.0)), // 1..10
|
||||||
|
QtyUnit = isProduct ? "pcs" : "h",
|
||||||
|
UnitPrice = RoundMoney((double)(rng.NextDouble() * 90.0 + 10.0)),
|
||||||
|
VatRate = rng.Next(0, 100) < 80 ? 5.0 : (double?)null,
|
||||||
|
Ext = variantKvp > 0 ? new Map<string, Variant>() : null,
|
||||||
|
Discount = includeV2 && rng.Next(0, 3) == 0 ? Math.Round(rng.NextDouble() * 10.0, 2) : (double?)null
|
||||||
|
};
|
||||||
|
|
||||||
|
if (li.Ext != null)
|
||||||
|
{
|
||||||
|
//li.ExtKeys = li.Ext.Keys.ToArray();
|
||||||
|
//li.ExtValues = li.Ext.Values.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < variantKvp; i++)
|
||||||
|
{
|
||||||
|
var key = i switch { 0 => "color", 1 => "size", 2 => "batch", _ => "attr" + i };
|
||||||
|
li.Ext!.TryAdd(key, i switch
|
||||||
|
{
|
||||||
|
0 => VStr(rng.Next(0, 3) switch { 0 => "red", 1 => "blue", _ => "green" }),
|
||||||
|
1 => VStr(rng.Next(0, 3) switch { 0 => "S", 1 => "M", _ => "L" }),
|
||||||
|
2 => VGuid(Guid.NewGuid()),
|
||||||
|
_ => VInt(rng.Next(0, 1000))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//li.ExtValues = li.Ext.Values.ToArray();
|
||||||
|
//li.ExtKeys = li.Ext.Keys.ToArray();
|
||||||
|
|
||||||
|
return li;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Payment MakePayment(Random rng, double amount, bool includeV2)
|
||||||
|
{
|
||||||
|
var p = new Payment
|
||||||
|
{
|
||||||
|
Method = (PaymentMethod)rng.Next(0, 5),
|
||||||
|
Amount = RoundMoney(amount),
|
||||||
|
Reference = "REF-" + rng.Next(100_000, 999_999),
|
||||||
|
Timestamp = DateTime.UtcNow.AddMinutes(-rng.Next(0, 60 * 24)),
|
||||||
|
Fee = includeV2 && rng.Next(0, 2) == 0 ? RoundMoney((double)rng.NextDouble() * 2.0) : null,
|
||||||
|
//CurrencyOverride = includeV2 && rng.Next(0, 2) == 0 ? Currency.IQD : Currency.USD
|
||||||
|
};
|
||||||
|
|
||||||
|
//p.TimestampAsLong = p.Timestamp.Ticks;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Attachment MakeAttachment(Random rng, int index, int bytes)
|
||||||
|
{
|
||||||
|
var arr = bytes > 0 ? new byte[bytes] : Array.Empty<byte>();
|
||||||
|
if (arr.Length > 0) rng.NextBytes(arr);
|
||||||
|
return new Attachment
|
||||||
|
{
|
||||||
|
Name = $"att-{index + 1}.bin",
|
||||||
|
MimeType = "application/octet-stream",
|
||||||
|
Data = arr
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string SampleNoteUnicode(Random rng)
|
||||||
|
=> rng.Next(0, 2) == 0
|
||||||
|
? "ملاحظة: تم إنشاء هذا المستند لأغراض الاختبار 📦"
|
||||||
|
: "Note: synthetic benchmark document 🧪";
|
||||||
|
|
||||||
|
private static string SampleNoteAscii(Random rng)
|
||||||
|
=> rng.Next(0, 2) == 0 ? "Note: synthetic benchmark document" : "Internal use only";
|
||||||
|
|
||||||
|
// -------------------------- Variant helpers --------------------------
|
||||||
|
private static Variant VStr(string s) => new() { Tag = Kind.String, Str = s };
|
||||||
|
private static Variant VInt(int v) => new() { Tag = Kind.Int64, I64 = v };
|
||||||
|
private static Variant VGuid(Guid g) => new() { Tag = Kind.Guid, Guid = g.ToByteArray() };
|
||||||
|
private static Variant VDate(DateTime d) => new() { Tag = Kind.DateTime, Dt = d };
|
||||||
|
|
||||||
|
// -------------------------- Utils --------------------------
|
||||||
|
private static double RoundMoney(double v) => Math.Round(v, 2, MidpointRounding.AwayFromZero);
|
||||||
|
private static double RoundQty(double v) => Math.Round(v, 3, MidpointRounding.AwayFromZero);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Simple deep clone via manual copy to stay serializer-agnostic.
|
||||||
|
/// (Good enough for benchmarks; switch to a fast serializer if you like.)
|
||||||
|
/// </summary>
|
||||||
|
private static BusinessDocument DeepClone(BusinessDocument s)
|
||||||
|
{
|
||||||
|
var d = new BusinessDocument
|
||||||
|
{
|
||||||
|
Header = new DocumentHeader
|
||||||
|
{
|
||||||
|
DocId = s.Header.DocId,
|
||||||
|
Type = s.Header.Type,
|
||||||
|
Version = s.Header.Version,
|
||||||
|
CreatedAt = s.Header.CreatedAt,
|
||||||
|
UpdatedAt = s.Header.UpdatedAt,
|
||||||
|
//CreatedAtAsLong = s.Header.CreatedAtAsLong,
|
||||||
|
//UpdatedAtAsLong = s.Header.UpdatedAtAsLong,
|
||||||
|
Currency = s.Header.Currency,
|
||||||
|
Notes = s.Header.Notes,
|
||||||
|
Meta = s.Header.Meta,//?.ToDictionary(kv => kv.Key, kv => CloneVariant(kv.Value)),
|
||||||
|
//MetaKeys = s.Header.MetaKeys.ToArray(),
|
||||||
|
//MetaValues = s.Header.MetaValues.ToArray(),
|
||||||
|
},
|
||||||
|
Seller = CloneParty(s.Seller),
|
||||||
|
Buyer = CloneParty(s.Buyer),
|
||||||
|
Items = s.Items.Select(CloneLine).ToArray(),
|
||||||
|
Payments = s.Payments?.Select(ClonePayment).ToArray(),
|
||||||
|
Attachments = s.Attachments?.Select(CloneAttachment).ToArray(),
|
||||||
|
RiskScores = s.RiskScores,
|
||||||
|
//RelatedDocs_v2 = s.RelatedDocs_v2?.ToList()
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Party CloneParty(Party p) => new()
|
||||||
|
{
|
||||||
|
Id = p.Id,
|
||||||
|
Name = p.Name,
|
||||||
|
TaxId = p.TaxId,
|
||||||
|
Email = p.Email,
|
||||||
|
Phone = p.Phone,
|
||||||
|
Address = p.Address is null ? null : new Address
|
||||||
|
{
|
||||||
|
Line1 = p.Address.Line1,
|
||||||
|
Line2 = p.Address.Line2,
|
||||||
|
City = p.Address.City,
|
||||||
|
Region = p.Address.Region,
|
||||||
|
Country = p.Address.Country,
|
||||||
|
PostalCode = p.Address.PostalCode
|
||||||
|
},
|
||||||
|
PreferredLanguage = p.PreferredLanguage
|
||||||
|
};
|
||||||
|
|
||||||
|
private static LineItem CloneLine(LineItem s) => new()
|
||||||
|
{
|
||||||
|
LineNo = s.LineNo,
|
||||||
|
Type = s.Type,
|
||||||
|
SKU = s.SKU,
|
||||||
|
Description = s.Description,
|
||||||
|
Qty = s.Qty,
|
||||||
|
QtyUnit = s.QtyUnit,
|
||||||
|
UnitPrice = s.UnitPrice,
|
||||||
|
VatRate = s.VatRate,
|
||||||
|
Ext = s.Ext,//?.ToDictionary(kv => kv.Key, kv => CloneVariant(kv.Value)),
|
||||||
|
Discount = s.Discount,
|
||||||
|
//ExtKeys = s.Ext?.Keys.ToArray(),
|
||||||
|
//ExtValues = s.Ext?.Values.ToArray(),
|
||||||
|
};
|
||||||
|
|
||||||
|
private static Payment ClonePayment(Payment s) => new()
|
||||||
|
{
|
||||||
|
Method = s.Method,
|
||||||
|
Amount = s.Amount,
|
||||||
|
Reference = s.Reference,
|
||||||
|
Timestamp = s.Timestamp,
|
||||||
|
//TimestampAsLong = s.TimestampAsLong,
|
||||||
|
Fee = s.Fee,
|
||||||
|
//CurrencyOverride= s.CurrencyOverride
|
||||||
|
};
|
||||||
|
|
||||||
|
private static Attachment CloneAttachment(Attachment s) => new()
|
||||||
|
{
|
||||||
|
Name = s.Name,
|
||||||
|
MimeType = s.MimeType,
|
||||||
|
Data = s.Data.ToArray()
|
||||||
|
};
|
||||||
|
|
||||||
|
private static Variant CloneVariant(Variant v) => new()
|
||||||
|
{
|
||||||
|
Tag = v.Tag,
|
||||||
|
Bool = v.Bool,
|
||||||
|
I64 = v.I64,
|
||||||
|
U64 = v.U64,
|
||||||
|
F64 = v.F64,
|
||||||
|
//Dec = v.Dec,
|
||||||
|
Str = v.Str,
|
||||||
|
Bytes = v.Bytes?.ToArray(),
|
||||||
|
Dt = v.Dt,
|
||||||
|
//DtAsLong = v.DtAsLong,
|
||||||
|
Guid = v.Guid
|
||||||
|
};
|
||||||
|
}
|
||||||
+18
-30
@@ -36,34 +36,22 @@ for (var i = 0; i < rounds; i++)
|
|||||||
|
|
||||||
Console.WriteLine($"\n# Round {round}/{rounds}, seed {seed}");
|
Console.WriteLine($"\n# Round {round}/{rounds}, seed {seed}");
|
||||||
|
|
||||||
var docsWorkloads = DocGenerator.BuildWorkloads(seed);
|
//var docsWorkloads = DocGenerator.BuildWorkloads(seed);
|
||||||
var dataWorkLoads = Shared.BuildBytesWorkLoads(seed);
|
var docsWorkloads = ModelGenerator.BuildWorkloads();
|
||||||
var intWorkloads = Shared.BuildIntWorkloads(seed);
|
|
||||||
|
|
||||||
if (runSerialization)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Collecting local serialization samples...");
|
|
||||||
serializationSamples.AddRange(SerializationExperiment.RunRound(
|
|
||||||
round,
|
|
||||||
seed,
|
|
||||||
docsWorkloads,
|
|
||||||
dataWorkLoads,
|
|
||||||
intWorkloads,
|
|
||||||
serializationIterations));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!runRpc)
|
if (!runRpc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var thriftDocs = docsWorkloads.ToDictionary(x => x.Key, v => v.Value.Select(x => x.ToThrift()).ToArray());
|
var esiurWorkload = docsWorkloads.ToDictionary(x => x.Item1, v => v.Item2.Select(x => x.Payload).ToArray());
|
||||||
var signalRDocs = docsWorkloads.ToDictionary(x => x.Key, v => v.Value.Select(x => x.ToShared()).ToArray());
|
var thriftDocs = docsWorkloads.ToDictionary(x => x.Item1, v => v.Item2.Select(x => x.Payload.ToThrift()).ToArray());
|
||||||
var grpcDocs = docsWorkloads.ToDictionary(x => x.Key, v => v.Value.Select(x => x.ToGrpc()).ToArray());
|
var signalRDocs = docsWorkloads.ToDictionary(x => x.Item1, v => v.Item2.Select(x => x.Payload.ToShared()).ToArray());
|
||||||
|
var grpcDocs = docsWorkloads.ToDictionary(x => x.Item1, v => v.Item2.Select(x => x.Payload.ToGrpc()).ToArray());
|
||||||
|
|
||||||
if (await RunProtocol("esiur", () => EsiurTest.DoTest(
|
if (await RunProtocol("esiur", () => EsiurTest.DoTest(
|
||||||
"ep://localhost:5005/sys/service",
|
"ep://localhost:5005/sys/service",
|
||||||
docsWorkloads,
|
esiurWorkload,
|
||||||
dataWorkLoads,
|
//dataWorkLoads,
|
||||||
intWorkloads,
|
//intWorkloads,
|
||||||
warmupDelayMs,
|
warmupDelayMs,
|
||||||
postHandshakeDelayMs,
|
postHandshakeDelayMs,
|
||||||
sampleDelayMs),
|
sampleDelayMs),
|
||||||
@@ -76,8 +64,8 @@ for (var i = 0; i < rounds; i++)
|
|||||||
"127.0.0.1",
|
"127.0.0.1",
|
||||||
5400,
|
5400,
|
||||||
thriftDocs,
|
thriftDocs,
|
||||||
dataWorkLoads,
|
//dataWorkLoads,
|
||||||
intWorkloads,
|
//intWorkloads,
|
||||||
warmupDelayMs,
|
warmupDelayMs,
|
||||||
postHandshakeDelayMs,
|
postHandshakeDelayMs,
|
||||||
sampleDelayMs),
|
sampleDelayMs),
|
||||||
@@ -89,8 +77,8 @@ for (var i = 0; i < rounds; i++)
|
|||||||
if (await RunProtocol("signalr", () => SignalRTest.DoTest(
|
if (await RunProtocol("signalr", () => SignalRTest.DoTest(
|
||||||
"http://127.0.0.1:5200/hub/echo",
|
"http://127.0.0.1:5200/hub/echo",
|
||||||
signalRDocs,
|
signalRDocs,
|
||||||
dataWorkLoads,
|
//dataWorkLoads,
|
||||||
intWorkloads,
|
//intWorkloads,
|
||||||
warmupDelayMs,
|
warmupDelayMs,
|
||||||
postHandshakeDelayMs,
|
postHandshakeDelayMs,
|
||||||
sampleDelayMs),
|
sampleDelayMs),
|
||||||
@@ -101,9 +89,9 @@ for (var i = 0; i < rounds; i++)
|
|||||||
|
|
||||||
if (await RunProtocol("json", () => JsonTest.DoTest(
|
if (await RunProtocol("json", () => JsonTest.DoTest(
|
||||||
"http://127.0.0.1:5100",
|
"http://127.0.0.1:5100",
|
||||||
docsWorkloads,
|
esiurWorkload,
|
||||||
dataWorkLoads,
|
//dataWorkLoads,
|
||||||
intWorkloads,
|
//intWorkloads,
|
||||||
warmupDelayMs,
|
warmupDelayMs,
|
||||||
postHandshakeDelayMs,
|
postHandshakeDelayMs,
|
||||||
sampleDelayMs),
|
sampleDelayMs),
|
||||||
@@ -115,8 +103,8 @@ for (var i = 0; i < rounds; i++)
|
|||||||
if (await RunProtocol("grpc", () => GrpcTest.DoTest(
|
if (await RunProtocol("grpc", () => GrpcTest.DoTest(
|
||||||
"http://127.0.0.1:5300",
|
"http://127.0.0.1:5300",
|
||||||
grpcDocs,
|
grpcDocs,
|
||||||
dataWorkLoads,
|
//dataWorkLoads,
|
||||||
intWorkloads,
|
//intWorkloads,
|
||||||
warmupDelayMs,
|
warmupDelayMs,
|
||||||
postHandshakeDelayMs,
|
postHandshakeDelayMs,
|
||||||
sampleDelayMs),
|
sampleDelayMs),
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ namespace Esiur.Tests.RPC.Client
|
|||||||
{
|
{
|
||||||
public static async Task<TestResults> DoTest(string address,
|
public static async Task<TestResults> DoTest(string address,
|
||||||
Dictionary<string, SharedModel.BusinessDocument[]> docsWorkloads,
|
Dictionary<string, SharedModel.BusinessDocument[]> docsWorkloads,
|
||||||
Dictionary<string, byte[]> dataWorkloads,
|
//Dictionary<string, byte[]> dataWorkloads,
|
||||||
Dictionary<string, int[]> intWorkloads,
|
//Dictionary<string, int[]> intWorkloads,
|
||||||
int warmupDelayMs = 3000,
|
int warmupDelayMs = 3000,
|
||||||
int postHandshakeDelayMs = 2000,
|
int postHandshakeDelayMs = 2000,
|
||||||
int sampleDelayMs = 3000)
|
int sampleDelayMs = 3000)
|
||||||
@@ -72,44 +72,44 @@ namespace Esiur.Tests.RPC.Client
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in dataWorkloads)
|
//foreach (var w in dataWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Bytes Workload: " + w.Key);
|
// Console.Write("Bytes Workload: " + w.Key);
|
||||||
await service.InvokeAsync("EchoBytes", w.Value);
|
// await service.InvokeAsync("EchoBytes", w.Value);
|
||||||
|
|
||||||
|
|
||||||
//if (!w.Value.SequenceEqual(rt))
|
// //if (!w.Value.SequenceEqual(rt))
|
||||||
// throw new Exception("No match");
|
// // throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Bytes.Add(w.Key, (ctx, crx));
|
// rt.Bytes.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in intWorkloads)
|
//foreach (var w in intWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Ints Workload: " + w.Key);
|
// Console.Write("Ints Workload: " + w.Key);
|
||||||
await service.InvokeAsync("EchoIntArray", w.Value);
|
// await service.InvokeAsync("EchoIntArray", w.Value);
|
||||||
|
|
||||||
|
|
||||||
//if (!w.Value.SequenceEqual(rt))
|
// //if (!w.Value.SequenceEqual(rt))
|
||||||
// throw new Exception("No match");
|
// // throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Ints.Add(w.Key, (ctx, crx));
|
// rt.Ints.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
await Task.Delay(sampleDelayMs);
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ public class ThriftTest
|
|||||||
|
|
||||||
public static async Task<TestResults> DoTest(string host, int port,
|
public static async Task<TestResults> DoTest(string host, int port,
|
||||||
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
Dictionary<string, BusinessDocument[]> docsWorkloads,
|
||||||
Dictionary<string, byte[]> dataWorkloads,
|
//Dictionary<string, byte[]> dataWorkloads,
|
||||||
Dictionary<string, int[]> intWorkloads,
|
//Dictionary<string, int[]> intWorkloads,
|
||||||
int warmupDelayMs = 3000,
|
int warmupDelayMs = 3000,
|
||||||
int postHandshakeDelayMs = 2000,
|
int postHandshakeDelayMs = 2000,
|
||||||
int sampleDelayMs = 3000)
|
int sampleDelayMs = 3000)
|
||||||
@@ -60,46 +60,46 @@ public class ThriftTest
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in dataWorkloads)
|
//foreach (var w in dataWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Bytes Workload: " + w.Key);
|
// Console.Write("Bytes Workload: " + w.Key);
|
||||||
|
|
||||||
var res = await service.EchoBytes(w.Value);
|
// var res = await service.EchoBytes(w.Value);
|
||||||
|
|
||||||
|
|
||||||
if (!w.Value.SequenceEqual(res))
|
// if (!w.Value.SequenceEqual(res))
|
||||||
throw new Exception("No match");
|
// throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Bytes.Add(w.Key, (ctx, crx));
|
// rt.Bytes.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
foreach (var w in intWorkloads)
|
//foreach (var w in intWorkloads)
|
||||||
{
|
//{
|
||||||
Console.Write("Ints Workload: " + w.Key);
|
// Console.Write("Ints Workload: " + w.Key);
|
||||||
|
|
||||||
var res = await service.EchoIntArray(w.Value.ToList());
|
// var res = await service.EchoIntArray(w.Value.ToList());
|
||||||
|
|
||||||
|
|
||||||
if (!w.Value.SequenceEqual(res))
|
// if (!w.Value.SequenceEqual(res))
|
||||||
throw new Exception("No match");
|
// throw new Exception("No match");
|
||||||
|
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
// await Task.Delay(sampleDelayMs);
|
||||||
(tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
// (tx, rx, ctx, crx) = mon.GetDiff(tx, rx);
|
||||||
Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
// Console.WriteLine($", {tx}/{rx}, {ctx}/{crx}");
|
||||||
//Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
// //Console.WriteLine($"Socket {sock.BytesSent}/{sock.BytesReceived}");
|
||||||
|
|
||||||
rt.Ints.Add(w.Key, (ctx, crx));
|
// rt.Ints.Add(w.Key, (ctx, crx));
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
await Task.Delay(sampleDelayMs);
|
await Task.Delay(sampleDelayMs);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user