Avi Kivity
951a93a534
file.hh: add missing include
2015-02-10 18:59:16 +02:00
Tomasz Grabiec
10e58e0cda
tests: Make test runner catch and forward exceptions thrown directly from task
2015-02-10 14:47:42 +02:00
Tomasz Grabiec
85c67001dd
tests: Add test for exceptions thrown from do_until()
2015-02-10 14:47:42 +02:00
Tomasz Grabiec
331d5e1569
core: Fail do_until() future when the callback throws
...
Otherwise we will aband the result promise, which results in abort.
2015-02-10 14:47:42 +02:00
Avi Kivity
ee58c77008
httpd: fix unbounded memory use in eerror handling
...
httpd uses recursion for its read loop:
future<> read() {
_read_buf.consume().then([] {
...
if more work:
return read();
});
}
However, after error handling was added, it looks like this:
future<> read() {
_read_buf.consume().then([] {
...
if more work:
return read();
}).rescue(...);
}
The problem is that rescue() is called for every iteration of the loop,
instead of for the loop in its entirety. This means that a rescue
continuation is allocated for every processed request, but they will only
be called after the entire loop terminates. This results in tons of
allocated memory.
Fix by moving error handling to the end of the loop (and incidentally using
do_until() instead of recursion).
2015-02-10 12:00:32 +02:00
Tomasz Grabiec
81c250e698
transport: Remove invalid and no longer needed include
2015-02-09 18:44:19 +01:00
Avi Kivity
54865773e5
build: avoid generating duplicate build rules for thrift and antlr objects
...
Use a set to eliminate duplicates due to multiple binaries using the same
grammars and interfaces.
2015-02-09 18:23:09 +01:00
Avi Kivity
196d15d149
transport: de-ragel frame processing
...
Current ragel-based cql transport processing has a bug, in which it
assumes that frame headers will not cross a fragment boundary. Rather than
fix it, drop ragel completely. With a small complication, the frame header
size is known in advance, so we can just read_exactly() it.
The complication is that before the first frame is read, we do not know the
protocol version, which affects the frame header size. Adjust for that by
reading the first byte, recording the version, and then splicing in the rest
of the frame header.
2015-02-09 18:23:09 +01:00
Avi Kivity
6bf105511b
transport: rename cql/ to transport/
...
cql/, where the binary protocol code resides, is too similar to cql3/, where
the grammar lives. Rename it to transport/ to reduce confusion. While the
name isn't perfect, it matches origin.
2015-02-09 18:23:09 +01:00
Avi Kivity
29366cb076
net: add byteorder (ntoh/hton) variants for signed types
2015-02-09 17:07:21 +02:00
Tomasz Grabiec
22bb2ac34d
Merge branch 'tgrabiec/cql3' from git@github.com:cloudius-systems/seastar-dev.git
...
CQL3 Conversions, application of mutations into db.
2015-02-09 10:32:15 +01:00
Tomasz Grabiec
fb6941bbee
tests: Add test for row tombstones
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
7ea7a6822b
db: Fix mutation_partition::apply_row_tombstone()
...
It was not updating already inserted tombstones.
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
a6f4f2d6aa
db: Add mutation_partition::tombstone_for_row()
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
138ed6faac
tests: Add test for tuple_type::is_prefix_of()
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
0a5bf555ea
types: Introduce tuple_type::is_prefix_of()
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
7b7f63645b
db: Make tombstone::operator bool() explicit
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
37599d5d10
db: Define the rest of comparison operators in tombstone
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
0bde5f74e7
db: Introduce tombstone::compare() and express operators using it
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
543cc40d1a
tests: Add performance test for in-memory row mutation
...
It shows that our serialization code, which is using ostringstream
under the hood, is really dragging us down. In the perf profile we can
see dynamic casts high called from iostream classes, called from
abstract_type::decompose()
$ taskset -c 0 build/release/tests/perf/perf_mutation
Timing mutation of single column within once row
83536.54 tps
115157.06 tps
85059.52 tps
60443.80 tps
112878.47 tps
$ perf report
- 11,66% perf_mutation libstdc++.so.6.0.20 [.] __cxxabiv1::__si_class_type_info::__do_dyncast(long, __cxxabiv1::__class_type_info::__sub_kind, __cxxabiv1:▒
+ __cxxabiv1::__si_class_type_info::__do_dyncast(long, __cxxabiv1::__class_type_info::__sub_kind, __cxxabiv1::__class_type_info const*, void const*, __cxxabiv1::__c◆
- __dynamic_cast ▒
- 43,58% std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > > const& std::use_facet<std::num_get<char, std::istreambuf_iterator<char, std▒
std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&) ▒
- std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ▒
92,70% std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::basic_istringstream(std::string const&, std::_Ios_Openmode) ▒
+ 7,30% abstract_type::decompose(boost::any const&) ▒
- 27,36% bool std::has_facet<std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > > >(std::locale const&) ▒
std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&) ▒
- std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ▒
93,14% std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::basic_istringstream(std::string const&, std::_Ios_Openmode) ▒
+ 6,86% abstract_type::decompose(boost::any const&) ▒
+ 14,54% bool std::has_facet<std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > > >(std::locale const&) ▒
+ 14,52% std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > > const& std::use_facet<std::num_put<char, std::ostreambuf_iterator<char, std▒
- 9,97% perf_mutation libstdc++.so.6.0.20 [.] __dynamic_cast ▒
- __dynamic_cast ▒
+ 19,67% std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > > const& std::use_facet<std::num_get<char, std::istreambuf_iterator<char, std▒
+ 18,66% std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > > const& std::use_facet<std::num_put<char, std::ostreambuf_iterator<char, std▒
+ 16,72% bool std::has_facet<std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > > >(std::locale const&) ▒
+ 15,16% bool std::has_facet<std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > > >(std::locale const&) ▒
+ 15,04% bool std::has_facet<std::ctype<char> >(std::locale const&) ▒
+ 14,74% std::ctype<char> const& std::use_facet<std::ctype<char> >(std::locale const&) ▒
- 7,98% perf_mutation libstdc++.so.6.0.20 [.] __cxxabiv1::__vmi_class_type_info::__do_dyncast(long, __cxxabiv1::__class_type_info::__sub_kind, __cxxabiv1▒
- __cxxabiv1::__vmi_class_type_info::__do_dyncast(long, __cxxabiv1::__class_type_info::__sub_kind, __cxxabiv1::__class_type_info const*, void const*, __cxxabiv1::__▒
- __dynamic_cast ▒
- 77,13% std::ctype<char> const& std::use_facet<std::ctype<char> >(std::locale const&) ▒
std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&) ▒
+ std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ▒
+ 22,87% bool std::has_facet<std::ctype<char> >(std::locale const&) ▒
+ 6,45% perf_mutation libstdc++.so.6.0.20 [.] std::locale::locale() ▒
+ 6,40% perf_mutation libstdc++.so.6.0.20 [.] std::locale::~locale() ▒
+ 5,02% perf_mutation libstdc++.so.6.0.20 [.] std::locale::operator=(std::locale const&) ▒
+ 4,18% perf_mutation libc-2.19.so [.] __GI___strcmp_ssse3 ▒
2015-02-09 10:28:45 +01:00
Tomasz Grabiec
1b66f33455
db: Apply mutations locally from storage_proxy
...
Eventually we should rather send them to replicas, but for now we just
apply locally.
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
2244eab6c1
db: Steal data from mutations when applying
...
Taking mutations by r-value reference allows us to avoid copies.
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
9530a372cc
cql3: Take reference to storage_proxy and call instance methods
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
28915bf673
tests: Add test for applying mutations
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
ee10d9b437
tests: Add test for int32_type string conversions
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
f1c9f64a25
types: Implement string conversions for int32_type and string_type
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
92c95c6c81
types: Add tuple_type::decompose_value() shorthand method
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
d5a7f37c45
db: Merge api.hh into database.hh
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
e20cc1c1f9
db: Avoid storing schema pointer with each partition
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
48c11a01db
db: Add ability to apply mutations into the database
...
For simplicity partition data is stored using the same object which is
used for mutations: mutation_partition. Later we can introduce a more
efficient version.
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
800ba79efa
db: Drop api:: namespace from mutation model classes
...
In preparation for merging into database.hh
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
19e89a6057
db: Introduce mutation_partition::apply(const mutation_partition&)
...
It merges two partition mutations together. It is assumed that the first
one (invocation target) is much larger.
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
3645e983c0
db: Refactor atomic_cell structure
...
The new structure has common timestamp field extracted, it has the
same meaning for both live and dead cells. It will make it easier to
merge cells this way.
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
1212ad18d0
db: Make setting static vs. clustered cell explicit
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
df8f7279b3
db: Simplify row tombstone management
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
211f52e40a
schema: Move to schema.hh
2015-02-09 10:28:44 +01:00
Tomasz Grabiec
9f8ac4ab2a
cql3: Implement column_identifier::raw::prepare()
2015-02-09 10:28:43 +01:00
Tomasz Grabiec
87a38b52ef
types: Add from_string() stub
2015-02-09 10:28:43 +01:00
Tomasz Grabiec
90604df376
cql3: Move method definition to the source file
2015-02-09 10:28:43 +01:00
Tomasz Grabiec
754976bbec
cql3: Convert ParsedUpdate
2015-02-09 10:28:43 +01:00
Tomasz Grabiec
87597ba3a4
cql3: Fix typo in process_where_clause()
2015-02-09 10:28:43 +01:00
Tomasz Grabiec
ef7ce1406f
cql3: Make column_identifier ostream-printable
2015-02-09 10:28:41 +01:00
Tomasz Grabiec
73f1c6cb44
cql3: Make name accessors return sstring ref instead of value
...
To avoid unnecessary copies.
2015-02-09 10:28:10 +01:00
Tomasz Grabiec
987cdaa6cb
cql3: Optimise includes
2015-02-09 10:28:09 +01:00
Tomasz Grabiec
12af207219
cql3: Add missing virtual/override
2015-02-09 10:28:09 +01:00
Tomasz Grabiec
208fdfab45
cql3: Move methods from header to source file
2015-02-09 10:28:09 +01:00
Tomasz Grabiec
852afdfb3c
validation: Add missing include
2015-02-09 10:28:09 +01:00
Tomasz Grabiec
295fca1c71
Merge remote-tracking branch 'dev/penberg/cql-for-tomek'
2015-02-09 10:12:44 +01:00
Tomasz Grabiec
911c514a70
Merge branch 'master' of github.com:cloudius-systems/seastar
2015-02-09 10:11:15 +01:00
Asias He
f0c1bcdb33
tcp: Switch to debug print for persist timer
...
It is a left over during development.
2015-02-09 10:58:16 +02:00