You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by ja...@gmx.de on 2023/01/23 18:28:49 UTC
ScanQuery and PeerAssemblyLoading - Issue 1
Dear Community,
I've done quite a lot of testing and somehow remotely loading a cache entry
filter from client to server only works after a compute-call was made.
This appears somewhat strange - maybe someone can explain (/or reproduce the
behaviour? Full code at the end of this mail).
The setup: Ignite 2.14 with PeerAssemblyLoadingMode.CurrentAppDomain; .NET
5.0 with incremental assembly versioning; (Thick) .NET client running
queries against a .NET-embedded server.
Summary of the client code:
- Create a cache and put some users
- Run ScanQuery (1st time) -> Exception "No matching type found for object
[typeId=327128514, typeName=SalaryFilter]. This usually indicates that
assembly with specified type is not loaded on a node."
- Run (any) compute task
- Run ScanQuery (2nd time) -> Works
Same behaviour can be observed when restarting / recompiling in-between any
of the above stages, repeating stages multiple times, and so on.
Thank you for any input on this.
Jay
SERVER CODE:
public static class Program
{
public static async Task Main(string[] args)
{
IgniteConfiguration IgniteConfig = new IgniteConfiguration();
IgniteConfig.PeerAssemblyLoadingMode =
PeerAssemblyLoadingMode.CurrentAppDomain;
var ignite = Ignition.Start(IgniteConfig);
ignite.GetCluster().SetActive(true);
Console.ReadLine();
}
}
CLIENT CODE:
public static class Program
{
public static async Task Main(string[] args)
{
IgniteConfiguration IgniteConfig = new IgniteConfiguration();
IgniteConfig.PeerAssemblyLoadingMode =
PeerAssemblyLoadingMode.CurrentAppDomain;
IgniteConfig.ClientMode = true;
var ignite = Ignition.Start(IgniteConfig);
var cache = ignite.GetOrCreateCache<string,
IBinaryObject>("Name_User_Cache").WithKeepBinary<string, IBinaryObject>();
IBinaryObjectBuilder builder =
ignite.GetBinary().GetBuilder("User");
IBinaryObject user = builder.SetField<int>("Salary", 1001).Build();
cache.Put("First User", user);
user = builder.SetField<int>("Salary", 1000).Build();
cache.Put("Second User", user);
user = builder.SetField<int>("Salary", 1002).Build();
cache.Put("Third User", user);
Console.WriteLine("First search:");
RunScanQuery(cache);
Console.WriteLine("Broadcasting compute job");
ignite.GetCompute().Broadcast(new HelloAction());
Console.WriteLine("Second search:");
RunScanQuery(cache);
Console.ReadLine();
}
static void RunScanQuery(ICache<string, IBinaryObject> cache)
{
try
{
using (var cursor = cache.Query(new ScanQuery<string,
IBinaryObject>(new SalaryFilter())))
{
foreach (var entry in cursor)
{
Console.WriteLine("Key = " + entry.Key + ", Value.Salary
= " + entry.Value.GetField<int>("Salary").ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
}
class HelloAction : IComputeAction
{
public void Invoke()
{
Console.WriteLine("Hello, World!");
}
}
class SalaryFilter : ICacheEntryFilter<string, IBinaryObject>
{
public bool Invoke(ICacheEntry<string, IBinaryObject> entry)
{
return entry.Value.GetField<int>("Salary") > 1000;
}
}
appreciate the help
RE: ScanQuery and PeerAssemblyLoading - Issue 1
Posted by ja...@gmx.de.
Thank you for explaining Pavel.
Didn’t know this.
Found this workaround more or less by accident.
Jay
From: Pavel Tupitsyn <pt...@apache.org>
Sent: Tuesday, 24 January 2023 06:32
To: user@ignite.apache.org
Subject: Re: ScanQuery and PeerAssemblyLoading - Issue 1
Jay,
Peer Assembly Loading feature only exists for Compute API.
- When you perform a ScanQuery the 1st time, the assembly does not exist on the remote node and you get an error.
- After you run a Compute task, your entire assembly (including SalaryFilter class) gets loaded on the remote node, and now this class can be used for ScanQuery too.
Basically, Compute can be used as a workaround to pre-load any assemblies on remote nodes.
Pavel
On Mon, Jan 23, 2023 at 8:29 PM <jay.ethan@gmx.de <ma...@gmx.de> > wrote:
Dear Community,
I’ve done quite a lot of testing and somehow remotely loading a cache entry filter from client to server only works after a compute-call was made.
This appears somewhat strange – maybe someone can explain (/or reproduce the behaviour? Full code at the end of this mail).
The setup: Ignite 2.14 with PeerAssemblyLoadingMode.CurrentAppDomain; .NET 5.0 with incremental assembly versioning; (Thick) .NET client running queries against a .NET-embedded server.
Summary of the client code:
- Create a cache and put some users
- Run ScanQuery (1st time) -> Exception “No matching type found for object [typeId=327128514, typeName=SalaryFilter]. This usually indicates that assembly with specified type is not loaded on a node.”
- Run (any) compute task
- Run ScanQuery (2nd time) -> Works
Same behaviour can be observed when restarting / recompiling in-between any of the above stages, repeating stages multiple times, and so on.
Thank you for any input on this.
Jay
SERVER CODE:
public static class Program
{
public static async Task Main(string[] args)
{
IgniteConfiguration IgniteConfig = new IgniteConfiguration();
IgniteConfig.PeerAssemblyLoadingMode = PeerAssemblyLoadingMode.CurrentAppDomain;
var ignite = Ignition.Start(IgniteConfig);
ignite.GetCluster().SetActive(true);
Console.ReadLine();
}
}
CLIENT CODE:
public static class Program
{
public static async Task Main(string[] args)
{
IgniteConfiguration IgniteConfig = new IgniteConfiguration();
IgniteConfig.PeerAssemblyLoadingMode = PeerAssemblyLoadingMode.CurrentAppDomain;
IgniteConfig.ClientMode = true;
var ignite = Ignition.Start(IgniteConfig);
var cache = ignite.GetOrCreateCache<string, IBinaryObject>("Name_User_Cache").WithKeepBinary<string, IBinaryObject>();
IBinaryObjectBuilder builder = ignite.GetBinary().GetBuilder("User");
IBinaryObject user = builder.SetField<int>("Salary", 1001).Build();
cache.Put("First User", user);
user = builder.SetField<int>("Salary", 1000).Build();
cache.Put("Second User", user);
user = builder.SetField<int>("Salary", 1002).Build();
cache.Put("Third User", user);
Console.WriteLine("First search:");
RunScanQuery(cache);
Console.WriteLine("Broadcasting compute job");
ignite.GetCompute().Broadcast(new HelloAction());
Console.WriteLine("Second search:");
RunScanQuery(cache);
Console.ReadLine();
}
static void RunScanQuery(ICache<string, IBinaryObject> cache)
{
try
{
using (var cursor = cache.Query(new ScanQuery<string, IBinaryObject>(new SalaryFilter())))
{
foreach (var entry in cursor)
{
Console.WriteLine("Key = " + entry.Key + ", Value.Salary = " + entry.Value.GetField<int>("Salary").ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
}
class HelloAction : IComputeAction
{
public void Invoke()
{
Console.WriteLine("Hello, World!");
}
}
class SalaryFilter : ICacheEntryFilter<string, IBinaryObject>
{
public bool Invoke(ICacheEntry<string, IBinaryObject> entry)
{
return entry.Value.GetField<int>("Salary") > 1000;
}
}
appreciate the help
Re: ScanQuery and PeerAssemblyLoading - Issue 1
Posted by Pavel Tupitsyn <pt...@apache.org>.
Jay,
Peer Assembly Loading feature only exists for Compute API.
- When you perform a ScanQuery the 1st time, the assembly does not exist on
the remote node and you get an error.
- After you run a Compute task, your entire assembly (including
SalaryFilter class) gets loaded on the remote node, and now this class can
be used for ScanQuery too.
Basically, Compute can be used as a workaround to pre-load any assemblies
on remote nodes.
Pavel
On Mon, Jan 23, 2023 at 8:29 PM <ja...@gmx.de> wrote:
> Dear Community,
>
>
>
> I’ve done quite a lot of testing and somehow remotely loading a cache
> entry filter from client to server only works after a compute-call was
> made.
>
> This appears somewhat strange – maybe someone can explain (/or reproduce
> the behaviour? Full code at the end of this mail).
>
>
>
> The setup: Ignite 2.14 with PeerAssemblyLoadingMode.CurrentAppDomain; .NET
> 5.0 with incremental assembly versioning; (Thick) .NET client running
> queries against a .NET-embedded server.
>
>
>
> Summary of the client code:
>
> - Create a cache and put some users
>
> - Run ScanQuery (1st time) -> Exception “No matching type found for object
> [typeId=327128514, typeName=SalaryFilter]. This usually indicates that
> assembly with specified type is not loaded on a node.”
>
> - Run (any) compute task
>
> - Run ScanQuery (2nd time) -> Works
>
> Same behaviour can be observed when restarting / recompiling in-between
> any of the above stages, repeating stages multiple times, and so on.
>
>
>
> Thank you for any input on this.
>
>
>
> Jay
>
>
>
>
>
>
>
> SERVER CODE:
>
>
>
> public static class Program
>
> {
>
> public static async Task Main(string[] args)
>
> {
>
> IgniteConfiguration IgniteConfig = new IgniteConfiguration();
>
> IgniteConfig.PeerAssemblyLoadingMode =
> PeerAssemblyLoadingMode.CurrentAppDomain;
>
>
>
> var ignite = Ignition.Start(IgniteConfig);
>
> ignite.GetCluster().SetActive(true);
>
>
>
> Console.ReadLine();
>
> }
>
> }
>
>
>
>
>
> CLIENT CODE:
>
>
>
> public static class Program
>
> {
>
> public static async Task Main(string[] args)
>
> {
>
> IgniteConfiguration IgniteConfig = new IgniteConfiguration();
>
> IgniteConfig.PeerAssemblyLoadingMode =
> PeerAssemblyLoadingMode.CurrentAppDomain;
>
> IgniteConfig.ClientMode = true;
>
>
>
> var ignite = Ignition.Start(IgniteConfig);
>
>
>
> var cache = ignite.GetOrCreateCache<string, IBinaryObject>(
> "Name_User_Cache").WithKeepBinary<string, IBinaryObject>();
>
>
>
> IBinaryObjectBuilder builder = ignite.GetBinary().GetBuilder(
> "User");
>
> IBinaryObject user = builder.SetField<int>("Salary",
> 1001).Build();
>
> cache.Put("First User", user);
>
> user = builder.SetField<int>("Salary", 1000).Build();
>
> cache.Put("Second User", user);
>
> user = builder.SetField<int>("Salary", 1002).Build();
>
> cache.Put("Third User", user);
>
>
>
> Console.WriteLine("First search:");
>
> RunScanQuery(cache);
>
>
>
> Console.WriteLine("Broadcasting compute job");
>
> ignite.GetCompute().Broadcast(new HelloAction());
>
>
>
> Console.WriteLine("Second search:");
>
> RunScanQuery(cache);
>
>
>
> Console.ReadLine();
>
> }
>
>
>
> static void RunScanQuery(ICache<string, IBinaryObject> cache)
>
> {
>
> try
>
> {
>
> using (var cursor = cache.Query(new ScanQuery<string,
> IBinaryObject>(new SalaryFilter())))
>
> {
>
> foreach (var entry in cursor)
>
> {
>
> Console.WriteLine("Key = " + entry.Key + ",
> Value.Salary = " + entry.Value.GetField<int>("Salary").ToString());
>
> }
>
> }
>
> }
>
> catch (Exception ex)
>
> {
>
> Console.WriteLine("Exception: " + ex.Message);
>
> }
>
> }
>
> }
>
>
>
> class HelloAction : IComputeAction
>
> {
>
> public void Invoke()
>
> {
>
> Console.WriteLine("Hello, World!");
>
> }
>
> }
>
>
>
> class SalaryFilter : ICacheEntryFilter<string, IBinaryObject>
>
> {
>
> public bool Invoke(ICacheEntry<string, IBinaryObject> entry)
>
> {
>
> return entry.Value.GetField<int>("Salary") > 1000;
>
> }
>
> }
>
>
>
>
>
> appreciate the help
>
>
>
>
>