Commit Graph

7527 Commits

Author SHA1 Message Date
48ed7792a5 Arrange so that startup connections are handled by main Worker
When the Worker mechanism has been initialized the current_worker_id
of the calling thread is set to 0. That way, connections can be created
after Worker::init() has been called, but before the workers have been
started. Such connections will be handled by the worker that is running
in the main thread.
2017-04-26 10:57:50 +03:00
5bf79637c6 Document the service users refresh interval
The interval between refreshes of the database users list wasn't
documented.
2017-04-26 09:47:59 +03:00
870027dffe MXS-1209: Cleaning up Master registration phase
Master registration phase is using new routines
2017-04-26 08:14:26 +02:00
4cdb7bc49b Use Semaphore multi-wait
The dcb_foreach_parallel now uses the correct method of the Semaphore
class.
2017-04-25 15:05:24 +03:00
c3df805b22 Make dcb_foreach thread-safe
The function was no longer thread-safe as it used the obsolete per-thread
spinlocks to iterate over the DCBs. Now the function uses the newly added
WorkerTask class to iterate over them.

Since the new WorkerTask mechanism is far superion to dcb_foreach, the
latter is now deprecated.
2017-04-25 15:04:42 +03:00
963ff0216d Allow serial execution of worker tasks
The Worker::execute_on_all_wait is intended to be used with dcb_foreach
which expects a single-threaded context for its function.
2017-04-25 15:04:42 +03:00
ea39b15bbb Add safety check and rename ref mgmt functions 2017-04-25 13:20:14 +03:00
55011c2951 Add safety check and rename ref mgmt functions 2017-04-25 13:10:01 +03:00
1eb409a666 Add possibility to wait several times on a semaphore 2017-04-25 13:10:01 +03:00
f1efe72f66 Additional documentation cleanup for 2.1
Mostly just reflow text (=linebreaks) for better diffs. Some small changes.
Remove Debug-And-Diagnostic-Support.md.
2017-04-25 10:04:31 +03:00
19cf8c489e Rename atomic store and load functions
The atomic store and load functions are now called atomic_store_X and
atomic_load_X where X is one of int32, int64 or uint64.
2017-04-24 16:11:34 +03:00
f91d415be1 Add simple test for atomic operations
The test runs some simple tests with the atomic operations in MaxScale.
2017-04-24 15:58:28 +03:00
122337569c Add atomic store and load operations
Added abstractions for storing and loading 32-bit and 64-bit values
atomically. The functions currently use the GCC __atomic builtin atomics.
2017-04-24 15:58:28 +03:00
8174690f77 Introduce concept of Worker tasks
A Worker::Task is an object that can be sent to a worker for
execution. The task is sent to the worker using the messaging
mechanism where the `execute` function of the task will be
called in the thread context of the worker.

There are two kinds of tasks; regular tasks and disposable tasks.
The former are just sent to the worker for execution while the
latter are sent and subsequently disposed of, once the task has
been executed.

A disposable task can be sent to either one worker or to all
workers. In the latter case, the task will be deleted once it
has been executed by all workers.

A semaphore can be associated with a regular task. Once the task
has been executed by the worker, the semaphore will automatically
be posted. That way, it is trivial to send a task for execution
to a worker and wait until the task has been executed. For instance:

    Semaphore sem;
    MyTask task;

    pWorker->execute(&task, &sem);
    sem.wait();

    const MyResult& result = task.result();

The low level mechanism for posting and broadcasting messages will
be removed.
2017-04-24 14:52:54 +03:00
172cdbc5a3 Update comment regarding use of level-triggered events 2017-04-24 10:51:45 +03:00
b0922576be Add Semaphore class
A simple Semaphore class that makes it simpler and less
erroprone to use a semaphore.
2017-04-23 18:54:18 +03:00
c5fd2bdb81 Add listening sockets to shared epoll instance
All sorts of additional cleaning up can now be performed.
2017-04-22 17:02:52 +03:00
56b411aea9 Add shared epoll instance to workers
All workers share an epoll instance that is added level-triggered
to the epoll instance of each Worker. This is intended to be used
together with listening sockets.

When a listening socket is added to the shared epoll instance the
effect is that EPOLLIN will be active for it whenever there is a
connection pending on a listening socket added to that epoll
instance.

When that occurs all workers in their epoll_wait()-calls will return.
When the workers subsequently call epoll_wait() on the shared epoll
instance, that will return with an event provided some other thread(s)
has not yet called accept() on the listening socket.

As each worker extracts just one event at a time and calls accept just
once before calling epoll_wait(), it means that the client connections
will be distributed evenly across all workers, provided the load on
the workers is roughly the same. If it isn't then a worker with less
load will get more connections to handle (which will even out the load).
2017-04-21 21:24:20 +03:00
a27bec5e88 Add return value to Worker::init()
Cleaner to return status than exit upon failure.
2017-04-21 19:57:45 +03:00
2cc3382a46 Add JDBC batch execution limitation to documentation
Readwritesplit doesn't properly handle batched statement execution in
2.1.3. This is now reflected by the limitations document.
2017-04-21 13:55:25 +03:00
d1959549fe Update limitations document
Add note about prepared statements, transaction state and
autocommit mode.
2017-04-21 12:31:21 +03:00
d7e37b94ce Add notes on MariaDB 10.2 2017-04-21 12:09:03 +03:00
defbb9e23b Update upgrade documentation and link to it 2017-04-21 11:27:16 +03:00
e8dfccb4c8 2.1 doc esak (#127)
* Update MySQL-Replication-Read-Write-Splitting-Tutorial.md

* Update MySQL-Replication-Read-Write-Splitting-Tutorial.md

* Update MySQL-Replication-Read-Write-Splitting-Tutorial.md

* Update MySQL-Cluster-Setup.md

* Update Administration-Tutorial.md

* Update Administration-Tutorial.md

* Update Galera-Cluster-Connection-Routing-Tutorial.md

* Update CLI.md

* Update ReadWriteSplit.md

* Update Tee-Filter.md

* Update CCRFilter.md

* Update RabbitMQ-Filter.md

* Update Debug-And-Diagnostic-Support.md

* Update MaxBinlogCheck.md

* Update Configuration-Guide.md

* Update Module-Commands.md
2017-04-21 10:49:20 +03:00
adb2cc1517 MXS-1209: blr_slave_query cleanup
New routine: blr_handle_admin_stmt() is in use
2017-04-20 15:48:26 +02:00
371598fc8f MXS-1209: blr_slave_query cleanup
Added blr_handle_admin_stmt()
2017-04-20 15:19:49 +02:00
73c38230fe Update README.md 2017-04-20 16:03:41 +03:00
008d86f99a Update 2.1 Change Log 2017-04-20 16:03:41 +03:00
0f7b29f8bf Add 2.1.3 release notes 2017-04-20 16:03:41 +03:00
09086994bf 2.1 doc johan (#126)
* Update Documentation-Contents.md

* Update SchemaRouter-technical.md

* Update Plugin-development-guide.md

* Update Replication-Proxy-Binlog-Router-Tutorial.md

* Update MaxScale-HA-with-lsyncd.md

* Update MaxScale-Information-Schema.md

* Update Galera-Cluster-Read-Write-Splitting-Tutorial.md

* Update GSSAPI-Authenticator.md
2017-04-20 14:59:52 +03:00
695ba19965 Massimiliano pinto doc update 2.1 (#125)
* Update Nagios-Plugins.md

* Update MM-Monitor.md

* Update Nagios-Plugins.md

* Update Nagios-Plugins.md

* Update Galera-Cluster-Connection-Routing-Tutorial.md

* Update Galera-Cluster-Connection-Routing-Tutorial.md

* Update RabbitMQ-Setup-And-MaxScale-Integration.md

* Update MaxScale-Tutorial.md

* Update Cache.md

* Update Transaction-Performance-Monitoring-Filter.md

* Update RabbitMQ-Consumer-Client.md

* Update Building-MaxScale-from-Source-Code.md

* Update MariaDB-MaxScale-Installation-Guide.md

* Update Install-MariaDB-MaxScale-Using-a-Tarball.md

* Update RabbitMQ-Setup-And-MaxScale-Integration.md

* Update RabbitMQ-Consumer-Client.md
2017-04-20 13:36:13 +02:00
b0bec7b9b8 Always read Avro headers from file
The headers were read from memory as if they were in compressed
format. This mistake was caused by the fact that the function names were
changed.
2017-04-20 14:22:55 +03:00
9a221c46f3 Process PS responses in readwritesplit
When a prepared statement preparation is being routed to the master, the
response is now collected into one buffer before being sent back. This
allows proper processing of pipelined prepared statements.
2017-04-20 14:22:55 +03:00
36d06960bf Combine query preparation into one function
The same operations of protocol state and inspections of the buffer were
done in multiple places. Combining these into one function removes the
duplicated code.
2017-04-20 14:22:55 +03:00
73dd9bd025 Allow collection of prepared statement responses
The backend MySQL protocol can now collect prepared statement preparation
responses as well as result sets. This removes the need to parse and
collect the preparation responses at the router level.
2017-04-20 14:22:55 +03:00
a88e98035f Clean up MySQL protocol debug logging
Removed pthread_self calls from the backend modules. This makes the debug
logging easier to parse when the messages aren't prefixed with the verbose
thread ID.
2017-04-20 14:22:55 +03:00
cf2272f479 Clean up DCB debug logging
All debug messages from dcb.cc were prefixed with the pthread ID of the
current thread. If the thread ID is needed, it should be logged by the log
manager.
2017-04-20 14:21:35 +03:00
8fe31f360d Remove multi-packet additions to response parsing
The additions to the packet parsing code weren't necessary once the
statement output change was reverted.
2017-04-20 14:18:40 +03:00
5037646846 Remove redundant flag value definitions
The response status flag values are already declared in the mysql_com.h
header.
2017-04-20 14:18:40 +03:00
673631084a MXS-1203: Fix response tracking of LOAD DATA LOCAL INFILE
When responses are being tracked, the execution of a LOAD DATA LOCAL
INFILE requires special handling. The readwritesplit now has a simple
state machine for the handling of the LOAD DATA LOCAL INFILE command. This
should also make the code a bit more readable.
2017-04-20 14:18:40 +03:00
ea38d511e3 MXS-1203: Process multiple results correctly with readwritesplit
The readwritesplit didn't correctly process the response packets that
contained more than one part of a multi-result response. By processing the
packets in a loop, this problem is avoided.

Removed some of the more "unique" ways of sending error messages in favor
of simply writing the error to the client DCB. This removes the need for
extra logic in the clientReply response handling.
2017-04-20 14:18:40 +03:00
d7258fffd0 MXS-1203: Improve resultset processing functions
The functions used to track the resultset EOF packets now expose the
position of the end of the result set. This allows the modules that use
them to check if more results exist in the same buffer.

Added the status bits for OK and EOF packets to the mysql.h protocol
header. This can be used to check for various state changes that happen in
the session. Currently the status bits are only used to detect if more
results are expected.
2017-04-20 14:18:40 +03:00
a1c7ee438d MXS-1203: Fix current command tracking with statement routing
When statement based routing was used, it was possible that the current
statement being executed wasn't properly updated. Readwritesplit requires
it to track whether a command will create a response.
2017-04-20 14:18:40 +03:00
6f468c573e MXS-1203: Fix readwritesplit routing decision logging
The info level logging could print binary data as if it were a
null-terminated string. Also cleaned up the function to make it a bit more
manageable.
2017-04-20 14:18:39 +03:00
66cf571412 MXS-1203: Better handling of batch queries
When batched queries are done through readwritesplit, it will now handle
them one by one. This allows batched queries to be used with
readwritesplit but it does impose a performance penalty when compared to
direct execution on the backend.
2017-04-20 14:18:39 +03:00
a8b42d24b7 Handle fake events when they are delivered
Since fake events are delivered via the event loop they can and
indeed should be processed immediately.
2017-04-20 13:51:16 +03:00
db3153ee4e Move statistics to Worker
Now the statistics is in a single structure and the property of the
Worker instance in question. Methods are provided for obtaining the
statistics of all workers in one go.
2017-04-20 13:51:16 +03:00
722d6da46f The thread state is now a property of the worker
A worker's state is not statistics, but transient information.
2017-04-20 13:51:16 +03:00
effa2f5674 poll_waitevents moved to Worker
A direct move without any non-essential modifications. Poll_waitevents will
be turned into a regular methods using instance variables.
2017-04-20 13:51:16 +03:00
4ed615a6c1 Cleanup of poll.cc
Unnecessary/unused functions, variable and headers removed.
2017-04-20 13:51:16 +03:00