| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
| |
|
|
|
|
| |
(http://code.google.com/p/memcached/issues/detail?id=275)
|
| |
|
|
|
|
|
|
|
| |
someone pointed out that cache_destroy wasn't freeing the cache_t pointer.
memcached itself never destroys a cache it creates, so this is fine, but it's
fixed for completeness...
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
I'll probably get in trouble for removing DONT_PREALLOC_SLABS
... however tons of people like using the -L option, which does nothing under
linux. It should soon do *something* under linux, and when it does they'll
report the same errors of not being able to store things into certain slab
classes.
So just give them a useful error and bail instead.
|
|
|
|
|
| |
I imagine host people on linux run this and then get both thumbs stuck up
their noses when weird bugs happen. Lets start by not lying to them.
|
|
|
|
| |
(I removed the "honoured" fix as this is american english -ed)
|
| |
|
|
|
|
|
| |
bitrotted. only existed to prove a point. can add it back in better later, or
use a storage engine if we ever get on 1.6.
|
|
|
|
|
| |
slabs_reassign() calls now attempt to lock, return busy if thread is already
moving something.
|
|
|
|
|
| |
also fix a bug causing slab rebalance thread to spin instead of waiting on the
condition... duhr.
|
|
|
|
|
|
|
|
|
| |
specifying -1 as the src class for a slabs reassign will pick the first
available, rolling through the list on each request (so as to not bias against
the smaller classes).
So if you're in a hurry and have to move memory into class 5, you may now mash
it without thinking.
|
|
|
|
|
|
|
|
|
| |
slab rebalancer now chillaxes on a signal and waits a lot less time when
hitting a busy item. automove is its own thread now, and signals rebal when
necessary.
when entering the command "slabs reassign 1 2" it should start moving a
page instantly.
|
|
|
|
|
|
|
| |
slab memory assignment used to lazily split a new page into chunks as memory
was requested. now it doesn't, so drop all the related code.
Cuts the memory assignment hotpath a tiny bit, so that's exciting.
|
|
|
|
|
|
|
|
|
|
|
|
| |
slab freelists used to be malloc'ed arrays. then they were changed into a
freelist. now we pre-split newly assigned/moved pages into a slabs freelist
instead of lazily pulling pointers as needed.
The loop is pretty darn direct and I can't measure a performance impact of
this relatively rare event.
In doing this, slab reassign can move memory without having to wait for a
class to chew through its recently assigned page first.
|
|
|
|
|
| |
(ed note: yes it doesn't check for a NULL and die after 20 times. this should
mitigate until we can do better with writing the pidfile)
|
|
|
|
|
| |
ed note: this needs to be redone in memcached.h as a static inline, or changed
to a define.
|
| |
|
|
|
|
|
|
|
|
|
| |
reported by jhpark. items at the bottom of the LRU would be popped for sets if
flush_all was set for the "future" but said future hadn't arrived yet.
item_get handled this correctly so the flush would not happen, but items at
the bottom of the LRU would be reclaimed early.
Added tests for this as well.
|
|
|
|
|
|
|
| |
This fails for various stupid platform-specific things. The SASL code
can be working correctly, but not in a way that is completely
predictable on every platform (for example, we may be missing a
particular auth mode).
|
| |
|
|
|
|
|
|
|
|
| |
saslpasswd2 does something a little magical when initializing the
structure that's different from what happens if you just pass NULL.
The magic is too great for the tests as is, so this code does the same
thing saslpasswd2 does to determine the fqdn.
|
|
|
|
|
|
|
| |
They just changed this randomly with no way to really detect it. You
can read about it here:
http://lists.andrew.cmu.edu/pipermail/cyrus-sasl/2011-September/002340.html
|
|
|
|
|
|
| |
echo "" | nc localhost 11211 would segfault the server
simple fix is to add the proper token check to the one place it's missing.
|
| |
|
|
|
|
|
| |
I was naive. GCC atomics were added in 4.1.2, and not easily detectable
without configure tests. 32bit platforms, centos5, etc.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Awesome bug goes like this:
let "c1" be the commit of the "good state" and "c2" be the commit
immediately after (in a bad state). "t1" is the state of the tree in "c1"
and "t2" is the state of the tree in "c2"
In their natural states, we have this:
c1 -> t1 -> success
c1 -> t2 -> fail
However, if you take
c1 -> t1 -> patch to t2 -> success
c2 -> t2 -> patch to t1 -> fail
So t1 *and* t2 both succeed if the committed tree is c1, but both fail of
the committed tree is c2.
The difference? c1 has a tag that points to it so the version number is
"1.2.10" whereas the version number for the unreleased c2 is
"1.4.10-1-gee486ab" -- a bit longer, breaks stuff in tests that try to
print stats.
|
|
|
|
| |
32bit pointers are smaller... need more items to fill the slabs, sigh.
|
| |
|
|
|
|
|
| |
Since spawn_and_wait doesn't use argc anyway, might as well just not
send a value in.
|
|
|
|
| |
credit goes to anton.yuzhaninov for the report and patch
|
|
|
|
| |
Thanks to Stephen Yang for the bug report.
|
|
|
|
| |
bad practice.
|
|
|
|
|
|
|
| |
Most credit to Dustin and Trond for showing me the way, though I have no way
of testing this myself.
These should probably just be defines...
|
|
|
|
|
|
|
|
|
|
|
|
| |
Updates the slab mover for the new method.
1.4.10 lacks some crucial protection around item freeing and removal,
resulting in some potential crashes. Moving the cache_lock around item_remove
caused a 30% performance drop, so it's been reimplemented with GCC atomics.
refcount of 1 now means an item is linked but has no reference, which allows
us to test an atomic sub and fetch of 0 as a clear indicator of when to free
an item.
|
|
|
|
|
|
|
|
|
|
|
|
| |
I re-implemented a linked list for the slab freelist since we don't need to
manage the tail, check the previous item, and use it as a FIFO. However
prev/next must be managed so the slab mover is safe.
However I neglected to clear prev on a fetch, so if the slab mover was
zeroing the head of the freelist it would relink the next item in the freelist
with one in the main LRU.
Which results in chaos.
|
|
|
|
|
|
|
|
| |
do_item_update could decide to update an item, then wait on the cache_lock,
but the item could be unlinked in the meantime.
caused this to happen on purpose by flooding with sets, then flushing
repeatedly. flush has to unlink items until it hits the previous second.
|
|
|
|
|
| |
popular items could stuck the slab mover forever, so if a move is in progress,
check to see if the item we're fetching should be unlinked instead.
|
|
|
|
|
| |
Add human parseable strings to the errors for slabs ressign. Also prevent
reassigning memory to the same source and destination.
|
|
|
|
|
|
|
|
|
|
| |
Enable at startup with -o slab_reassign,slab_automove
Enable or disable at runtime with "slabs automove 1\r\n"
Has many weaknesses. Only pulls from slabs which have had zero recent
evictions. Is slow, not tunable, etc. Use the scripts/mc_slab_mover example to
write your own external automover if this doesn't satisfy.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Adds a "slabs reassign src dst" manual command, and a thread to safely process
slab moves in the background.
- slab freelist is now a linked list, reusing the item structure
- is -o slab_reassign is enabled, an extra background thread is started
- thread attempts to safely free up items when it's been told to move a page
from one slab to another.
-o slab_automove is stubbed.
There are some limitations. Most notable is that you cannot repeatedly move
pages around without first having items use up the memory. Slabs with newly
assigned memory work off of a pointer, handing out chunks individually. We
would need to change that to quickly split chunks for all newly assigned pages
into that slabs freelist.
Further testing is required to ensure such is possible without impacting
performance.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the race here is absolutely insane:
- do_item_get and do_item_alloc call at the same time, against different
items
- do_item_get wins cache_lock lock race, returns item for internal testing
- do_item_alloc runs next, pulls item off of tail of a slab class which is the
same item as do_item_get just got
- do_item_alloc sees refcount == 0 since do_item_get incrs it at the bottom,
and starts messing with the item
- do_item_get runs its tests and maybe even refcount++'s and returns the item
- evil shit happens.
This race is much more likely to hit during the slab reallocation work, so I'm
fixing it even though it's almost impossible to cause.
Also cleaned up the logic so it's not testing the item for NULL more than
once. Far fewer branches now, though I did not examine gcc's output to see if
it is optimized differently.
|
|
|
|
|
|
|
|
|
| |
Fix an unlikely bug where search == NULL and the first alloc fails, which then
attempts to use search.
Also reorders branches from most likely to least likely, and removes all
redundant tests that I can see. No longer double checks things like refcount
or exptime for the eviction case.
|
|
|
|
|
| |
after pulling an item off of the LRU, there's no reason to hold the cache lock
while we initialize a few values and memcpy some junk.
|
| |
|
|
|
|
|
|
|
|
|
| |
the fix for issue 140 only helped in the case of you poking at memcached with
a handful of items (or this particular test). On real instances you could
easily exhaust the 50 item search and still come up with a crap item.
It was removed because adding the proper locks back in that place is
difficult, and it makes "stats items" take longer in a gross lock anyway.
|
|
|
|
|
|
| |
Directly use the hash for accessing the table. Performance seems unchanged
from before but this is more proper. It also scales the hash table a bit as
worker threads are increased.
|
|
|
|
|
| |
easy win without restructuring item_alloc more: push the lock down after it's
done fiddling with snprintf.
|