Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
T
tarantool
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
core
tarantool
Commits
68c043f8
Commit
68c043f8
authored
10 years ago
by
Roman Tsisyk
Browse files
Options
Downloads
Patches
Plain Diff
Review fixes for #715
parent
b9dc20c5
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/box/box.cc
+84
-120
84 additions, 120 deletions
src/box/box.cc
with
84 additions
and
120 deletions
src/box/box.cc
+
84
−
120
View file @
68c043f8
...
...
@@ -131,7 +131,7 @@ box_check_readahead(int readahead)
}
}
static
void
static
int
box_check_rows_per_wal
(
int
rows_per_wal
)
{
/* check rows_per_wal configuration */
...
...
@@ -139,7 +139,7 @@ box_check_rows_per_wal(int rows_per_wal)
tnt_raise
(
ClientError
,
ER_CFG
,
"rows_per_wal"
,
"the value must be greater than one"
);
}
return
rows_per_wal
;
}
void
...
...
@@ -150,6 +150,8 @@ box_check_config()
box_check_uri
(
cfg_gets
(
"replication_source"
),
"replication_source"
);
box_check_readahead
(
cfg_geti
(
"readahead"
));
box_check_rows_per_wal
(
cfg_geti
(
"rows_per_wal"
));
box_check_wal_mode
(
cfg_gets
(
"wal_mode"
));
}
extern
"C"
void
...
...
@@ -191,8 +193,6 @@ box_set_listen(const char *uri)
if
(
uri
!=
NULL
)
coio_service_start
(
&
binary
,
uri
);
box_leave_local_standby_mode
(
NULL
);
}
extern
"C"
void
...
...
@@ -245,51 +245,6 @@ box_set_readahead(int readahead)
/* }}} configuration bindings */
void
box_leave_local_standby_mode
(
void
*
data
__attribute__
((
unused
)))
{
/*
* recovery->finalize is true when listen is changed
* dynamically.
*/
if
(
recovery
->
finalize
)
return
;
try
{
/*
* It is hypothetically possible to change values of
* box.cfg.rows_per_wal and box.cfg.wal_mode **after** calling
* load_cfg() and **before** leaving hot standby mode
* (for example, via a background fiber). Check configuration
* options again, finalize the recovery process and start WAL
* writer with the provided values.
*/
int
rows_per_wal
=
cfg_geti
(
"rows_per_wal"
);
const
char
*
wal_mode_str
=
cfg_gets
(
"wal_mode"
);
box_check_rows_per_wal
(
rows_per_wal
);
enum
wal_mode
wal_mode
=
box_check_wal_mode
(
wal_mode_str
);
recovery_finalize
(
recovery
,
wal_mode
,
rows_per_wal
);
}
catch
(
Exception
*
e
)
{
e
->
log
();
panic
(
"unable to successfully finalize recovery"
);
}
/*
* notify engines about end of recovery.
*/
engine_end_recovery
();
stat_cleanup
(
stat_base
,
IPROTO_TYPE_STAT_MAX
);
if
(
recovery_has_remote
(
recovery
))
recovery_follow_remote
(
recovery
);
/* Enter read-write mode. */
if
(
recovery
->
server_id
>
0
)
box_set_ro
(
false
);
title
(
"running"
,
NULL
);
say_info
(
"ready to accept requests"
);
}
/**
* Execute a request against a given space id with
...
...
@@ -446,89 +401,98 @@ engine_init()
engine_register
(
sophia
);
}
void
box_init
()
static
inline
void
box_
do_
init
(
void
)
{
box_check_config
();
stat_init
();
stat_base
=
stat_register
(
iproto_type_strs
,
IPROTO_TYPE_STAT_MAX
);
tuple_init
(
cfg_getd
(
"slab_alloc_arena"
),
cfg_geti
(
"slab_alloc_minimal"
),
cfg_geti
(
"slab_alloc_maximal"
),
cfg_getd
(
"slab_alloc_factor"
));
try
{
engine_init
();
schema_init
();
user_cache_init
();
/*
* The order is important: to initialize sessions,
* we need to access the admin user, which is used
* as a default session user when running triggers.
*/
session_init
();
title
(
"loading"
,
NULL
);
/* recovery initialization */
recovery
=
recovery_new
(
cfg_gets
(
"snap_dir"
),
cfg_gets
(
"wal_dir"
),
recover_row
,
NULL
);
recovery_set_remote
(
recovery
,
cfg_gets
(
"replication_source"
));
recovery_setup_panic
(
recovery
,
cfg_geti
(
"panic_on_snap_error"
),
cfg_geti
(
"panic_on_wal_error"
));
if
(
recovery_has_data
(
recovery
))
{
/* Tell Sophia engine LSN it must recover to. */
int64_t
checkpoint_id
=
recovery_last_checkpoint
(
recovery
);
engine_begin_recover_snapshot
(
checkpoint_id
);
/* Process existing snapshot */
recover_snap
(
recovery
);
engine_end_recover_snapshot
();
}
else
if
(
recovery_has_remote
(
recovery
))
{
/* Initialize a new replica */
replica_bootstrap
(
recovery
);
engine_end_recover_snapshot
();
box_snapshot
();
}
else
{
/* Initialize the first server of a new cluster */
recovery_bootstrap
(
recovery
);
box_set_cluster_uuid
();
box_set_server_uuid
();
engine_end_recover_snapshot
();
box_snapshot
();
}
fiber_gc
();
}
catch
(
Exception
*
e
)
{
e
->
log
();
panic
(
"can't initialize storage: %s"
,
e
->
errmsg
());
stat_init
();
stat_base
=
stat_register
(
iproto_type_strs
,
IPROTO_TYPE_STAT_MAX
);
engine_init
();
schema_init
();
user_cache_init
();
/*
* The order is important: to initialize sessions,
* we need to access the admin user, which is used
* as a default session user when running triggers.
*/
session_init
();
title
(
"loading"
,
NULL
);
/* recovery initialization */
recovery
=
recovery_new
(
cfg_gets
(
"snap_dir"
),
cfg_gets
(
"wal_dir"
),
recover_row
,
NULL
);
recovery_set_remote
(
recovery
,
cfg_gets
(
"replication_source"
));
recovery_setup_panic
(
recovery
,
cfg_geti
(
"panic_on_snap_error"
),
cfg_geti
(
"panic_on_wal_error"
));
if
(
recovery_has_data
(
recovery
))
{
/* Tell Sophia engine LSN it must recover to. */
int64_t
checkpoint_id
=
recovery_last_checkpoint
(
recovery
);
engine_begin_recover_snapshot
(
checkpoint_id
);
/* Process existing snapshot */
recover_snap
(
recovery
);
engine_end_recover_snapshot
();
}
else
if
(
recovery_has_remote
(
recovery
))
{
/* Initialize a new replica */
replica_bootstrap
(
recovery
);
engine_end_recover_snapshot
();
box_snapshot
();
}
else
{
/* Initialize the first server of a new cluster */
recovery_bootstrap
(
recovery
);
box_set_cluster_uuid
();
box_set_server_uuid
();
engine_end_recover_snapshot
();
box_snapshot
();
}
fiber_gc
();
title
(
"orphan"
,
NULL
);
recovery_follow_local
(
recovery
,
cfg_getd
(
"wal_dir_rescan_delay"
));
recovery_follow_local
(
recovery
,
cfg_getd
(
"wal_dir_rescan_delay"
));
title
(
"hot_standby"
,
NULL
);
iproto_init
(
&
binary
);
/**
* listen is a dynamic option, so box_set_listen()
* will be called after box_init() as long as there
* is a value for listen in the configuration table.
*
* However, if cfg.listen is nil, box_set_listen() will
* not be called - which means that we need to leave
* local hot standby here. The idea is to leave
* local hot standby immediately if listen is not given,
* and only after binding to the listen uri otherwise.
*/
if
(
cfg_gets
(
"listen"
)
==
NULL
)
box_leave_local_standby_mode
(
NULL
);
box_set_listen
(
cfg_gets
(
"listen"
));
int
rows_per_wal
=
box_check_rows_per_wal
(
cfg_geti
(
"rows_per_wal"
));
enum
wal_mode
wal_mode
=
box_check_wal_mode
(
cfg_gets
(
"wal_mode"
));
recovery_finalize
(
recovery
,
wal_mode
,
rows_per_wal
);
engine_end_recovery
();
stat_cleanup
(
stat_base
,
IPROTO_TYPE_STAT_MAX
);
if
(
recovery_has_remote
(
recovery
))
recovery_follow_remote
(
recovery
);
/* Enter read-write mode. */
if
(
recovery
->
server_id
>
0
)
box_set_ro
(
false
);
title
(
"running"
,
NULL
);
say_info
(
"ready to accept requests"
);
fiber_gc
();
}
void
box_init
()
{
try
{
box_do_init
();
}
catch
(
Exception
*
e
)
{
e
->
log
();
panic
(
"can't initialize storage: %s"
,
e
->
errmsg
());
}
}
void
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment