2848 Commits

Author SHA1 Message Date
antirez
cdc610d78f Sentinel: send SCRIPT KILL on -BUSY reply and SDOWN instance.
From the point of view of Redis an instance replying -BUSY is down,
since it is effectively not able to reply to user requests. However
a looping script is a recoverable condition in Redis if the script still
did not performed any write to the dataset. In that case performing a
fail over is not optimal, so Sentinel now tries to restore the normal server
condition killing the script with a SCRIPT KILL command.

If the script already performed some write before entering an infinite
(or long enough to timeout) loop, SCRIPT KILL will not work and the
fail over will be triggered anyway.
2012-08-24 12:29:54 +02:00
antirez
d1bf9723ea Sentinel: fixed a crash on script execution.
The call to sentinelScheduleScriptExecution() lacked the final NULL
argument to signal the end of arguments. This resulted into a crash.
2012-08-24 12:10:24 +02:00
Salvatore Sanfilippo
746e478fcc Merge pull request #628 from pietern/unstable-zip
Fix ziplist edge case
2012-08-22 02:32:27 -07:00
antirez
87eff969d4 redis-benchmark: disable big buffer cleanup in hiredis context.
This new hiredis features allows us to reuse a previous context reader
buffer even if already very big in order to maximize performances with
big payloads (Usually hiredis re-creates buffers when they are too big
and unused in order to save memory).
2012-08-21 17:31:44 +02:00
antirez
49ec227531 hiredis library updated.
This version of hiredis merges modifications of the Redis fork with
latest changes in the hiredis repository.

The same version was pushed on the hiredis repository and will probably
merged into the master branch in short time.
2012-08-21 17:27:01 +02:00
Pieter Noordhuis
d53250b9b7 Set p to its new offset before modifying it 2012-08-13 14:13:09 -07:00
Pieter Noordhuis
2251ed8462 Add ziplist test for deleting next to last entries 2012-08-13 14:09:40 -07:00
antirez
08ba0e506b Sentinel: SENTINEL FAILOVER command implemented.
This command can be used in order to force a Sentinel instance to start
a failover for the specified master, as leader, forcing the failover
even if the master is up.

The commit also adds some minor refactoring and other improvements to
functions already implemented that make them able to work when the
master is not in SDOWN condition. For instance slave selection
assumed that we ask INFO every second to every slave, this is true
only when the master is in SDOWN condition, so slave selection did not
worked when the master was not in SDOWN condition.
2012-08-03 12:41:27 +02:00
antirez
6dd0770966 Sentinel: client reconfiguration script execution.
This commit adds support to optionally execute a script when one of the
following events happen:

* The failover starts (with a slave already promoted).
* The failover ends.
* The failover is aborted.

The script is called with enough parameters (documented in the example
sentinel.conf file) to provide information about the old and new ip:port
pair of the master, the role of the sentinel (leader or observer) and
the name of the master.

The goal of the script is to inform clients of the configuration change
in a way specific to the environment Sentinel is running, that can't be
implemented in a genereal way inside Sentinel itself.
2012-08-02 18:40:30 +02:00
Salvatore Sanfilippo
0aad38709c Merge pull request #613 from tobstarr/patch-1
Fix version numbers
2012-08-02 05:37:10 -07:00
Tobias Schwab
1ffa8a6c58 Fix version numbers 2012-08-02 15:10:51 +03:00
antirez
9cae4fe852 Sentinel: when leader in wait-start, sense another leader as race.
When we are in wait start, if another leader (or any other external
entity) turns a slave into a master, abort the failover, and detect it
as an observer.

Note that the wait-start state is mainly there for this reason but the
abort was yet not implemented.

This adds a new sentinel event -failover-abort-race.
2012-07-31 17:11:26 +02:00
antirez
175115c179 Sentinel: sentinelRefreshInstanceInfo() comments improved a bit. 2012-07-31 16:18:15 +02:00
Michael Parker
29bd575692 Use correct variable name for value to convert.
Note by @antirez: this code was never compiled because utils.c lacked the
float.h include, so we never noticed this variable was mispelled in the
past.

This should provide a noticeable speed boost when saving certain types
of databases with many sorted sets inside.
2012-07-31 11:48:00 +02:00
antirez
58ab276fa5 Sentinel: sentinel.conf self-documenation improved. 2012-07-31 11:05:21 +02:00
antirez
48fddcc17e Sentinel: abort failover when in wait-start if master is back.
When we are a Leader Sentinel in wait-start state, starting with this
commit the failover is aborted if the master returns online.

This improves the way we handle a notable case of net split, that is the
split between Sentinels and Redis servers, that will be a very common
case of split becase Sentinels will often be installed in the client's
network and servers can be in a differnt arm of the network.

When Sentinels and Redis servers are isolated the master is in ODOWN
condition since the Sentinels can agree about this state, however the
failover does not start since there are no good slaves to promote (in
this specific case all the slaves are unreachable).

However when the split is resolved, Sentinels may sense the slave back
a moment before they sense the master is back, so the failover may start
without a good reason (since the master is actually working too).

Now this condition is reversible, so the failover will be aborted
immediately after if the master is detected to be working again, that
is, not in SDOWN nor in ODOWN condition.
2012-07-31 10:19:34 +02:00
antirez
ba383a34e3 Merge remote-tracking branch 'origin/unstable' into unstable 2012-07-28 20:55:17 +02:00
antirez
756ad8da8b Sentinel: scripts execution engine improved.
We no longer use a vanilla fork+execve but take a queue of jobs of
scripts to execute, with retry on error, timeouts, and so forth.

Currently this is used only for notifications but soon the ability to
also call clients reconfiguration scripts will be added.
2012-07-28 20:54:27 +02:00
Jeremy Zawodny
12a75ff3ca comment fix
improve English a bit. :-)
2012-07-28 20:54:26 +02:00
Salvatore Sanfilippo
5628167514 Merge pull request #606 from badboy/patch-1
Include sys/wait.h to avoid compiler warning
2012-07-28 02:51:56 -07:00
Jan-Erik Rediger
ac03c5dd89 Include sys/wait.h to avoid compiler warning
gcc warned about an implicit declaration of function 'wait3'. 
Including this header fixes this.
2012-07-28 12:33:01 +03:00
Salvatore Sanfilippo
7cf677f7d6 Merge pull request #587 from saj/truncate-short-write-from-aof
Truncate short write from the AOF
2012-07-27 03:56:48 -07:00
Salvatore Sanfilippo
8736a89ca4 Merge pull request #586 from saj/aof_last_bgrewrite_status
New in INFO: aof_last_bgrewrite_status
2012-07-27 03:55:20 -07:00
antirez
4fd46a9861 Sentinel: don't start a failover as leader if there is no good slave. 2012-07-26 12:09:40 +02:00
Salvatore Sanfilippo
7b3dff84f0 Merge pull request #604 from jzawodn/patch-1
comment fix
2012-07-25 08:31:57 -07:00
Jeremy Zawodny
f4fd0cc2c4 comment fix
improve English a bit. :-)
2012-07-25 08:29:11 -07:00
antirez
4661258e05 Sentinel: ability to execute notification scripts. 2012-07-25 16:33:37 +02:00
Salvatore Sanfilippo
0d4941a782 Merge pull request #603 from mrb/fix_sentinel_config_warning
Fix warning in redis.c for sentinel config load
2012-07-25 07:15:53 -07:00
Salvatore Sanfilippo
befe69547c Merge pull request #602 from mrb/sentinel_docs
Some cleanup in sentinel.conf
2012-07-25 07:15:02 -07:00
mrb
290344e8d4 Fix warning in redis.c for sentinel config load 2012-07-25 09:55:53 -04:00
mrb
175d0fa1ce Some cleanup in sentinel.conf 2012-07-25 09:52:26 -04:00
antirez
e7975f719a Sentinel: abort failover if no good slave is available.
The previous behavior of the state machine was to wait some time and
retry the slave selection, but this is not robust enough against drastic
changes in the conditions of the monitored instances.

What we do now when the slave selection fails is to abort the failover
and return back monitoring the master. If the ODOWN condition is still
present a new failover will be triggered and so forth.

This commit also refactors the code we use to abort a failover.
2012-07-25 11:32:19 +02:00
antirez
4013599560 Sentinel: reset pending_commands in a more generic way. 2012-07-24 18:57:26 +02:00
antirez
b94bca01fc Prevent a spurious +sdown event on switch.
When we reset the master we should start with clean timestamps for ping
replies otherwise we'll detect a spurious +sdown event, because on
+master-switch event the previous master instance was probably in +sdown
condition. Since we updated the address we should count time from
scratch again.

Also this commit makes sure to explicitly reset the count of pending
commands, now we can do this because of the new way the hiredis link
is closed.
2012-07-24 18:46:04 +02:00
antirez
66b8296c55 Sentinel: debugging message removed. 2012-07-24 18:20:05 +02:00
antirez
b41b05c487 Sentinel: changes to connection handling and redirection.
We disconnect the Redis instances hiredis link in a more robust way now.
Also we change the way we perform the redirection for the +switch-master
event, that is not just an instance reset with an address change.

Using the same system we now implement the +redirect-to-master event
that is triggered by an instance that is configured to be master but
found to be a slave at the first INFO reply. In that case we monitor the
master instead, logging the incident as an event.
2012-07-24 18:15:44 +02:00
antirez
87701d32b5 Sentinel: check that instance still exists in reply callbacks.
We can't be sure the instance object still exists when the reply
callback is called.
2012-07-24 16:37:57 +02:00
antirez
439e2d101e Sentinel: more robust failover detection as observer.
Sentinel observers detect failover checking if a slave attached to the
monitored master turns into its replication state from slave to master.
However while this change may in theory only happen after a SLAVEOF NO
ONE command, in practie it is very easy to reboot a slave instance with
a wrong configuration that turns it into a master, especially if it was
a past master before a successfull failover.

This commit changes the detection policy so that if an instance goes
from slave to master, but at the same time the runid has changed, we
sense a reboot, and in that case we don't detect a failover at all.

This commit also introduces the "reboot" sentinel event, that is logged
at "warning" level (so this will trigger an admin notification).

The commit also fixes a problem in the disconnect handler that assumed
that the instance object always existed, that is not the case. Now we
no longer assume that redisAsyncFree() will call the disconnection
handler before returning.
2012-07-24 12:42:40 +02:00
antirez
b37d5b4728 Fixed an error in the example sentinel.conf. 2012-07-23 15:08:36 +02:00
antirez
aea1435caf Typo. 2012-07-23 15:06:55 +02:00
antirez
43cc64d30e First implementation of Redis Sentinel.
This commit implements the first, beta quality implementation of Redis
Sentinel, a distributed monitoring system for Redis with notification
and automatic failover capabilities.

More info at http://redis.io/topics/sentinel
2012-07-23 13:14:44 +02:00
antirez
a7cb2683f0 Merge remote-tracking branch 'origin/unstable' into unstable 2012-07-22 17:18:42 +02:00
antirez
30e9bb4ee8 Allow Pub/Sub in contexts where other commands are blocked.
Redis loading data from disk, and a Redis slave disconnected from its
master with serve-stale-data disabled, are two conditions where
commands are normally refused by Redis, returning an error.

However there is no reason to disable Pub/Sub commands as well, given
that this layer does not interact with the dataset. To allow Pub/Sub in
as many contexts as possible is especially interesting now that Redis
Sentinel uses Pub/Sub of a Redis master as a communication channel
between Sentinels.

This commit allows Pub/Sub to be used in the above two contexts where
it was previously denied.
2012-07-22 17:18:16 +02:00
Salvatore Sanfilippo
6ff991bd94 Merge pull request #593 from steevel/unstable
Check that we have connection before enabling pipe mode
2012-07-21 11:12:35 -07:00
antirez
3fbd3b28a0 Don't assume that "char" is signed.
For the C standard char can be either signed or unsigned, it's up to the
compiler, but Redis assumed that it was signed in a few places.

The practical effect of this patch is that now Redis 2.6 will run
correctly in every system where char is unsigned, notably the RaspBerry
PI and other ARM systems with GCC.

Thanks to Georgi Marinov (@eesn on twitter) that reported the problem
and allowed me to use his RaspBerry via SSH to trace and fix the issue!
2012-07-18 12:04:58 +02:00
Saj Goonatilleke
7b7d54befd Truncate short write from the AOF
If Redis only manages to write out a partial buffer, the AOF file won't
load back into Redis the next time it starts up.  It is better to
discard the short write than waste time running redis-check-aof.
2012-07-18 10:35:17 +10:00
Saj Goonatilleke
fdda6c5b19 New in INFO: aof_last_bgrewrite_status
Behaves like rdb_last_bgsave_status -- even down to reporting 'ok' when
no rewrite has been done yet.  (You might want to check that
aof_last_rewrite_time_sec is not -1.)
2012-07-18 09:54:55 +10:00
Steeve Lennmark
16609e29b4 Check that we have connection before enabling pipe mode 2012-07-15 14:35:02 +02:00
Salvatore Sanfilippo
587ca33ba5 Merge pull request #569 from jokea/unstable
mark fd as writable when EPOLLERR or EPOLLHUP is returned by epoll_wait.
2012-07-09 03:14:08 -07:00
Saj Goonatilleke
bc235fe40f Bug fix: slaves being pinged every second
REDIS_REPL_PING_SLAVE_PERIOD controls how often the master should
transmit a heartbeat (PING) to its slaves.  This period, which defaults
to 10, is measured in seconds.

Redis 2.4 masters used to ping their slaves every ten seconds, just like
it says on the tin.

The Redis 2.6 masters I have been experimenting with, on the other hand,
ping their slaves *every second*.  (master_last_io_seconds_ago never
approaches 10.)  I think the ping period was inadvertently slashed to
one-tenth of its nominal value around the time REDIS_HZ was introduced.
This commit reintroduces correct ping schedule behaviour.
2012-07-05 14:29:27 +10:00