Skip to content

YQ-3322 Row dispatcher #5544

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 152 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
e8ff96c
Add row_dispatcher service
kardymonds Jun 5, 2024
f0d2a8b
Describe/Acquire semaphore
kardymonds Jun 6, 2024
367cf6c
Send start session
kardymonds Jun 7, 2024
ba23e97
coordinator info
kardymonds Jun 7, 2024
970d57c
add leader actor
kardymonds Jun 10, 2024
fb1188f
add new read_actor
kardymonds Jun 11, 2024
19b8a65
Add session actor
kardymonds Jun 13, 2024
29381f5
Add session
kardymonds Jun 13, 2024
c625f16
Add offset
kardymonds Jun 14, 2024
babc089
Add offset/partition id
kardymonds Jun 17, 2024
c4c4eb3
first passed test
kardymonds Jun 19, 2024
d411ae0
add TEvNewAsyncInputDataArrived
kardymonds Jun 19, 2024
0f000c6
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Jun 19, 2024
8b260f3
Add py test
kardymonds Jun 19, 2024
e8e3c5a
Fix py test
kardymonds Jun 19, 2024
6a77924
Add restoring test
kardymonds Jun 19, 2024
1257ca7
stop/start test fixed
kardymonds Jul 1, 2024
347918c
json parsing with purecalc
kardymonds Jul 3, 2024
38dd0dc
change type to json
kardymonds Jul 3, 2024
1129176
add use_row_dispatcher to connection
kardymonds Jul 4, 2024
0806d18
fix simple test
kardymonds Jul 5, 2024
49284d6
return back to json / fix test
kardymonds Jul 8, 2024
baa2abc
add predicate to source settongs
kardymonds Jul 10, 2024
8cf0614
add predicate builder
kardymonds Jul 11, 2024
225a134
mv json parser impl to cpp
kardymonds Jul 11, 2024
0ddcb81
add json filter
kardymonds Jul 11, 2024
f5a0fd7
start filtration
kardymonds Jul 12, 2024
dd7e9d0
add text filter test
kardymonds Jul 15, 2024
44d7687
mv AnnotateFilterPredicate to common
kardymonds Jul 15, 2024
d6940c8
mv MakePushdownPredicate to common
kardymonds Jul 15, 2024
4c02a3d
make private events
kardymonds Jul 15, 2024
4046a60
make 2 compute nodes in tests
kardymonds Jul 15, 2024
cc03d7a
add event queue to read_actor
kardymonds Jul 16, 2024
b68328f
add consumer
kardymonds Jul 17, 2024
ea61f3f
fix compiling
kardymonds Jul 19, 2024
e0b91d2
fix tests
kardymonds Jul 22, 2024
0251534
style fix
kardymonds Jul 23, 2024
4d3983d
trying to add offset
kardymonds Jul 24, 2024
7961d42
fix parsert tests
kardymonds Jul 25, 2024
ce87ae4
Add exception test
kardymonds Jul 25, 2024
398eec4
add filter tests
kardymonds Jul 25, 2024
e9627f7
use TEvGetNextBatch
kardymonds Jul 26, 2024
ece33f2
Add keepalive
kardymonds Jul 26, 2024
f503836
add retry queue test
kardymonds Jul 30, 2024
84cf07a
all events over row_dispatcher
kardymonds Jul 30, 2024
23a11f1
fix SessionClosed
kardymonds Jul 30, 2024
3f4357e
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Jul 31, 2024
f8b00ef
Use tenant
kardymonds Jul 31, 2024
ecd9a4b
error processing
kardymonds Aug 1, 2024
d425526
fix tests
kardymonds Aug 1, 2024
618be0e
fix start time
kardymonds Aug 2, 2024
ba8b4bf
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Aug 4, 2024
0c01fcc
fix pushdown predicate builder
kardymonds Aug 5, 2024
3b42cf4
fix all OnEventReceived
kardymonds Aug 6, 2024
34e966a
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Aug 6, 2024
eea9e62
rename events
kardymonds Aug 6, 2024
6532c0e
use predicate as string
kardymonds Aug 7, 2024
381c230
Add topic session unit tests
kardymonds Aug 8, 2024
ded20f0
add more tests
kardymonds Aug 9, 2024
bc13257
fix last test, remove incudes
kardymonds Aug 11, 2024
a5119f3
begin of read actor tests
kardymonds Aug 11, 2024
628f7a6
next tests for read actors
kardymonds Aug 13, 2024
0178b35
update test
kardymonds Aug 13, 2024
5f76adb
fix read actor tests / add coordinator tests
kardymonds Aug 14, 2024
e81ab69
fix yamake
kardymonds Aug 14, 2024
f32632e
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Aug 14, 2024
b0ee2e8
use State in read actor
kardymonds Aug 15, 2024
d62d67d
beginning of leader test
kardymonds Aug 15, 2024
f3e94b6
leader tests
kardymonds Aug 16, 2024
0a9c93c
fix flags
kardymonds Aug 16, 2024
b651727
use actors factory in row_dispatcher tests
kardymonds Aug 17, 2024
d4fe9a5
full row dispatcher test
kardymonds Aug 18, 2024
26694ff
end of row dispatcher tests
kardymonds Aug 19, 2024
5285c87
fix coordinator changed case
kardymonds Aug 19, 2024
0fcf377
add backpressure test
kardymonds Aug 21, 2024
66814e8
fix disconnected
kardymonds Aug 22, 2024
81a8da1
fix update coordinator and check cookie
kardymonds Aug 22, 2024
20cd878
check build
kardymonds Aug 22, 2024
fe4e233
fix all tests
kardymonds Aug 22, 2024
5b0edee
test build
kardymonds Aug 22, 2024
610595e
noch einmall
kardymonds Aug 22, 2024
277907c
chaotic actions
kardymonds Aug 22, 2024
31eafe0
fix retry_queue test build
kardymonds Aug 22, 2024
14616d6
try to fix build
kardymonds Aug 22, 2024
72fef54
try to fix build
kardymonds Aug 22, 2024
5d82e50
try to fix build
kardymonds Aug 22, 2024
90e3ace
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Aug 23, 2024
e53a079
next try to fix build
kardymonds Aug 23, 2024
7f28f02
use connector predicate proto
kardymonds Aug 23, 2024
a256870
fix build
kardymonds Aug 23, 2024
785e0a5
next try to fix build
kardymonds Aug 23, 2024
bd1e8c0
try to fix build
kardymonds Aug 25, 2024
853022c
fix null ptr
kardymonds Aug 25, 2024
dac9cd6
return back pq_dummy
kardymonds Aug 26, 2024
afcc80c
return back pq_dummy2
kardymonds Aug 26, 2024
1df7952
try to fix buils
kardymonds Aug 26, 2024
99b7b55
try to fix build
kardymonds Aug 26, 2024
8ac6851
remove comments
kardymonds Aug 26, 2024
68fa7c4
style fix
kardymonds Aug 26, 2024
80ab259
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Aug 26, 2024
70639d9
remove header
kardymonds Aug 26, 2024
a68fd63
fix style
kardymonds Aug 27, 2024
7a1b661
fix partition id
kardymonds Aug 27, 2024
3805510
make no predicate case
kardymonds Aug 28, 2024
aaaab26
add some sensors
kardymonds Aug 29, 2024
5a1ae58
change log level
kardymonds Aug 29, 2024
24c4733
add sensor to topic_session
kardymonds Aug 29, 2024
01def22
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Aug 29, 2024
1e21e87
fix style / logs
kardymonds Aug 30, 2024
3f6312d
style fix
kardymonds Aug 30, 2024
7db5b1d
add status
kardymonds Sep 2, 2024
b31d821
style fix / mv retry_queue to common
kardymonds Sep 3, 2024
be830e2
Infinite cycle check
kardymonds Sep 3, 2024
a2e2287
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Sep 3, 2024
5519708
add peerdir
kardymonds Sep 3, 2024
7ea2bc2
Escaping
kardymonds Sep 3, 2024
8839fa1
try to fix build
kardymonds Sep 4, 2024
3a12fb4
rename option to shared_reading
kardymonds Sep 5, 2024
6c948e8
remove whitespaces
kardymonds Sep 5, 2024
2f54d22
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Sep 6, 2024
6912f39
add metrics to topic sessions by actor id / style fix
kardymonds Sep 9, 2024
cf24a47
remove RECURSE
kardymonds Sep 9, 2024
fb4ec01
add with consumer mode / style fix
kardymonds Sep 10, 2024
ef310ad
add query id / style fix
kardymonds Sep 12, 2024
bd7ab79
fix by comments
kardymonds Sep 12, 2024
d3f1321
fix tests
kardymonds Sep 13, 2024
128d95e
fix by comments
kardymonds Sep 13, 2024
b438167
handle exception in leader election
kardymonds Sep 14, 2024
5d38c1d
use processor in topic_session
kardymonds Sep 14, 2024
024cdb7
remove PqRsSource type name
kardymonds Sep 16, 2024
58fbd32
add read_actor_base
kardymonds Sep 16, 2024
46f152c
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Sep 16, 2024
48780cb
fix merge coflict artefacts
kardymonds Sep 16, 2024
073f3ef
fix merge coflict artefacts2
kardymonds Sep 16, 2024
340f601
fix by pr comments
kardymonds Sep 16, 2024
166a5ae
fix TablePathPrefix
kardymonds Sep 17, 2024
487865d
try to fix pg_dummy
kardymonds Sep 18, 2024
0e07ef3
noch eimal
kardymonds Sep 18, 2024
7885f2b
add more pg_dummy
kardymonds Sep 18, 2024
39f94cd
restore pg_dummy
kardymonds Sep 19, 2024
8ecac82
add more stats
kardymonds Sep 19, 2024
71ca4cc
move pq
kardymonds Sep 19, 2024
828a282
try to fix build
kardymonds Sep 19, 2024
b52ca73
try to fix build
kardymonds Sep 19, 2024
d8dd2f9
try to fix build noch einmal
kardymonds Sep 19, 2024
60c00d0
try to fix build
kardymonds Sep 19, 2024
9b077db
add batch max size
kardymonds Sep 19, 2024
b7db4b1
try to fix purecalc
kardymonds Sep 20, 2024
a6bd525
use purecalc no pg
kardymonds Sep 20, 2024
99ee101
fix update seqno in read_actor
kardymonds Sep 20, 2024
f8d2c9e
Merge remote-tracking branch 'upstream/main' into YQ-3322-Row-dispatcher
kardymonds Sep 23, 2024
b370392
remove pg
kardymonds Sep 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ydb/core/fq/libs/actors/clusters_from_connections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ void FillPqClusterConfig(NYql::TPqClusterConfig& clusterConfig,
clusterConfig.SetUseSsl(ds.secure());
clusterConfig.SetAddBearerToToken(useBearerForYdb);
clusterConfig.SetClusterType(TPqClusterConfig::CT_DATA_STREAMS);
clusterConfig.SetSharedReading(ds.shared_reading());
FillClusterAuth(clusterConfig, ds.auth(), authToken, accountIdSignatures);
}

Expand Down
7 changes: 7 additions & 0 deletions ydb/core/fq/libs/actors/logging/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@
#define LOG_STREAMS_STORAGE_SERVICE_AS_WARN(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, WARN, STREAMS_STORAGE_SERVICE, logRecordStream)
#define LOG_STREAMS_STORAGE_SERVICE_AS_ERROR(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, ERROR, STREAMS_STORAGE_SERVICE, logRecordStream)

// Component: ROW_DISPATCHER.
#define LOG_ROW_DISPATCHER_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, FQ_ROW_DISPATCHER, LogPrefix << logRecordStream)
#define LOG_ROW_DISPATCHER_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, FQ_ROW_DISPATCHER, LogPrefix << logRecordStream)
#define LOG_ROW_DISPATCHER_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, FQ_ROW_DISPATCHER, LogPrefix << logRecordStream)
#define LOG_ROW_DISPATCHER_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, FQ_ROW_DISPATCHER, LogPrefix << logRecordStream)
#define LOG_ROW_DISPATCHER_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, FQ_ROW_DISPATCHER, LogPrefix << logRecordStream)

// Component: STREAMS_SCHEDULER_SERVICE.
#define LOG_STREAMS_SCHEDULER_SERVICE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_SCHEDULER_SERVICE, logRecordStream)
#define LOG_STREAMS_SCHEDULER_SERVICE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, STREAMS_SCHEDULER_SERVICE, logRecordStream)
Expand Down
2 changes: 1 addition & 1 deletion ydb/core/fq/libs/checkpointing/checkpoint_coordinator.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include <ydb/public/api/protos/draft/fq.pb.h>

#include <ydb/library/yql/dq/actors/compute/dq_compute_actor.h>
#include <ydb/library/yql/dq/actors/compute/retry_queue.h>
#include <ydb/library/yql/dq/actors/common/retry_queue.h>
#include <ydb/library/yql/providers/dq/actors/events.h>
#include <ydb/library/yql/providers/dq/actors/task_controller_impl.h>

Expand Down
2 changes: 2 additions & 0 deletions ydb/core/fq/libs/config/protos/fq_config.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import "ydb/core/fq/libs/config/protos/quotas_manager.proto";
import "ydb/core/fq/libs/config/protos/rate_limiter.proto";
import "ydb/core/fq/libs/config/protos/read_actors_factory.proto";
import "ydb/core/fq/libs/config/protos/resource_manager.proto";
import "ydb/core/fq/libs/config/protos/row_dispatcher.proto";
import "ydb/core/fq/libs/config/protos/test_connection.proto";
import "ydb/core/fq/libs/config/protos/token_accessor.proto";
import "ydb/library/folder_service/proto/config.proto";
Expand Down Expand Up @@ -53,4 +54,5 @@ message TConfig {
TRateLimiterConfig RateLimiter = 22;
bool EnableTaskCounters = 23;
TComputeConfig Compute = 24;
TRowDispatcherConfig RowDispatcher = 25;
}
23 changes: 23 additions & 0 deletions ydb/core/fq/libs/config/protos/row_dispatcher.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
syntax = "proto3";
option cc_enable_arenas = true;

package NFq.NConfig;
option java_package = "ru.yandex.kikimr.proto";

import "ydb/core/fq/libs/config/protos/storage.proto";

////////////////////////////////////////////////////////////

message TRowDispatcherCoordinatorConfig {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У нас уже есть похожий конфиг для kesus: https://a.yandex-team.ru/arcadia/contrib/ydb/core/fq/libs/config/protos/rate_limiter.proto?rev=r14879806#L11-21
Может по аналогии назвать, что думаешь? Database/CoordinationNodePath

TYdbStorageConfig Database = 1;
string CoordinationNodePath = 2;
}
message TRowDispatcherConfig {
bool Enabled = 1;
uint64 TimeoutBeforeStartSessionSec = 2;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У нас есть еще вариант через строчку задавать таймауты. Можно писать "5m" и т.д. https://a.yandex-team.ru/arcadia/contrib/ydb/core/fq/libs/config/protos/control_plane_storage.proto?rev=r14879806#L36
Тут уже на твое усмотрение, так-как с Sec тоже есть

uint64 SendStatusPeriodSec = 3;
uint64 MaxSessionUsedMemory = 4;
bool WithoutConsumer = 5;
TRowDispatcherCoordinatorConfig Coordinator = 6;

}
1 change: 1 addition & 0 deletions ydb/core/fq/libs/config/protos/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ SRCS(
rate_limiter.proto
read_actors_factory.proto
resource_manager.proto
row_dispatcher.proto
storage.proto
test_connection.proto
token_accessor.proto
Expand Down
2 changes: 1 addition & 1 deletion ydb/core/fq/libs/events/event_subspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct TYqEventSubspace {
ControlPlaneConfig,
YdbCompute,
TableOverFq,

RowDispatcher,
SubspacesEnd,
};

Expand Down
2 changes: 2 additions & 0 deletions ydb/core/fq/libs/events/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ PEERDIR(
ydb/library/actors/core
ydb/core/fq/libs/graph_params/proto
ydb/core/fq/libs/protos
ydb/core/fq/libs/row_dispatcher/protos
ydb/library/yql/core/facade
ydb/library/yql/providers/common/db_id_async_resolver
ydb/library/yql/providers/dq/provider
ydb/library/yql/providers/pq/proto
ydb/library/yql/public/issue
ydb/public/api/protos
ydb/public/sdk/cpp/client/ydb_table
Expand Down
13 changes: 13 additions & 0 deletions ydb/core/fq/libs/init/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <ydb/core/fq/libs/rate_limiter/events/control_plane_events.h>
#include <ydb/core/fq/libs/rate_limiter/events/data_plane.h>
#include <ydb/core/fq/libs/rate_limiter/quoter_service/quoter_service.h>
#include <ydb/core/fq/libs/row_dispatcher/row_dispatcher_service.h>
#include <ydb/core/fq/libs/shared_resources/shared_resources.h>
#include <ydb/core/fq/libs/test_connection/test_connection.h>

Expand Down Expand Up @@ -187,6 +188,18 @@ void Init(
credentialsFactory = NYql::CreateSecuredServiceAccountCredentialsOverTokenAccessorFactory(tokenAccessorConfig.GetEndpoint(), tokenAccessorConfig.GetUseSsl(), caContent, tokenAccessorConfig.GetConnectionPoolSize());
}

if (protoConfig.GetRowDispatcher().GetEnabled()) {
auto rowDispatcher = NFq::NewRowDispatcherService(
protoConfig.GetRowDispatcher(),
protoConfig.GetCommon(),
NKikimr::CreateYdbCredentialsProviderFactory,
yqSharedResources,
credentialsFactory,
tenant,
yqCounters->GetSubgroup("subsystem", "row_dispatcher"));
actorRegistrator(NFq::RowDispatcherServiceActorId(), rowDispatcher.release());
}

auto s3ActorsFactory = NYql::NDq::CreateS3ActorsFactory();

if (protoConfig.GetPrivateApi().GetEnabled()) {
Expand Down
1 change: 1 addition & 0 deletions ydb/core/fq/libs/init/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ PEERDIR(
ydb/core/fq/libs/quota_manager
ydb/core/fq/libs/rate_limiter/control_plane_service
ydb/core/fq/libs/rate_limiter/quoter_service
ydb/core/fq/libs/row_dispatcher
ydb/core/fq/libs/shared_resources
ydb/core/fq/libs/test_connection
ydb/core/protos
Expand Down
37 changes: 37 additions & 0 deletions ydb/core/fq/libs/row_dispatcher/actors_factory.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include <ydb/core/fq/libs/row_dispatcher/actors_factory.h>

#include <ydb/core/fq/libs/row_dispatcher/topic_session.h>

namespace NFq::NRowDispatcher {


struct TActorFactory : public IActorFactory {
TActorFactory() {}

NActors::TActorId RegisterTopicSession(
const TString& topicPath,
const NConfig::TRowDispatcherConfig& config,
NActors::TActorId rowDispatcherActorId,
ui32 partitionId,
NYdb::TDriver driver,
std::shared_ptr<NYdb::ICredentialsProviderFactory> credentialsProviderFactory,
const ::NMonitoring::TDynamicCounterPtr& counters) const override {

auto actorPtr = NFq::NewTopicSession(
topicPath,
config,
rowDispatcherActorId,
partitionId,
std::move(driver),
credentialsProviderFactory,
counters
);
return NActors::TlsActivationContext->ExecutorThread.RegisterActor(actorPtr.release(), NActors::TMailboxType::HTSwap, Max<ui32>());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TActivationContext::Register

Штука конечно опасная. Если когда нибудь вызовут RegisterTopicSession не из AS, то будет краш

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не лучше ли явным образом сюда передать as? в конструктор или в метод

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В итоге у меня не получилось переделать (через TActivationContext::ActorSystem()->Register()). Предлагаю пока так оставить

}
};

IActorFactory::TPtr CreateActorFactory() {
return MakeIntrusive<TActorFactory>();
}

}
25 changes: 25 additions & 0 deletions ydb/core/fq/libs/row_dispatcher/actors_factory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#pragma once

#include <ydb/core/fq/libs/config/protos/row_dispatcher.pb.h>
#include <util/generic/ptr.h>
#include <ydb/library/actors/core/actor.h>
#include <ydb/public/sdk/cpp/client/ydb_driver/driver.h>

namespace NFq::NRowDispatcher {

struct IActorFactory : public TThrRefBase {
using TPtr = TIntrusivePtr<IActorFactory>;

virtual NActors::TActorId RegisterTopicSession(
const TString& topicPath,
const NConfig::TRowDispatcherConfig& config,
NActors::TActorId rowDispatcherActorId,
ui32 partitionId,
NYdb::TDriver driver,
std::shared_ptr<NYdb::ICredentialsProviderFactory> credentialsProviderFactory,
const ::NMonitoring::TDynamicCounterPtr& counters) const = 0;
};

IActorFactory::TPtr CreateActorFactory();

}
Loading
Loading