History log of /5.5.2/couchstore/src/ (Results 1 - 25 of 540)
Revision (<<< Hide revision tags) (Show revision tags >>>)Date Author Comments
(<<< Hide modified files)
(Show modified files >>>)
Revision tags: v6.0.3, v5.5.3, v5.1.2
3b4c35d713-Jun-2018 Jim Walker <jim@couchbase.com>

MB-29816: btree_lookup is skipping a key

In btree_lookup_inner when processing a KV node a while loop
exits too soon.

The loop condition looks at the distance into the node and

MB-29816: btree_lookup is skipping a key

In btree_lookup_inner when processing a KV node a while loop
exits too soon.

The loop condition looks at the distance into the node and
the index into the input keys.

while (bufpos < nodebuflen && current < end)

In the test we have many input keys, but 1 key in the
KV node.

The test has keys which after sorting means the first evaluated
key is not in the btree, so we will iterate once and revaluate
the loop condition. However bufpos = 50 and nodebuflen = 50
as we have read a key, however the second iteration doesn't
want to read a new key, it just wants to evaluate the second
input key. However bufpos < nodebuflen cause the loop to end
and we return with no callback for our key.

The commit updates the loop condition so that we keep going
whilst we have input keys and we explictly break from the
loop if an attempt to read a new key occurs and we have
no more buf space.

Change-Id: Ib93e11b5d5f03211f4a13301b64f20c7664b4ecd
Reviewed-on: http://review.couchbase.org/95669
Well-Formed: Build Bot <build@couchbase.com>
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>
Reviewed-by: Tim Bradgate <tim.bradgate@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>

show more ...

28ec7f5b04-May-2018 Dave Rigby <daver@couchbase.com>

Avoid undefined behaviour for zero-length rev-meta

As identified by UBSan when running couchstore-purge test:

runtime error: null pointer passed as argument 2, which is declared

Avoid undefined behaviour for zero-length rev-meta

As identified by UBSan when running couchstore-purge test:

runtime error: null pointer passed as argument 2, which is declared to never be null
#0 0x7f4c2e622f88 in assemble_id_index_value couchstore/src/couch_save.cc:57
#1 0x7f4c2e622f88 in add_doc_to_update_list couchstore/src/couch_save.cc:326
#2 0x7f4c2e622f88 in couchstore_save_documents couchstore/src/couch_save.cc:387

Change-Id: Ic759ba8d455ddc048636269ad0c051808164407d
Reviewed-on: http://review.couchbase.org/93770
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>

show more ...

e0680f0604-May-2018 Dave Rigby <daver@couchbase.com>

Avoid undefined behaviour for zero-length reduce value

As reported by UBSan, it is undefined behviour to call memcpy() with a
null argument - in this case when encoding a root B-Tree nod

Avoid undefined behaviour for zero-length reduce value

As reported by UBSan, it is undefined behviour to call memcpy() with a
null argument - in this case when encoding a root B-Tree node which
has no reduce value (local tree has an empty reduce value).

Change-Id: I5fc62025b60039b799dbb78b30f4e406c1044951
Reviewed-on: http://review.couchbase.org/93750
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>

show more ...

c4656abc04-Apr-2018 Aman Achpal <aman.achpal@couchbase.com>

MB-19768 [View Engine] Fix exit path in Native C code

View Engine C code can exit in two ways:
1) When it finishes processing
2) When Erlang sends an "exit" signal
This patch enf

MB-19768 [View Engine] Fix exit path in Native C code

View Engine C code can exit in two ways:
1) When it finishes processing
2) When Erlang sends an "exit" signal
This patch enforces free-up of conditional variables
before destruction of threads in the latter case, and
synchronizes thread exits to prevent double free-ing.

Change-Id: I9b5f55ca580eb0a93dbb720639e4f6fc72ccc88c
Reviewed-on: http://review.couchbase.org/92115
Reviewed-by: Dave Rigby <daver@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Harsha H S

show more ...

bdabc39d28-Mar-2018 Dave Rigby <daver@couchbase.com>

MB-28409: Reduce memory zeroing costs

During profiling of the slowdown seen in MB-28409, a number of
unnecessary memory zeroing instances were seen in couchstore:

* file_buffer

MB-28409: Reduce memory zeroing costs

During profiling of the slowdown seen in MB-28409, a number of
unnecessary memory zeroing instances were seen in couchstore:

* file_buffer uses a std::vector for a dynamic array. This is wastful
as (a) this array is never resized once created and (b) it doesn't
need zero-initializing (as std::vector does), as it's simply
allocating an empty buffer which will later be filled from disk
files.
Replace with a dynamic array (new[]) managed by unique_ptr; which is
default-initialized (and hence not zeroed).

* db_write_header() uses cb_calloc() to allocate zeroed memory for the
header it's about to write. However, the entirity of this memory
will be filled in with valid data before written to disk; therefore
we can instead just use cb_malloc().

Change-Id: I900c236ad50d579296483abbc66ad768c17a6ae3
Reviewed-on: http://review.couchbase.org/91759
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Tim Bradgate <tim.bradgate@couchbase.com>

show more ...

6a2d3d1014-Mar-2018 Dave Rigby <daver@couchbase.com>

MB-28669: UBSan: avoid nullptr when calculating fatbuf offset

Issue identified by UBSan:

couch_db.cc:1343:56: runtime error: member access within null pointer of type 'fatbuf' (aka

MB-28669: UBSan: avoid nullptr when calculating fatbuf offset

Issue identified by UBSan:

couch_db.cc:1343:56: runtime error: member access within null pointer of type 'fatbuf' (aka '_fat_buffer')
#0 0x1027ed23b in couchstore_free_local_document couch_db.cc:1343

/Technically/ dereferencing a nullptr is undefined. Replace with
offsetof() which is expicitly designed to solve this problem.

Change-Id: I74c0a31490bd25ea4b12d4cb6207bb8470ef755c
Reviewed-on: http://review.couchbase.org/90992
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Tim Bradgate <tim.bradgate@couchbase.com>

show more ...

0009833705-Mar-2018 Jim Walker <jim@couchbase.com>

MB-28453: Support compressed xattr documents in dbdump

Manually inflate documents which are marked as datatype
snappy (but not COUCH_DOC_IS_COMPRESSED)

Change-Id: Ib0e2442f4e5fc

MB-28453: Support compressed xattr documents in dbdump

Manually inflate documents which are marked as datatype
snappy (but not COUCH_DOC_IS_COMPRESSED)

Change-Id: Ib0e2442f4e5fcb70bb000b7e0673515a197776d0
Reviewed-on: http://review.couchbase.org/90428
Reviewed-by: Tim Bradgate <tim.bradgate@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>

show more ...

2fff2ce505-Mar-2018 Jim Walker <jim@couchbase.com>

MB-28453: Switch xattrs from byte_buffer to char_buffer

KV-engine is unifying xattrs to use char_buffer, so dbdump.cc needs
a small change to remove an now unnecessary cast.

Fro

MB-28453: Switch xattrs from byte_buffer to char_buffer

KV-engine is unifying xattrs to use char_buffer, so dbdump.cc needs
a small change to remove an now unnecessary cast.

From the related kv-engine change:
<snip>
Overall we wish to remove the use of byte_buffer as we frequently
end up casting it to char. This commit just switches xattr code from
using a byte_buffer to char_buffer, making it easier to add
decompression support to xattr::Blob which is required to cleanly
address the MB this commit is linked with.
</snip>

Change-Id: I197723539ea1f7c799ccf3dcddfa1757531e36ba
Reviewed-on: http://review.couchbase.org/90422
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>

show more ...

6ef489f302-Feb-2018 harsha <harsha.hs.81@gmail.com>

MB-27758 Use aligned access for array of double values

Newer gcc optimizes double arrays by storing them into
wider(128 to 256 bits) registers like xmm/sse registers.
Memory accesses

MB-27758 Use aligned access for array of double values

Newer gcc optimizes double arrays by storing them into
wider(128 to 256 bits) registers like xmm/sse registers.
Memory accesses from/to xmm registers should be aligned
to double boundary.
This patch introduces a temporary double pointer for
aligned access and copies result back to unaligned pointer.

Change-Id: I4f38f8c19389f81a56cfe7f72f08095f17ee2f7e
Reviewed-on: http://review.couchbase.org/88776
Reviewed-by: Dave Rigby <daver@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Jeelan Basha Poola <jeelan.poola@couchbase.com>

show more ...

47b165c801-Feb-2018 Trond Norbye <trond.norbye@gmail.com>

Fix non-portable use of preprocessor

warning: this use of "defined" may not be portable [-Wexpansion-to-defined]
^~~~~~~~~~

Change-Id: Icf51d98d0eaf2fd3ce21a3edd95df455eaed3

Fix non-portable use of preprocessor

warning: this use of "defined" may not be portable [-Wexpansion-to-defined]
^~~~~~~~~~

Change-Id: Icf51d98d0eaf2fd3ce21a3edd95df455eaed3cf3
Reviewed-on: http://review.couchbase.org/88701
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>

show more ...

fab8394928-Nov-2017 Trond Norbye <trond.norbye@gmail.com>

Refactor: Use compression through cbcompress

Use cbcompress to deal with compression / decompression instead
of using snappy directly (By doing so we may utilize different
compressio

Refactor: Use compression through cbcompress

Use cbcompress to deal with compression / decompression instead
of using snappy directly (By doing so we may utilize different
compression algorithms in the future)

Change-Id: I0209f480cad22760a08f66047d5ff5250778ff07
Reviewed-on: http://review.couchbase.org/86061
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>

show more ...

21c7409724-Oct-2017 Eugen-Alexandru Virtan <eugen.virtan@couchbase.com>

MB-26047:[7-c] Switch over to using MicrosecondHistogram

Part of a cross repo change.

Change the code to use MicrosecondHistogram and related types.

Change-Id: Ic061e11a79b

MB-26047:[7-c] Switch over to using MicrosecondHistogram

Part of a cross repo change.

Change the code to use MicrosecondHistogram and related types.

Change-Id: Ic061e11a79b09663b980e173dc4191d46d5aa35d
Reviewed-on: http://review.couchbase.org/84745
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>

show more ...

47a8f09905-Oct-2017 Sriram Melkote <siri@couchbase.com>

MB-26279: Keep ArrayBuffer allocator around till isolate is done

Change-Id: I6e7f62bf8a70d41adf146ca882ed895e10fd96ea
Reviewed-on: http://review.couchbase.org/84068
Tested-by: Build

MB-26279: Keep ArrayBuffer allocator around till isolate is done

Change-Id: I6e7f62bf8a70d41adf146ca882ed895e10fd96ea
Reviewed-on: http://review.couchbase.org/84068
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Abhishek Singh <abhishek@couchbase.com>
Reviewed-by: Aman Kishore Achpal <aman.achpal@couchbase.com>

show more ...

c8c076c705-Oct-2017 Sriram Melkote <siri@couchbase.com>

MB-26279: Do not leak ArrayBuffer allocator

And retrigger buildbot...

Change-Id: I0bf921263475fe7413f2f04cdeca8a918473687b
Reviewed-on: http://review.couchbase.org/84061
Rev

MB-26279: Do not leak ArrayBuffer allocator

And retrigger buildbot...

Change-Id: I0bf921263475fe7413f2f04cdeca8a918473687b
Reviewed-on: http://review.couchbase.org/84061
Reviewed-by: Sriram Melkote <siri@couchbase.com>
Tested-by: Sriram Melkote <siri@couchbase.com>

show more ...

251b633e11-Sep-2017 Chris Hillery <ceej@couchbase.com>

CBD-2051: Update to V8 5.9 (required for eventing)

Change-Id: Ia6fa36f2ab9e3be32d569764851f8fdd5341ebb1
Reviewed-on: http://review.couchbase.org/83252
Reviewed-by: Chris Hillery <cee

CBD-2051: Update to V8 5.9 (required for eventing)

Change-Id: Ia6fa36f2ab9e3be32d569764851f8fdd5341ebb1
Reviewed-on: http://review.couchbase.org/83252
Reviewed-by: Chris Hillery <ceej@couchbase.com>
Tested-by: Chris Hillery <ceej@couchbase.com>

show more ...

Revision tags: v5.1.0
745729c422-Aug-2017 Dave Rigby <daver@couchbase.com>

MB-25509: Add couchstore_encode_periodic_sync_flags()

Add a helper function to the couchstore API to aid in encoding a byte
value for periodic sync to the correct flags encoding.

MB-25509: Add couchstore_encode_periodic_sync_flags()

Add a helper function to the couchstore API to aid in encoding a byte
value for periodic sync to the correct flags encoding.

Change-Id: I4f31d5d87db690a7ee24755df18beb7d8c481c3e
Reviewed-on: http://review.couchbase.org/82561
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Will Gardner <willg@rdner.io>

show more ...

59f431cf15-Aug-2017 Dave Rigby <daver@couchbase.com>

Add support for per-filehandle statistics

Add a new function to the couchstore public API -
couchstore_get_db_filestats(). This returns an optional FHStats
interface which callers ca

Add support for per-filehandle statistics

Add a new function to the couchstore public API -
couchstore_get_db_filestats(). This returns an optional FHStats
interface which callers can use to obtain statistics about the
underlying file handle.

The FHStats interface initially supports two methods:

- getReadCount() to return the number of read() calls on this handle.
- getWriteCount() to return the nubmer of write() calls.

These is needed by kv_engine as it wants to obtain statistics on a
per-file basis, as recorded by StatsOps (couch-fs-stats.h).

Note that the included FileOps implementations in couchstore to *not*
suppport this API currently; one would need to use ep-engine's StatOps
to make use of them. However it may be advantageous to move some of
the stats tracking directly into couchstore in future.

Change-Id: Ie1fff97dad9fd5a95e829ff61b91a6ec5f5a975b
Reviewed-on: http://review.couchbase.org/82316
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Manu Dhundi <manu@couchbase.com>
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>

show more ...

Revision tags: v5.0.0
ea89a54301-Aug-2017 Dave Rigby <daver@couchbase.com>

MB-25509: Add periodic sync()ing after N bytes written

Add the ability for couchstore to automatically issue sync()
operations after every N bytes written.

When writing large am

MB-25509: Add periodic sync()ing after N bytes written

Add the ability for couchstore to automatically issue sync()
operations after every N bytes written.

When writing large amounts of data (e.g during compaction), read
latency can be adversely affected if a single sync() is made at the
end of writing all the data; as the IO subsystem has a large amount
of outstanding writes to flush to disk. By issuing periodic syncs
the affect on read latency can be signifcantly reduced.

This functionality is disabld by default, but may be enabled by
specifying a new flag to couchstore_open_db():
COUCHSTORE_OPEN_WITH_PERIODIC_SYNC.

Encoded as a power-of-2 KB value, ranging from 1KB .. 1TB (5 bits). A
value of N=0 specifies that automatic fsync is disabled.

Change-Id: If63f52680f2d0cc650e49773e970920611b97cc2
Reviewed-on: http://review.couchbase.org/81694
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>
Tested-by: Build Bot <build@couchbase.com>

show more ...

b7f883ef01-Aug-2017 Dave Rigby <daver@couchbase.com>

Move Posix & Windows FileOps state into a struct

To allow additional state to be associated with an open File, move the
state from being a single fd / file handle to a struct.

S

Move Posix & Windows FileOps state into a struct

To allow additional state to be associated with an open File, move the
state from being a single fd / file handle to a struct.

Subsequent patches will expand the state stored in the File struct.

Change-Id: I42ced5d77279dbc005c9850f8f3102a0938db16b
Reviewed-on: http://review.couchbase.org/81691
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Sriram Ganesan <sriram@couchbase.com>
Reviewed-by: Trond Norbye <trond.norbye@gmail.com>

show more ...

5525660b07-Aug-2017 Dave Rigby <daver@couchbase.com>

dbdump: Add --map mode to print map of couchstore files

Add a new mode: --map which can print a visual representation of a
couchstore file, marking what type of data (Empty, Header, 3 di

dbdump: Add --map mode to print map of couchstore files

Add a new mode: --map which can print a visual representation of a
couchstore file, marking what type of data (Empty, Header, 3 different
B-Trees, Document) each block of the file contains.

Example output
--------------

$ couch_dbdump --map 0.couch.1
Dumping "0.couch.1":

0 ....................................................dddddddddddd
4096 dddddddddddddddddDDDDDdddddddddddddddddd..................tTTTTT
8192 tTTTTTt.................tTTTTTtTTTTt............................
12288 ................................................................
16384 .dddddddddddddddddddDDDDDddddddddddddddddddddddddddddTTTTTTTTTTT
20480 tTTTTTTTTtTtTTTTTtTTTTtTTTTtTt..................................
24576 .tTt............................................................
28672 hh

. Unoccupied
h h File header
t t B-Tree (by-sequence)
t t B-Tree (by-id)
t t B-Tree (local)
d d Document
lowercase: partial block occupied
Uppercase: whole block occupied.
Shaded background - historic (old) data.

This shows a couchstore file initially created with 100 keys, then 50
of those keys were re-written. Created with:

couch_create -k 100 --vbc 1 && couch_create -k 50 --vbc 1 -r

As show in the key, each block type has a different symbol. Capital
letters are used when the block is whole - i.e. every byte in that
block is of the given type. Lowercase letters are used when the block
is partial - i.e. the remaininder of the block is either empty of the
block is shared with some other type.

Note that --iterate-headers can be used with the --map mode, to walk
over previous headers and show old (historic) data. In that case the
old data is shaded gray.

Implementation
--------------

The map is built by instructing couchstore to traverse all trees and
read all documents, and then recording the ranges of the file which
are accessed. To do this a new FileOps subclass - TrackingFileOps is
created, which interposes between the underlying OS FileOps and
couchstore. All calls are passed onto the underlying OS, however in
the case of read() calls the offset and size of the read is recorded.
This allows a binary (read/not-read) map of the entire file to be
generated.

To track the different types of data accessed, a new (optional) method
to FileOpsInterface is added - tag(). This allows couchstore's file
access code to be modestly annotated to indicate when different types
of data (BTree, Document, etc) are about to be read. TrackingFileOps
implements this method which allows a simple state-machine to be built
up inside TrackingFileOps - what's the current datatype and B-Tree
type which subsequent reads correspond to.

Appendix: Color example output
------------------------------

Color view of the output; assuming the commit is viewed on an ANSI
terminal otherwise it'll just look garbage ;)

Dumping "0.couch.1":

0 ....................................................dddddddddddd
4096 dddddddddddddddddDDDDDdddddddddddddddddd..................tTTTTT
8192 tTTTTTt.................tTTTTTtTTTTt............................
12288 ................................................................
16384 .dddddddddddddddddddDDDDDddddddddddddddddddddddddddddTTTTTTTTTTT
20480 tTTTTTTTTtTtTTTTTtTTTTtTTTTtTt..................................
24576 .tTt............................................................
28672 hh

. Unoccupied
h h File header
t t B-Tree (by-sequence)
t t B-Tree (by-id)
t t B-Tree (local)
d d Document
lowercase: partial block occupied
Uppercase: whole block occupied.
Shaded background - historic (old) data.

Change-Id: Idec3729499049ee7e34ff3ba3f128595356618cd
Reviewed-on: http://review.couchbase.org/81997
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Will Gardner <willg@rdner.io>

show more ...

30b18fb008-Jun-2017 Jim Walker <jim@couchbase.com>

couch_create: A tool for generating ep-engine compatible couch files

Useful for pre-creating a test data set which you then warmup with.

Check usage() for help

Change-Id: I

couch_create: A tool for generating ep-engine compatible couch files

Useful for pre-creating a test data set which you then warmup with.

Check usage() for help

Change-Id: Icb54e034d953b0dbafcb3a335eb7b711e2e02d12
Reviewed-on: http://review.couchbase.org/79246
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>

show more ...

cc2e395621-Jun-2017 David Haikney <david.haikney@couchbase.com>

MB-24970: add --iterate-headers option to couch_dbdump

Change-Id: Icd1e4cc109f0f511b4882bfdf5016e755d0d95ef
Reviewed-on: http://review.couchbase.org/79814
Reviewed-by: Dave Rigby <da

MB-24970: add --iterate-headers option to couch_dbdump

Change-Id: Icd1e4cc109f0f511b4882bfdf5016e755d0d95ef
Reviewed-on: http://review.couchbase.org/79814
Reviewed-by: Dave Rigby <daver@couchbase.com>
Reviewed-by: Jung-Sang Ahn <jungsang.ahn@gmail.com>
Tested-by: Build Bot <build@couchbase.com>

show more ...

a5f077d923-Jun-2017 James Harrison <00jamesh@gmail.com>

Fix Valgrind error in dbck

exit() does not unwind the stack and call destructors on objects -
valgrind sees `options.src_filename` as memory which could have been
freed before the ex

Fix Valgrind error in dbck

exit() does not unwind the stack and call destructors on objects -
valgrind sees `options.src_filename` as memory which could have been
freed before the exit, and would have if the destructor were called.

Change-Id: I31fe785f005d06ad3baddcbb9de414bb863086fc
Reviewed-on: http://review.couchbase.org/79946
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: David Haikney <david.haikney@couchbase.com>

show more ...

1f5879fb14-Jun-2017 James Harrison <00jamesh@gmail.com>

Fix another memory leak in rewind_hook

Resolves the remaining leak reported by Ubuntu 16.04 (clang-3.9)
AddressSanitizer as identified in
http://cv.jenkins.couchbase.com/view/Commit%

Fix another memory leak in rewind_hook

Resolves the remaining leak reported by Ubuntu 16.04 (clang-3.9)
AddressSanitizer as identified in
http://cv.jenkins.couchbase.com/view/Commit%20Validation/view/couchstore/job/16.04-couchstore-addresssanitizer-master/24/

Change-Id: Ie505bf7b9c73078ac0e3da62d43d767ec7b021cf
Reviewed-on: http://review.couchbase.org/79482
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>

show more ...

50b449d508-Jun-2017 James Harrison <00jamesh@gmail.com>

Fix memory leak in compact_seq_fetchcb

LeakSanitizer reported a leak during CouchstoreInternalTest.couch_dbck.

This leak is identified when running AddressSanitizer on Ubuntu
16

Fix memory leak in compact_seq_fetchcb

LeakSanitizer reported a leak during CouchstoreInternalTest.couch_dbck.

This leak is identified when running AddressSanitizer on Ubuntu
16.04 (clang-3.9), but not on 12.04 (clang-3.6).

This is the third leak reported in
http://cv.jenkins.couchbase.com/view/Commit%20Validation/view/couchstore/job/16.04-couchstore-addresssanitizer-master/19/

Change-Id: I013fe6148b494a2859dbaffba51691f4d0769fbb
Reviewed-on: http://review.couchbase.org/79256
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>

show more ...

12345678910>>...22