Merge branch '2.2' into develop

This commit is contained in:
Markus Mäkelä 2018-07-03 21:13:41 +03:00
commit 44ef4912e8
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
41 changed files with 233 additions and 110032 deletions

View File

@ -9,7 +9,8 @@ if [ "$box_type" == "RPM" ] ; then
rm -rf $path_prefix/$platform/$platform_version/$arch/
mkdir -p $path_prefix/$platform/$platform_version/$arch/
cp -r ${unsorted_repo_dir}/$repo_name/$box/* $path_prefix/$platform/$platform_version/$arch/
chmod 775 $path_prefix/$platform/$platform_version/$arch
rsync -avz --progress --delete ${unsorted_repo_dir}/$repo_name/$box/* $path_prefix/$platform/$platform_version/$arch/
env > $build_info_path
cd $path_prefix/$platform
ln -s $platform_version "$platform_version"server
@ -27,7 +28,8 @@ else
rm -rf $path_prefix/$platform_family/dists/$platform_version/main/binary-"$arch"
rm -rf $path_prefix/$platform_family/dists/$platform_version/main/binary-i386
mkdir -p $path_prefix/$platform_family/
cp -r ${unsorted_repo_dir}/$repo_name/$box/* $path_prefix/$platform_family/
chmod 775 $path_prefix/$platform_family
rsync -avz --progress --delete ${unsorted_repo_dir}/$repo_name/$box/* $path_prefix/$platform_family/
env > $build_info_path
eval "cat <<EOF
$(<${script_dir}/templates/repository-config/deb.json.template)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +0,0 @@
# SchemaRouter Router - Technical Overview
This document is designed with a developer's point-of-view in mind. It explains the lifecycle of the module and details about its internal workings. It refers to the source code which can be found at [GitHub](https://github.com/mariadb-corporation/MaxScale).
## Source Files and Data Structures
The schemarouter router consists of the schemarouter.h header file located in the `server/modules/include/` directory and the schemarouter.c file located in the `server/modules/routing/schemarouter` directory. This router implements the router interface defined in the router.h file. The entry points and structures this router uses can be found in the header file. The two main structures in use are the router instance and router session structures. The router instance structure is defined in `struct router_instance` and the router session structure in `struct router_client_session`.
The definitions of the external functions and all the internal functions of the router can be found in the schemarouter.c file.
## Router Lifecycle
When MaxScale first starts, it creates all services and thus creates the router instances of all the routers. The functions involved in this stage are ModuleInit, which is called only once when MaxScale first starts, and createInstance, called for each individual instance of this router in all the configured services. These functions read configuration values and initialize internal data.
When a user connects to MaxScale, a new session is created and the newSession function is called. At this point the client session connects to all the backend servers and initializes the list of databases.
After the session is created queries are routed to the router's routeQuery function. This is where most of the work regarding the resolution of query destinations is done. This router parses the incoming buffers for full SQL packets first and routes each of them individually. The main internal functions involved in routing the query are get_shard_route_target (detects if a query needs to be sent to all the servers or to a specific one), get_shard_target_name (parses the query and finds the name of the right server) and route_session_write (handles sending and and storing session commands). After this point the client's query has been sent to the backend server and the router waits for either an response or an error signaling that the backend server is not responding.
If a response is received the clientReply function is called and response is simply sent to the client and the router is then ready for more queries. If there is no response from the server and the connection to it is lost the handleError function is called. This function tries to find replacement servers for the failed ones and regenerates the list of databases. This also triggers the sending of an error packet to the client that notifies that the server is not responding.
After the session ends the closeSession is called where the session is set to a closed state after which the freeSession is called where the final freeing of memory is done. After this point the router's session has gone through all the stages of its lifecycle.
![SchemaRouter Router Lifecycle](schemarouter-lifecycle.png)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,269 +0,0 @@
/*
* Copyright (c) 2013-2014 Minkyu Lee. All rights reserved.
*
* NOTICE: All information contained herein is, and remains the
* property of Minkyu Lee. The intellectual and technical concepts
* contained herein are proprietary to Minkyu Lee and may be covered
* by Republic of Korea and Foreign Patents, patents in process,
* and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Minkyu Lee (niklaus.lee@gmail.com).
*
*/
@ui-icon-url: url('../icons/icons-light.png');
@icon-width: 16px;
@icon-height: 16px;
._icon-base (@xpos, @ypos, @offset: 0px) {
background-image: @ui-icon-url !important;
background-repeat: no-repeat;
background-position: (@icon-width * @xpos * -1 + @offset) (@icon-height * @ypos * -1 + @offset);
width: @icon-width;
height: @icon-height;
background-clip: content-box;
}
// UML Icons
// Annotations & Etc.
._icon-Project { ._icon-base(5, 0); }
._icon-Tag { ._icon-base(13, 13); }
._icon-Lock { ._icon-base(0, 13); }
._icon-Rectangle { ._icon-base(6, 12); }
._icon-RoundedRectangle { ._icon-base(7, 12); }
._icon-Ellipse { ._icon-base(4, 11); }
._icon-UMLNote { ._icon-base(2, 0); }
._icon-UMLNoteLink { ._icon-base(3, 0); }
._icon-UMLText { ._icon-base(4, 0); }
._icon-UMLConstraint { ._icon-base(11, 3); }
// Diagrams
._icon-UMLClassDiagram { ._icon-base(7, 6); }
._icon-UMLObjectDiagram { ._icon-base(10, 6); }
._icon-UMLPackageDiagram { ._icon-base(12, 6); }
._icon-UMLUseCaseDiagram { ._icon-base(8, 6); }
._icon-UMLSequenceDiagram { ._icon-base(9, 6); }
._icon-UMLCommunicationDiagram { ._icon-base(11, 6); }
._icon-UMLStatechartDiagram { ._icon-base(13, 6); }
._icon-UMLActivityDiagram { ._icon-base(0, 7); }
._icon-UMLComponentDiagram { ._icon-base(1, 7); }
._icon-UMLDeploymentDiagram { ._icon-base(2, 7); }
._icon-UMLCompositeStructureDiagram { ._icon-base(11, 12); }
._icon-UMLProfileDiagram { ._icon-base(0, 10); }
// Backbone
._icon-UMLAttribute { ._icon-base(4, 3); }
._icon-UMLOperation { ._icon-base(8, 3); }
._icon-UMLParameter { ._icon-base(12, 3); }
._icon-UMLTemplateParameter { ._icon-base(13, 3); }
._icon-UMLFrame { ._icon-base(13, 11); }
// Packages
._icon-UMLPackage { ._icon-base(13, 0); }
._icon-UMLModel { ._icon-base(7, 0); }
._icon-UMLSubsystem { ._icon-base(10, 0); }
._icon-UMLProfile { ._icon-base(10, 0); }
// Classes
._icon-UMLClass { ._icon-base(2, 1); }
._icon-UMLInterface { ._icon-base(3, 1); }
._icon-UMLSignal { ._icon-base(5, 1); }
._icon-UMLDataType { ._icon-base(5, 3); }
._icon-UMLPrimitiveType { ._icon-base(6, 3); }
._icon-UMLEnumerationLiteral { ._icon-base(0, 4); }
._icon-UMLEnumeration { ._icon-base(4, 1); }
._icon-UMLStereotype { ._icon-base(2, 1); }
._icon-UMLDependency { ._icon-base(4, 5); }
._icon-UMLGeneralization { ._icon-base(7, 5); }
._icon-UMLInterfaceRealization { ._icon-base(6, 6); }
._icon-UMLComponentRealization { ._icon-base(6, 6); }
._icon-UMLAssociationEnd { ._icon-base(10, 5); }
._icon-UMLAssociation { ._icon-base(5, 5); }
._icon-UMLDirectedAssociation { ._icon-base(0, 11); }
._icon-UMLAggregation { ._icon-base(1, 11); }
._icon-UMLComposition { ._icon-base(2, 11); }
._icon-UMLAssociationClassLink { ._icon-base(6, 5); }
._icon-UMLContainment { ._icon-base(1, 13); }
// Instances
._icon-UMLSlot { ._icon-base(10, 13); }
._icon-UMLObject { ._icon-base(3, 5); }
._icon-UMLArtifactInstance { ._icon-base(2, 13); }
._icon-UMLComponentInstance { ._icon-base(8, 1); }
._icon-UMLNodeInstance { ._icon-base(10, 1); }
._icon-UMLLinkEnd { ._icon-base(10, 5); }
._icon-UMLLink { ._icon-base(8, 5); }
._icon-UMLDirectedLink { ._icon-base(11, 5); }
// Composite Structures
._icon-UMLPort { ._icon-base(5, 12); }
._icon-UMLPart { ._icon-base(4, 12); }
._icon-UMLConnectorEnd { ._icon-base(10, 5); }
._icon-UMLConnector { ._icon-base(10, 11); }
._icon-UMLSelfConnector { ._icon-base(11, 11); }
._icon-UMLCollaboration { ._icon-base(2, 2); }
._icon-UMLCollaborationUse { ._icon-base(3, 2); }
// Components
._icon-UMLArtifact { ._icon-base(8, 12); }
._icon-UMLComponent { ._icon-base(7, 1); }
// Deployments
._icon-UMLNode { ._icon-base(9, 1); }
._icon-UMLDeployment { ._icon-base(4, 5); } // Temporally ref to Dependency Icon
._icon-UMLCommunicationPath { ._icon-base(5, 5); }
// Use Cases
._icon-UMLExtensionPoint { ._icon-base(9, 12); }
._icon-UMLUseCase { ._icon-base(11, 1); }
._icon-UMLActor { ._icon-base(12, 1); }
._icon-UMLInclude { ._icon-base(4, 6); }
._icon-UMLExtend { ._icon-base(5, 6); }
._icon-UMLUseCaseSubject { ._icon-base(8, 11); }
// State Machines
._icon-UMLStateMachine { ._icon-base(0, 2); }
._icon-UMLRegion { ._icon-base(0, 1); }
._icon-UMLInitialState { ._icon-base(9, 2); }
._icon-UMLJunction { ._icon-base(11, 2); }
._icon-UMLChoice { ._icon-base(8, 2); }
._icon-UMLShallowHistory { ._icon-base(13, 2); }
._icon-UMLDeepHistory { ._icon-base(0, 3); }
._icon-UMLJoin { ._icon-base(10, 2); }
._icon-UMLFork { ._icon-base(11, 0); }
._icon-UMLEntryPoint { ._icon-base(12, 2); }
._icon-UMLExitPoint { ._icon-base(12, 11); }
._icon-UMLTerminate { ._icon-base(12, 0); }
._icon-UMLState { ._icon-base(1, 2); }
._icon-UMLOrthogonalState { ._icon-base(1, 1); }
._icon-UMLSubmachineState { ._icon-base(3, 3); }
._icon-UMLFinalState { ._icon-base(1, 3); }
._icon-UMLTransition { ._icon-base(1, 4); }
._icon-UMLSelfTransition { ._icon-base(2, 4); }
._icon-UMLEffect { ._icon-base(8, 4); }
._icon-UMLEntryActivity { ._icon-base(9, 4); }
._icon-UMLDoActivity { ._icon-base(10, 4); }
._icon-UMLExitActivity { ._icon-base(11, 4); }
._icon-UMLEvent { ._icon-base(12, 4); }
._icon-UMLOpaqueBehavior { ._icon-base(6, 1); }
._icon-UMLConnectionPointReference { ._icon-base(11, 13); }
// Activity Graphs
._icon-UMLActivity { ._icon-base(13, 1); }
._icon-UMLInputPin { ._icon-base(7, 2); }
._icon-UMLOutputPin { ._icon-base(7, 3); }
._icon-UMLAction { ._icon-base(6, 2); }
._icon-UMLObjectNode { ._icon-base(3, 12); }
._icon-UMLInitialNode { ._icon-base(9, 2); }
._icon-UMLActivityFinalNode { ._icon-base(1, 3); }
._icon-UMLFlowFinalNode { ._icon-base(12, 11); }
._icon-UMLForkNode { ._icon-base(11, 0); }
._icon-UMLJoinNode { ._icon-base(10, 2); }
._icon-UMLMergeNode { ._icon-base(8, 0); }
._icon-UMLDecisionNode { ._icon-base(9, 0); }
._icon-UMLControlFlow { ._icon-base(1, 4); }
._icon-UMLObjectFlow { ._icon-base(6, 0); }
._icon-UMLSwimlaneVert { ._icon-base(2, 3); }
._icon-UMLSwimlaneHorz { ._icon-base(7, 11); }
._icon-UMLSendSignal { ._icon-base(6, 11); }
._icon-UMLAcceptSignal { ._icon-base(5, 11); }
// Interactions
._icon-UMLLifeline { ._icon-base(2, 5); }
._icon-UMLInteraction { ._icon-base(4, 2); }
._icon-UMLStateInvariant { ._icon-base(8, 13); }
._icon-UMLContinuation { ._icon-base(9, 13); }
._icon-UMLInteractionOperand { ._icon-base(1, 12); }
._icon-UMLCombinedFragment { ._icon-base(9, 11); }
._icon-UMLInteractionUse { ._icon-base(5, 13); }
._icon-UMLEndpoint { ._icon-base(6, 13); }
._icon-UMLGate { ._icon-base(7, 13); }
._icon-UMLSelfLink { ._icon-base(9, 5); }
._icon-UMLMessage { ._icon-base(1, 6); }
._icon-UMLSelfMessage { ._icon-base(0, 6); }
._icon-UMLLostMessage { ._icon-base(3, 13); }
._icon-UMLFoundMessage { ._icon-base(4, 13); }
._icon-UMLForwardMessage { ._icon-base(12, 5); }
._icon-UMLReverseMessage { ._icon-base(13, 5); }
// Profiles
._icon-UMLProfile { ._icon-base(12, 13); }
._icon-UMLMetaClass { ._icon-base(12, 9); }
._icon-UMLImage { ._icon-base(0, 12); }
._icon-UMLStereotype { ._icon-base(13, 9); }
._icon-UMLExtension { ._icon-base(11, 9); }
// Robustness
._icon-UMLBoundary { ._icon-base(0, 9); }
._icon-UMLEntity { ._icon-base(1, 9); }
._icon-UMLControl { ._icon-base(2, 9); }
// ColorPicker Icons
.tool-icon-font-color { ._icon-base(0, 8); }
.tool-icon-line-color { ._icon-base(1, 8); }
.tool-icon-fill-color { ._icon-base(2, 8); }
// .tool-icon-font-color { ._icon-base(0, 8, 3px); }
// .tool-icon-line-color { ._icon-base(1, 8, 3px); }
// .tool-icon-fill-color { ._icon-base(2, 8, 3px); }
// Toolbar Icons
.tool-icon-select { ._icon-base(0, 0); }
.tool-icon-zoom-in { ._icon-base(7, 9); }
.tool-icon-zoom-out { ._icon-base(8, 9); }
.tool-icon-stereotype-display { ._icon-base(13, 10); }
.tool-icon-line-style { ._icon-base(3, 8); }
.tool-icon-auto-resize { ._icon-base(12, 10); }
.tool-icon-show-namespace { ._icon-base(7, 8); }
.tool-icon-show-properties { ._icon-base(3, 11); }
.tool-icon-suppress-attributes { ._icon-base(4, 8); }
.tool-icon-suppress-operations { ._icon-base(5, 8); }
.tool-icon-suppress-literals { ._icon-base(6, 8); }
.tool-icon-show-operation-signature { ._icon-base(8, 8); }
.tool-icon-show-compartment-visibility { ._icon-base(9, 8); }
.tool-icon-show-compartment-stereotype { ._icon-base(10, 8); }
.tool-icon-undo { ._icon-base(11, 7); }
.tool-icon-redo { ._icon-base(12, 7); }
.tool-icon-copy { ._icon-base(8, 7); }
.tool-icon-cut { ._icon-base(7, 7); }
.tool-icon-paste { ._icon-base(9, 7); }
.tool-icon-delete { ._icon-base(10, 7); }
.tool-icon-bringtofront { ._icon-base(11, 8); }
.tool-icon-sendtoback { ._icon-base(12, 8); }
.tool-icon-moveup { ._icon-base(1, 10); }
.tool-icon-movedown { ._icon-base(2, 10); }
.tool-icon-add { ._icon-base(3, 10); }
.tool-icon-delete { ._icon-base(4, 10); }
.tool-icon-edit { ._icon-base(5, 10); }
// Quick Dialog Icons
.quick-edit-icon-public { ._icon-base(8, 10); }
.quick-edit-icon-protected { ._icon-base(9, 10); }
.quick-edit-icon-private { ._icon-base(10, 10); }
.quick-edit-icon-package { ._icon-base(11, 10); }
.quick-edit-icon-attribute { ._icon-base(4, 3); }
.quick-edit-icon-operation { ._icon-base(8, 3); }
.quick-edit-icon-literal { ._icon-base(0, 4); }
.quick-edit-icon-moveup { ._icon-base(1, 10); }
.quick-edit-icon-movedown { ._icon-base(2, 10); }
.quick-edit-icon-add { ._icon-base(3, 10); }
.quick-edit-icon-delete { ._icon-base(4, 10); }
.quick-edit-icon-associate { ._icon-base(5, 5); }
.quick-edit-icon-shared { ._icon-base(1, 11); }
.quick-edit-icon-composite { ._icon-base(2, 11); }
.quick-edit-icon-navigable { ._icon-base(9, 12); }
.quick-edit-icon-notnavigable { ._icon-base(10, 12); }
.quick-edit-icon-select-type { ._icon-base(2, 6); }
.quick-edit-icon-create-type { ._icon-base(3, 6); }
.quick-edit-icon-select-operation { ._icon-base(9, 3); }
.quick-edit-icon-create-operation { ._icon-base(10, 3); }
.quick-edit-icon-select-signal { ._icon-base(0, 5); }
.quick-edit-icon-create-signal { ._icon-base(1, 5); }
// Others
.validation-error {
background: url(icons/warning.svg) no-repeat;
}
.validation-ok {
background: url(icons/okay.svg) no-repeat;
}

View File

@ -1,36 +0,0 @@
.bonsai,
.bonsai li {
margin: 0;
padding: 0;
list-style: none;
overflow: hidden;
}
.bonsai li {
position: relative;
padding-left: 1.3em; /* padding for the thumb */
}
li .thumb {
margin: -1px 0 0 -1em; /* negative margin into the padding of the li */
position: absolute;
cursor: pointer;
}
li.has-children > .thumb:after {
content: '▸';
}
li.has-children.expanded > .thumb:after {
content: '▾';
}
li.collapsed > ol.bonsai {
height: 0;
overflow: hidden;
}
.bonsai .all,
.bonsai .none {
cursor: pointer;
}

View File

@ -1,812 +0,0 @@
/* bootstrap.css override
---------------------------------------------------------*/
body {
margin: 0;
font-family: source-sans-pro, Helvetica, Arial, sans-serif !imporant;
font-size: 14px;
font-weight: 400;
color: #555;
background-color: #F8F8F8;
-webkit-font-smoothing: antialiased;
}
.module, .left-section {
overflow-y: auto;
height: calc(100vh - 95px);
}
a {
color: #137cd4;
}
a:focus {
outline: none;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 2px #6fb5f1;
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 2px #6fb5f1;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 2px #6fb5f1;
}
p {
margin-bottom: 20px;
}
code,
pre {
padding: 20px;
font-family: source-code-pro, Monaco, Menlo, Consolas, "Courier New", monospace;
font-size: 12px;
color: #454545;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
p code,
p pre,
li code,
li pre {
border-radius: 2px;
padding: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 10px 0 0;
font-weight: 300;
line-height: 20px;
color: #000;
text-rendering: optimizelegibility;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small {
color: #888;
}
h1,
h2,
h3 {
line-height: 1.3em;
}
h1 {
font-size: 40px;
font-weight: 400;
margin-top: 30px;
}
h2 {
font-size: 30px;
}
h3 {
font-size: 27px;
}
h4 {
font-size: 17.5px;
}
h5 {
font-size: 14px;
}
h6 {
font-size: 11.9px;
}
h1 small {
font-size: 24.5px;
}
dl {
margin-bottom: 0;
}
dt,
dd {
line-height: 20px;
}
dt {
color: #000;
font-weight: 400;
margin-bottom: 5px;
-webkit-font-smoothing: subpixel-antialiased; /* this makes it slightly bolder */
}
dd {
display: inline-block;
margin-bottom: 20px;
}
input,
button,
select,
textarea {
font-family: source-sans-pro, Helvetica, Arial, sans-serif;
}
table p {
margin-bottom: 0px;
}
.btn {
padding: 4px 12px;
margin-bottom: 0;
*margin-left: .3em;
font-size: 14px;
line-height: 20px;
color: #454545;
text-align: center;
text-shadow: none;
background-color: #e5e9e9;
*background-color: #e5e9e9;
background-image: none;
border: 1px solid #cdcdcd;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
.btn:hover,
.btn:focus,
.btn:active,
.btn.active,
.btn.disabled,
.btn[disabled] {
color: #454545;
background-color: #e5e9e9;
*background-color: #e5e9e9;
}
.btn:active,
.btn.active {
background-color: #d3d7d7;
}
.btn:first-child {
*margin-left: 0;
}
.btn:hover,
.btn:focus {
color: #454545;
text-decoration: none;
background-position: 0 -15px;
-webkit-transition: background-position 0.1s linear;
-moz-transition: background-position 0.1s linear;
-o-transition: background-position 0.1s linear;
transition: background-position 0.1s linear;
}
.btn:focus {
border: 1px solid #2893ef;
outline: 0;
outline: thin dotted \9;
/* IE6-9 */
-webkit-box-shadow: 0 0 0 1px #94ceff;
-moz-box-shadow: 0 0 0 1px #94ceff;
box-shadow: 0 0 0 1px #94ceff;
}
.btn.active,
.btn:active {
background-image: none;
outline: 0;
-webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.15);
-moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.15);
box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.15);
}
.btn.disabled,
.btn[disabled] {
cursor: default;
background-image: none;
opacity: 0.65;
filter: alpha(opacity=65);
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
.btn-large {
padding: 11px 19px;
font-size: 17.5px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
.btn-large [class^="icon-"],
.btn-large [class*=" icon-"] {
margin-top: 4px;
}
.btn-small {
padding: 2px 10px;
font-size: 11.9px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.btn-small [class^="icon-"],
.btn-small [class*=" icon-"] {
margin-top: 0;
}
.btn-mini [class^="icon-"],
.btn-mini [class*=" icon-"] {
margin-top: -1px;
}
.btn-mini {
padding: 0 6px;
font-size: 10.5px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.btn-block {
display: block;
width: 100%;
padding-right: 0;
padding-left: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.btn-block + .btn-block {
margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
width: 100%;
}
.btn-primary.active,
.btn-warning.active,
.btn-danger.active,
.btn-success.active,
.btn-info.active,
.btn-inverse.active {
color: rgba(255, 255, 255, 0.75);
}
.btn-primary {
color: #ffffff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #006dcc;
*background-color: #0044cc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
}
.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active,
.btn-primary.active,
.btn-primary.disabled,
.btn-primary[disabled] {
color: #ffffff;
background-color: #0044cc;
*background-color: #003bb3;
}
.btn-primary:active,
.btn-primary.active {
background-color: #003399 \9;
}
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
color: #454545;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
textarea:focus,
input[type="text"]:focus,
input[type="password"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="date"]:focus,
input[type="month"]:focus,
input[type="time"]:focus,
input[type="week"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="color"]:focus,
.uneditable-input:focus {
border-color: #2893ef;
outline: 0;
outline: thin dotted \9;
/* IE6-9 */
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 1px #94ceff;
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 1px #94ceff;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 1px #94ceff;
}
.nav > li > a:hover,
.nav > li > a:focus {
background-color: #e0f0fa;
border-radius: 3px;
color: #137cd4;
text-decoration: none;
}
.navbar .nav > li > a {
padding: 10px 15px 10px;
color: #000;
font-weight: 300;
text-shadow: none;
}
.nav-list {
margin-left: 15px;
}
.package-list.nav-list {
margin-left: 0;
}
.nav-list > li > a,
.nav-list .nav-header {
text-shadow: none;
}
.nav-header a,
.nav-header a:hover {
color: #000 !important;
}
.navbar .brand {
font-weight: 500;
color: #000;
text-shadow: none;
}
.navbar-inner {
min-height: 40px;
border: none;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.navbar-inverse .navbar-inner {
background-image: none;
background: #fff;
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06);
-moz-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06);
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06);
}
.navbar-inverse .brand,
.navbar-inverse .nav > li > a {
color: #000;
text-shadow: none;
}
.navbar-inverse .brand:hover,
.navbar-inverse .nav > li > a:hover,
.navbar-inverse .brand:focus,
.navbar-inverse .nav > li > a:focus {
color: #000;
}
.navbar-inverse .brand {
color: #000;
margin-left: -10px;
}
.navbar-inverse .navbar-text {
color: #454545;
}
.navbar-inverse .nav > li > a:focus,
.navbar-inverse .nav > li > a:hover {
color: #000;
background-color: transparent;
}
.navbar-inverse .nav .active > a,
.navbar-inverse .nav .active > a:hover,
.navbar-inverse .nav .active > a:focus {
color: #000;
background-color: transparent;
}
.navbar-inverse .navbar-link {
color: #000;
}
.navbar-inverse .navbar-link:hover,
.navbar-inverse .navbar-link:focus {
color: #000;
}
.nav-header {
padding: 3px 15px;
font-size: 11px;
font-weight: 400;
line-height: 20px;
color: #999999;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
text-transform: none;
letter-spacing: 1px;
}
.page-header {
padding-bottom: 0;
margin: 10px 0 40px;
border-bottom: 1px solid #d7d7d7;
}
.page-header h1 {
background: #F8F8F8;
display: inline-block;
position: relative;
bottom: -19px;
}
.alert {
padding: 4px 7px;
}
.alert-info {
color: #000;
background-color: #e0f0fa;
border-color: #d9eaf4;
border-radius: 3px;
font-size: 12px;
text-shadow: none;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
float: left;
margin-left: -15px;
}
.label,
badge {
padding: 4px 7px;
font-weight: 400;
color: #ffffff;
text-shadow: none;
}
.label-non-nullable,
.label-nullable,
.label-optional,
.label-info,
.badge-info {
background-color: #eee;
color: #222;
text-shadow: none;
}
.well {
padding: 19px 19px 0;
}
.table {
background-color: #fff;
}
/* non-bootstrap css
---------------------------------------------------------*/
[class^="icon-"]{
background: none;
}
body{
padding-left: 1.5em;
padding-right: 1.5em;
}
.number-of-modules {
font-size: 14px;
font-weight: 400;
line-height: 1.5em;
margin: 10px 0 0 15px;
}
#other-module{
display: none;
overflow: scroll;
}
#toggle-other-modules i{
font-size: 28px;
}
.nav-header{
}
#description {
font-size: 14px;
line-height: 22px;
}
section > h2,
section > h3{
font-size: 30px;
line-height: 30px;
margin-bottom: 10px;
margin-top: 25px;
text-indent: 2px;
}
.properties > h3 {
font-size: 20px;
line-height: 20px;
margin-bottom: 15px;
margin-top: 30px;
text-indent: 2px;
}
.methods > h3 {
font-size: 20px;
line-height: 20px;
margin-bottom: 15px;
margin-top: 30px;
text-indent: 2px;
}
h3 .checkbox{
display: inline-block;
font-weight: 300;
margin-left: 10px;
vertical-align: middle;
width: auto;
}
.element-list ul{
margin: 0;
padding: 0;
}
.element-list ul li {
display: inline-block;
padding: 3px 8px;
margin-bottom: 10px;
margin-right: 5px;
font-size: 14px;
line-height: 20px;
color: #454545;
text-align: center;
background-color: #e0f0fa;
*background-color: #e0f0fa;
border: 1px solid #d9eaf4;
background-image: none;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.element-list ul li a {
padding-top:0;
padding-bottom:0;
}
.element-list ul li a:hover {
background: transparent;
}
.member{
background: #fff;
color: #454545;
margin-bottom: 20px;
overflow: hidden; /* clearfix */
padding: 20px 17px;
border-radius: 4px;
border: 1px solid #dedede;
border-top: 1px solid #eee;
}
/*.member:last-of-type{*/
/*margin-bottom: 0;*/
/*}*/
.member h4{
border-bottom: 1px solid #e7e7e7;
font-weight: 400;
padding-bottom: 10px;
margin-top: -10px;
margin-bottom: 10px;
}
.member .code,
.member .code {
background: #f9f9f9;
border: 1px solid #eee;
border-top: 1px solid #e7e7e7;
display: none;
margin-top: 0;
margin-bottom: 0;
}
.member .example {
display: block;
margin-bottom: 15px;
position: relative;
}
.member .example:before {
color: #888;
content: 'Example';
font-style: italic;
position: absolute;
right: 10px;
top: 10px;
}
.member.private{
display: none;
background: #fff;
}
.show-private .member.private{
display: block;
}
.member .scope{
color: #888;
font-style: italic;
padding-bottom: 10px;
margin-top: -10px;
}
.member .anchor {
color: inherit;
visibility: hidden
}
.member .anchor:hover {
text-decoration: none;
}
.member .anchor:focus {
box-shadow: none;
}
.member .anchor .icon-link {
line-height: 24px;
}
.member:hover .anchor {
visibility: visible;
}
.deprecated {
background: #EBEBEB;
background-image: repeating-linear-gradient(135deg, transparent, transparent 35px, rgba(255,255,255,.5) 35px, rgba(255,255,255,.5) 70px);
}
.deprecated .label-deprecated {
margin-right: 10px;
}
.deprecated .scope {
text-decoration: line-through;
}
.show-code {
float: right;
}
/* Typeahead styles (Bootstrap conflicts) */
.twitter-typeahead .tt-query,
.twitter-typeahead .tt-hint {
margin-bottom: 0;
}
.tt-dropdown-menu {
min-width: 160px;
margin-top: 0;
padding: 5px 0;
background-color: #fff;
border: 1px solid #d7d7d7;
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12);
-moz-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12);
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.tt-suggestion {
display: block;
font-family: source-sans-pro, Helvetica, Arial, sans-serif;
font-size: 14px;
padding: 3px 10px;
}
.tt-suggestion.tt-is-under-cursor {
color: #000;
background-color: #e0f0fa;
background-image: none;
}
.tt-suggestion.tt-is-under-cursor a {
color: #fff;
}
.tt-suggestion p {
margin: 0;
}
.navbar-fixed-top .container {
margin: 5px;
width: auto;
}
span.twitter-typeahead {
float: right;
margin: 5px;
}
input.typeahead, input.tt-hint {
margin: 0;
}
input.tt-hint {
color: #999;
}
dl .label {
margin-bottom: 7px;
}
/* --------------- Appended ---------------- */
.node-icon {
width: 16px;
height: 16px;
display: inline-block;
}

View File

@ -1,97 +0,0 @@
/*
* Copyright (c) 2013-2014 Minkyu Lee. All rights reserved.
*
* NOTICE: All information contained herein is, and remains the
* property of Minkyu Lee. The intellectual and technical concepts
* contained herein are proprietary to Minkyu Lee and may be covered
* by Republic of Korea and Foreign Patents, patents in process,
* and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Minkyu Lee (niklaus.lee@gmail.com).
*
*/
// ----- Light Theme ----------------------------------------------------------
/*
// Icons
@ui-image-folder: "Default";
@ui-icon-url: url('icons/icons-light.png');
// Widget
@ui-widget-color: #e4e4e4;
@ui-widget-light-color: lighten(@ui-widget-color, 15%);
@ui-widget-dark-color: darken(@ui-widget-color, 15%);
@ui-widget-border-color: darken(@ui-widget-color, 20%);
@ui-widget-text-color: #454545;
@ui-widget-text-weight: 400;
// Widget Header
@ui-widget-header-color: darken(@ui-widget-color, 12%);
@ui-widget-header-light-color: lighten(@ui-widget-header-color, 10%);
@ui-widget-header-dark-color: darken(@ui-widget-header-color, 10%);
@ui-widget-header-border-color: @ui-widget-border-color;
@ui-widget-header-text-color: @ui-widget-text-color;
// Widget Content
@ui-widget-content-color: lighten(@ui-widget-color, 5%);
@ui-widget-content-light-color: lighten(@ui-widget-content-color, 2%);
@ui-widget-content-dark-color: darken(@ui-widget-content-color, 2%);
@ui-widget-content-border-color: darken(@ui-widget-content-color, 5%);
@ui-widget-content-hover-color: lighten(@ui-widget-content-color, 5%);
// Widget Active
@ui-widget-active-color: #0380e8;
@ui-widget-active-light-color: lighten(@ui-widget-active-color, 10%);
@ui-widget-active-dark-color: darken(@ui-widget-active-color, 10%);
@ui-widget-active-border-color: darken(@ui-widget-active-color, 20%);
// Context Menu
@ui-context-menu-background-color: #ffffff;
@ui-context-menu-text-color: @ui-widget-text-color;
@ui-context-menu-border-color: #ddd;
@ui-context-menu-hover-color: #d6f6ff;
*/
// ----- Dark Theme ----------------------------------------------------------
// Icons
@ui-image-folder: "Black";
@ui-icon-url: url('assets/icons/icons-light.png');
// Widget
@ui-widget-color: #3b3f41;
@ui-widget-light-color: lighten(@ui-widget-color, 3%);
@ui-widget-dark-color: darken(@ui-widget-color, 3%);
@ui-widget-border-color: darken(@ui-widget-color, 5%);
@ui-widget-text-color: #c7c7c7;
@ui-widget-text-weight: 400;
// Widget Header
@ui-widget-header-color: darken(@ui-widget-color, 4%);
@ui-widget-header-light-color: lighten(@ui-widget-header-color, 2%);
@ui-widget-header-dark-color: darken(@ui-widget-header-color, 2%);
@ui-widget-header-border-color: @ui-widget-border-color;
@ui-widget-header-text-color: @ui-widget-text-color;
// Widget Content
@ui-widget-content-color: lighten(@ui-widget-color, 2%);
@ui-widget-content-light-color: lighten(@ui-widget-content-color, 2%);
@ui-widget-content-dark-color: darken(@ui-widget-content-color, 2%);
@ui-widget-content-border-color: darken(@ui-widget-content-color, 3%);
@ui-widget-content-hover-color: lighten(@ui-widget-content-color, 3%);
// Widget Active
@ui-widget-active-color: #0079de;
@ui-widget-active-light-color: lighten(@ui-widget-active-color, 3%);
@ui-widget-active-dark-color: darken(@ui-widget-active-color, 3%);
@ui-widget-active-border-color: darken(@ui-widget-active-color, 5%);
// Context Menu
@ui-context-menu-background-color: @ui-widget-color;
@ui-context-menu-text-color: @ui-widget-text-color;
@ui-context-menu-border-color: @ui-widget-border-color;
@ui-context-menu-hover-color: lighten(@ui-context-menu-background-color, 5%);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,247 +0,0 @@
(function($){
$.fn.bonsai = function(options) {
var args = arguments;
return this.each(function() {
var bonsai = $(this).data('bonsai');
if (!bonsai) {
bonsai = new Bonsai(this, options);
$(this).data('bonsai', bonsai);
}
if (typeof options == 'string') {
var method = options;
bonsai[method].apply(bonsai, [].slice.call(args, 1));
}
});
};
$.bonsai = {};
$.bonsai.defaults = {
expandAll: false, // boolean expands all items
expand: null, // function to expand an item
collapse: null, // function to collapse an item
checkboxes: false, // requires jquery.qubit
// createCheckboxes: creates checkboxes for each list item.
//
// The name and value for the checkboxes can be declared in the
// markup using `data-name` and `data-value`.
//
// The name is inherited from parent items if not specified.
//
// Checked state can be indicated using `data-checked`.
createCheckboxes: false,
// handleDuplicateCheckboxes: adds onChange bindings to update
// any other checkboxes that have the same value.
handleDuplicateCheckboxes: false,
selectAllExclude: null
};
var Bonsai = function(el, options) {
var self = this;
options = options || {};
this.options = $.extend({}, $.bonsai.defaults, options);
this.el = $(el).addClass('bonsai').data('bonsai', this);
this.update();
if (this.isRootNode()) {
if (this.options.handleDuplicateCheckboxes) this.handleDuplicates();
if (this.options.checkboxes) this.el.qubit(this.options);
if (this.options.addExpandAll) this.addExpandAllLink();
if (this.options.addSelectAll) this.addSelectAllLink();
this.el.on('click', '.thumb', function(ev) {
self.toggle($(ev.currentTarget).closest('li'));
});
}
if (this.options.expandAll) this.expandAll();
};
Bonsai.prototype = {
isRootNode: function() {
return this.options.scope == this.el;
},
toggle: function(listItem) {
if (!$(listItem).hasClass('expanded')) {
this.expand(listItem);
}
else {
this.collapse(listItem);
}
},
expand: function(listItem) {
this.setExpanded(listItem, true);
},
collapse: function(listItem) {
this.setExpanded(listItem, false);
},
setExpanded: function(listItem, expanded) {
listItem = $(listItem);
if (listItem.length > 1) {
var self = this;
listItem.each(function() {
self.setExpanded(this, expanded);
});
return;
}
if (expanded) {
if (!listItem.data('subList')) return;
listItem = $(listItem).addClass('expanded')
.removeClass('collapsed');
$(listItem.data('subList')).css('height', 'auto');
}
else {
listItem = $(listItem).addClass('collapsed')
.removeClass('expanded');
$(listItem.data('subList')).height(0);
}
},
expandAll: function() {
this.expand(this.el.find('li'));
},
collapseAll: function() {
this.collapse(this.el.find('li'));
},
update: function() {
var self = this;
// store the scope in the options for child nodes
if (!this.options.scope) {
this.options.scope = this.el;
}
// look for a nested list (if any)
this.el.children().each(function() {
var item = $(this);
if (self.options.createCheckboxes) self.insertCheckbox(item);
// insert a thumb if it doesn't already exist
if (item.children().filter('.thumb').length == 0) {
var thumb = $('<div class="thumb"></div>');
item.prepend(thumb);
}
var subLists = item.children().filter('ol, ul');
item.toggleClass('has-children', subLists.find('li').length > 0);
// if there is a child list
subLists.each(function() {
// that's not empty
if ($('li', this).length == 0) {
return;
}
// then this el has children
item.data('subList', this);
// collapse the nested list
if (item.hasClass('expanded')) {
self.expand(item);
}
else {
self.collapse(item);
}
// handle any deeper nested lists
var exists = !!$(this).data('bonsai');
$(this).bonsai(exists ? 'update' : self.options);
});
});
this.expand = this.options.expand || this.expand;
this.collapse = this.options.collapse || this.collapse;
},
insertCheckbox: function(listItem) {
if (listItem.find('> input[type=checkbox]').length) return;
var id = this.generateId(listItem),
checkbox = $('<input type="checkbox" name="'
+ this.getCheckboxName(listItem) + '" id="' + id + '" /> '
),
children = listItem.children(),
// get the first text node for the label
text = listItem.contents().filter(function() {
return this.nodeType == 3;
}).first();
checkbox.val(listItem.data('value'));
checkbox.prop('checked', listItem.data('checked'))
children.remove();
listItem.append(checkbox)
.append(
$('<label for="' + id + '">').append(text ? text : children.first())
)
.append(text ? children : children.slice(1));
},
handleDuplicates: function() {
var self = this;
self.el.on('change', 'input[type=checkbox]', function(ev) {
var checkbox = $(ev.target);
if (!checkbox.val()) return;
// select all duplicate checkboxes that need to be updated
var selector = 'input[type=checkbox]'
+ '[value="' + checkbox.val() + '"]'
+ '[name="' + checkbox.attr('name') + '"]'
+ (checkbox.prop('checked') ? ':not(:checked)' : ':checked');
self.el.find(selector).prop({
checked: checkbox.prop('checked'),
indeterminate: checkbox.prop('indeterminate')
}).trigger('change');
});
},
idPrefix: 'checkbox-',
generateId: function(listItem) {
do {
var id = this.idPrefix + Bonsai.uniqueId++;
}
while($('#' + id).length > 0);
return id;
},
getCheckboxName: function(listItem) {
return listItem.data('name')
|| listItem.parents().filter('[data-name]').data('name');
},
addExpandAllLink: function() {
var self = this;
$('<div class="expand-all">')
.append($('<a class="all">Expand all</a>')
.on('click', function() {
self.expandAll();
})
)
.append('<i class="separator"></i>')
.append($('<a class="none">Collapse all</a>')
.on('click', function() {
self.collapseAll();
})
)
.insertBefore(this.el);
},
addSelectAllLink: function() {
var scope = this.options.scope,
self = this;
function getCheckboxes() {
// return all checkboxes that are not in hidden list items
return scope.find('li')
.filter(self.options.selectAllExclude || function() {
return $(this).css('display') != 'none';
})
.find('> input[type=checkbox]');
}
$('<div class="check-all">')
.append($('<a class="all">Select all</a>')
.css('cursor', 'pointer')
.on('click', function() {
getCheckboxes().prop({
checked: true,
indeterminate: false
});
})
)
.append('<i class="separator"></i>')
.append($('<a class="none">Select none</a>')
.css('cursor', 'pointer')
.on('click', function() {
getCheckboxes().prop({
checked: false,
indeterminate: false
});
})
)
.insertAfter(this.el);
},
setCheckedValues: function(values) {
var all = this.options.scope.find('input[type=checkbox]');
$.each(values, function(key, value) {
all.filter('[value="' + value + '"]')
.prop('checked', true)
.trigger('change');
});
}
};
$.extend(Bonsai, {
uniqueId: 0
});
}(jQuery));

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

View File

@ -3,14 +3,22 @@
This filter was introduced in MariaDB MaxScale 2.1.
## Overview
_Note that the cache is still experimental and that non-backward compatible
changes may be made._
From MaxScale version 2.2.11 onwards, the cache filter is no longer
considered experimental. The following changes to the default behaviour
have also been made:
* The default value of `cached_data` is now `thread_specific` (used to be
`shared`).
* The default value of `selects` is now `assume_cacheable` (used to be
`verify_cacheable`).
The cache filter is a simple cache that is capable of caching the result of
SELECTs, so that subsequent identical SELECTs are served directly by MaxScale,
without the queries being routed to any server.
By _default_ the cache will be used and populated in the following circumstances:
* There is _no_ explicit transaction active, that is, _autocommit_ is used,
* there is an _explicitly_ read-only transaction (that is,`START TRANSACTION
READ ONLY`) active, or
@ -29,24 +37,9 @@ the isolation level of the backends actually is.
The default behaviour can be altered using the configuration parameter
[cache_inside_transactions](#cache_inside_transactions).
By default, it is *ensured* that the cache is **not** used in the following
circumstances:
* The `SELECT` uses any of the following functions: `BENCHMARK`,
`CONNECTION_ID`, `CONVERT_TZ`, `CURDATE`, `CURRENT_DATE`, `CURRENT_TIMESTAMP`,
`CURTIME`, `DATABASE`, `ENCRYPT`, `FOUND_ROWS`, `GET_LOCK`, `IS_FREE_LOCK`,
`IS_USED_LOCK`, `LAST_INSERT_ID`, `LOAD_FILE`, `LOCALTIME`, `LOCALTIMESTAMP`,
`MASTER_POS_WAIT`, `NOW`, `RAND`, `RELEASE_LOCK`, `SESSION_USER`, `SLEEP`,
`SYSDATE`, `SYSTEM_USER`, `UNIX_TIMESTAMP`, `USER`, `UUID`, `UUID_SHORT`.
* The `SELECT` accesses any of the following fields: `CURRENT_DATE`,
`CURRENT_TIMESTAMP`, `LOCALTIME`, `LOCALTIMESTAMP`
* The `SELECT` uses system or user variables.
In order to ensure that, all `SELECT` statements have to be parsed, which
carries a _significant_ performance cost. If it is known that there are no
such statements or that it does not matter even if they are cached, that
safety measure can be turned off. Please read [performance](#performance)
for more details.
By default it is assumed that all `SELECT` statements are cacheable, which
means that also statements like `SELECT LOCALTIME` are cached. Please check
[selects](#selects) for how to change the default behaviour.
## Limitations
@ -229,11 +222,11 @@ allowed values are:
multiple times.
```
cached_data=thread_specific
cached_data=shared
```
Default is `shared`. See `max_count` and `max_size` what implication changing
this setting to `thread_specific` has.
Default is `thread_specific`. See `max_count` and `max_size` what implication
changing this setting to `shared` has.
#### `selects`
@ -246,17 +239,33 @@ respect to `SELECT` statements. The allowed values are:
statements are cacheable, but must verify that.
```
selects=assume_cacheable
selects=verify_cacheable
```
Default is `verify_cacheable`. In this case, the `SELECT` statements will be
Default is `assume_cacheable`. In this case, all `SELECT` statements are
assumed to be cacheable and will be parsed *only* if some specific rule
requires that.
If `verify_cacheable` is specified, then all `SELECT` statements will be
parsed and only those that are safe for caching - e.g. do *not* call any
non-cacheable functions or access any non-cacheable variables - will be
subject to caching.
If `assume_cacheable` is specified, then all `SELECT` statements are
assumed to be cacheable and will be parsed *only* if some specific rule
requires that.
If `verify_cacheable` has been specified, the cache will not be used in
the following circumstances:
* The `SELECT` uses any of the following functions: `BENCHMARK`,
`CONNECTION_ID`, `CONVERT_TZ`, `CURDATE`, `CURRENT_DATE`, `CURRENT_TIMESTAMP`,
`CURTIME`, `DATABASE`, `ENCRYPT`, `FOUND_ROWS`, `GET_LOCK`, `IS_FREE_LOCK`,
`IS_USED_LOCK`, `LAST_INSERT_ID`, `LOAD_FILE`, `LOCALTIME`, `LOCALTIMESTAMP`,
`MASTER_POS_WAIT`, `NOW`, `RAND`, `RELEASE_LOCK`, `SESSION_USER`, `SLEEP`,
`SYSDATE`, `SYSTEM_USER`, `UNIX_TIMESTAMP`, `USER`, `UUID`, `UUID_SHORT`.
* The `SELECT` accesses any of the following fields: `CURRENT_DATE`,
`CURRENT_TIMESTAMP`, `LOCALTIME`, `LOCALTIMESTAMP`
* The `SELECT` uses system or user variables.
Note that parsing all `SELECT` statements carries a _significant_ performance
cost. Please read [performance](#performance) for more details.
#### `cache_inside_transactions`
@ -545,6 +554,7 @@ Each entry in the `store` array is an object containing three fields,
```
where,
* the _attribute_ can be `database`, `table`, `column` or `query`,
* the _op_ can be `=`, `!=`, `like` or `unlike`, and
* the _value_ a string.
@ -712,6 +722,7 @@ Each entry in the `use` array is an object containing three fields,
```
where,
* the _attribute_ can be `user`,
* the _op_ can be `=`, `!=`, `like` or `unlike`, and
* the _value_ a string.
@ -1020,7 +1031,8 @@ rule like
```
The exact match rule requires all statements to be parsed.
Note that the qps figures are only indicative.
Note that the qps figures are only indicative and that the difference under
high load may be significantly _greater_.
| `selects` | Rule | qps |
| -------------------| ---------------|-----|
@ -1034,9 +1046,9 @@ Note that the qps figures are only indicative.
## Summary
For maximum performance:
* Arrange the situation so that `selects=assume_cacheable` can be
configured, and use _no_ rules.
* If `selects=assume_cacheable` has been configured, use _only_
regexp based rules.
* If `selects=verify_cacheable` has been configured non-regex based
* Arrange the situation so that the default `selects=assume_cacheable`
can be used, and use _no_ rules.
* If `selects=assume_cacheable` is used, use _only_ regexp based rules.
* If `selects=verify_cacheable` has been configured, non-regex based
matching can be used.

View File

@ -0,0 +1,44 @@
# MariaDB MaxScale 2.2.11 Release Notes -- 2018-06
Release 2.2.11 is a GA release.
This document describes the changes in release 2.2.11, when compared to
release 2.2.10.
For any problems you encounter, please consider submitting a bug
report at [Jira](https://jira.mariadb.org).
## Changed Features
### Cache
The cache filter is no longer marked as being experimental. The default
value for `cached_data` been changed from `shared` to `thread_specific`,
and the default value for `selects` has been changed from `verify_cacheable`
to `assume_cacheable`.
Please consult the
[cache documentation](../Filters/Cache.md)
for details.
## Bug fixes
## Known Issues and Limitations
There are some limitations and known issues within this version of MaxScale.
For more information, please refer to the [Limitations](../About/Limitations.md) document.
## Packaging
RPM and Debian packages are provided for the Linux distributions supported
by MariaDB Enterprise.
Packages can be downloaded [here](https://mariadb.com/downloads/mariadb-tx/maxscale).
## Source Code
The source code of MaxScale is tagged at GitHub with a tag, which is identical
with the version of MaxScale. For instance, the tag of version X.Y.Z of MaxScale
is X.Y.Z. Further, *master* always refers to the latest released non-beta version.
The source code is available [here](https://github.com/mariadb-corporation/MaxScale).

View File

@ -5,7 +5,7 @@
set(MAXSCALE_VERSION_MAJOR "2" CACHE STRING "Major version")
set(MAXSCALE_VERSION_MINOR "2" CACHE STRING "Minor version")
set(MAXSCALE_VERSION_PATCH "10" CACHE STRING "Patch version")
set(MAXSCALE_VERSION_PATCH "11" CACHE STRING "Patch version")
# This should only be incremented if a package is rebuilt
set(MAXSCALE_BUILD_NUMBER 1 CACHE STRING "Release number")

View File

@ -387,13 +387,15 @@ function getTable(headobj) {
function pingCluster(hosts) {
var promises = []
hosts.forEach(function(i) {
args = {}
args.uri = getUri(i, this.argv.secure, '')
args.json = true
setTlsCerts(args)
promises.push(request(args))
})
if (hosts.length > 1 ) {
hosts.forEach(function(i) {
args = {}
args.uri = getUri(i, this.argv.secure, '')
args.json = true
setTlsCerts(args)
promises.push(request(args))
})
}
return Promise.all(promises)
}

View File

@ -2,39 +2,39 @@
mysql -u root --force $1 <<EOF >& /dev/null
DROP USER '$node_user'@'%';
DROP USER IF EXISTS '$node_user'@'%';
CREATE USER '$node_user'@'%' IDENTIFIED BY '$node_password';
GRANT ALL PRIVILEGES ON *.* TO '$node_user'@'%' WITH GRANT OPTION;
DROP USER 'repl'@'%';
DROP USER IF EXISTS 'repl'@'%';
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT ALL ON *.* TO 'repl'@'%' WITH GRANT OPTION;
DROP USER 'repl'@'localhost';
DROP USER IF EXISTS 'repl'@'localhost';
CREATE USER 'repl'@'localhost' IDENTIFIED BY 'repl';
GRANT ALL ON *.* TO 'repl'@'localhost' WITH GRANT OPTION;
DROP USER 'skysql'@'%';
DROP USER IF EXISTS 'skysql'@'%';
CREATE USER 'skysql'@'%' IDENTIFIED BY 'skysql';
GRANT ALL ON *.* TO 'skysql'@'%' WITH GRANT OPTION;
DROP USER 'skysql'@'localhost';
DROP USER IF EXISTS 'skysql'@'localhost';
CREATE USER 'skysql'@'localhost' IDENTIFIED BY 'skysql';
GRANT ALL ON *.* TO 'skysql'@'localhost' WITH GRANT OPTION;
DROP USER 'maxskysql'@'%';
DROP USER IF EXISTS 'maxskysql'@'%';
CREATE USER 'maxskysql'@'%' IDENTIFIED BY 'skysql';
GRANT ALL ON *.* TO 'maxskysql'@'%' WITH GRANT OPTION;
DROP USER 'maxskysql'@'localhost';
DROP USER IF EXISTS 'maxskysql'@'localhost';
CREATE USER 'maxskysql'@'localhost' IDENTIFIED BY 'skysql';
GRANT ALL ON *.* TO 'maxskysql'@'localhost' WITH GRANT OPTION;
DROP USER 'maxuser'@'%';
DROP USER IF EXISTS 'maxuser'@'%';
CREATE USER 'maxuser'@'%' IDENTIFIED BY 'maxpwd';
GRANT ALL ON *.* TO 'maxuser'@'%' WITH GRANT OPTION;
DROP USER 'maxuser'@'localhost';
DROP USER IF EXISTS 'maxuser'@'localhost';
CREATE USER 'maxuser'@'localhost' IDENTIFIED BY 'maxpwd';
GRANT ALL ON *.* TO 'maxuser'@'localhost' WITH GRANT OPTION;

View File

@ -15,35 +15,35 @@ mysql -u root --force <<EOF
DELETE FROM mysql.user WHERE user = '';
DROP USER '$galera_user'@'%';
DROP USER IF EXISTS '$galera_user'@'%';
CREATE USER '$galera_user'@'%' IDENTIFIED BY '$galera_password';
GRANT ALL PRIVILEGES ON *.* TO '$galera_user'@'%' WITH GRANT OPTION;
DROP USER 'maxskysql'@'%';
DROP USER IF EXISTS 'maxskysql'@'%';
CREATE USER 'maxskysql'@'%' IDENTIFIED BY 'skysql';
GRANT ALL PRIVILEGES ON *.* TO 'maxskysql'@'%' WITH GRANT OPTION;
DROP USER 'maxskysql'@'localhost';
DROP USER IF EXISTS 'maxskysql'@'localhost';
CREATE USER 'maxskysql'@'localhost' IDENTIFIED BY 'skysql';
GRANT ALL ON *.* TO 'maxskysql'@'localhost' WITH GRANT OPTION;
DROP USER 'repl'@'%';
DROP USER IF EXISTS 'repl'@'%';
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT ALL PRIVILEGES ON *.* TO 'repl'@'%' WITH GRANT OPTION;
DROP USER 'skysql'@'%';
DROP USER IF EXISTS 'skysql'@'%';
CREATE USER 'skysql'@'%' IDENTIFIED BY 'skysql';
GRANT ALL PRIVILEGES ON *.* TO 'skysql'@'%' WITH GRANT OPTION;
DROP USER 'skysql'@'localhost';
DROP USER IF EXISTS 'skysql'@'localhost';
CREATE USER 'skysql'@'localhost' IDENTIFIED BY 'skysql';
GRANT ALL PRIVILEGES ON *.* TO 'skysql'@'localhost' WITH GRANT OPTION;
DROP USER 'maxuser'@'%';
DROP USER IF EXISTS 'maxuser'@'%';
CREATE USER 'maxuser'@'%' IDENTIFIED BY 'maxpwd';
GRANT ALL ON *.* TO 'maxuser'@'%' WITH GRANT OPTION;
DROP USER 'maxuser'@'localhost';
DROP USER IF EXISTS 'maxuser'@'localhost';
CREATE USER 'maxuser'@'localhost' IDENTIFIED BY 'maxpwd';
GRANT ALL ON *.* TO 'maxuser'@'localhost' WITH GRANT OPTION;

View File

@ -1,6 +1,7 @@
#include "nodes.h"
#include <string>
#include <cstring>
#include <iostream>
Nodes::Nodes()
{
@ -9,8 +10,6 @@ Nodes::Nodes()
int Nodes::check_node_ssh(int node)
{
int res = 0;
printf("Checking node %d\n", node);
fflush(stdout);
if (ssh_node(node, (char *) "ls > /dev/null", false) != 0)
{
@ -20,7 +19,6 @@ int Nodes::check_node_ssh(int node)
}
else
{
printf("Node %d is OK\n", node);
fflush(stdout);
}
return res;
@ -28,12 +26,17 @@ int Nodes::check_node_ssh(int node)
int Nodes::check_nodes()
{
int res = 0;
std::cout << "Checking nodes..." << std::endl;
for (int i = 0; i < N; i++)
{
res += check_node_ssh(i);
if (check_node_ssh(i) != 0)
{
return 1;
}
}
return res;
return 0;
}
void Nodes::generate_ssh_cmd(char *cmd, int node, const char *ssh, bool sudo)

View File

@ -87,6 +87,7 @@ gwbuf_alloc(unsigned int size)
rval->hint = NULL;
rval->properties = NULL;
rval->gwbuf_type = GWBUF_TYPE_UNDEFINED;
rval->server = NULL;
CHK_GWBUF(rval);
retblock:
if (rval == NULL)
@ -303,6 +304,7 @@ gwbuf_clone_one(GWBUF *buf)
}
atomic_add(&buf->sbuf->refcount, 1);
rval->server = buf->server;
rval->sbuf = buf->sbuf;
rval->start = buf->start;
rval->end = buf->end;
@ -384,6 +386,7 @@ static GWBUF *gwbuf_clone_portion(GWBUF *buf,
return NULL;
}
atomic_add(&buf->sbuf->refcount, 1);
clonebuf->server = buf->server;
clonebuf->sbuf = buf->sbuf;
clonebuf->gwbuf_type = buf->gwbuf_type; /*< clone info bits too */
clonebuf->start = (void *)((char*)buf->start + start_offset);

View File

@ -3588,23 +3588,30 @@ int poll_add_dcb(DCB *dcb)
events = EPOLLIN;
new_state = DCB_STATE_LISTENING;
}
else if (dcb->dcb_role == DCB_ROLE_CLIENT_HANDLER &&
(strcasecmp(dcb->service->routerModule, "cli") == 0 ||
strcasecmp(dcb->service->routerModule, "maxinfo") == 0))
else if (dcb->dcb_role == DCB_ROLE_CLIENT_HANDLER)
{
// If the DCB refers to an accepted maxadmin/maxinfo socket, we force it
// to the main thread. That's done in order to prevent a deadlock
// that may happen if there are multiple concurrent administrative calls,
// handled by different worker threads.
// See: https://jira.mariadb.org/browse/MXS-1805 and https://jira.mariadb.org/browse/MXS-1833
if (strcasecmp(dcb->service->routerModule, "cli") == 0 ||
strcasecmp(dcb->service->routerModule, "maxinfo") == 0)
{
// If the DCB refers to an accepted maxadmin/maxinfo socket, we force it
// to the main thread. That's done in order to prevent a deadlock
// that may happen if there are multiple concurrent administrative calls,
// handled by different worker threads.
// See: https://jira.mariadb.org/browse/MXS-1805 and https://jira.mariadb.org/browse/MXS-1833
owner = RoutingWorker::get(RoutingWorker::MAIN);
}
else
{
// Round-robin the client connection worker assignment
owner = RoutingWorker::pick_worker();
}
new_state = DCB_STATE_POLLING;
owner = RoutingWorker::get(RoutingWorker::MAIN);
dcb->poll.owner = owner;
}
else
{
ss_dassert(dcb->dcb_role == DCB_ROLE_CLIENT_HANDLER ||
dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER);
ss_dassert(dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER);
ss_dassert(RoutingWorker::get_current_id() != -1);
ss_dassert(RoutingWorker::get_current() == dcb->poll.owner);

View File

@ -271,6 +271,13 @@ public:
*/
static int64_t get_one_statistic(POLL_STAT what);
/**
* Get next worker
*
* @return The worker where work should be assigned
*/
static RoutingWorker* pick_worker();
private:
const int m_id; /*< The id of the worker. */
SessionsById m_sessions; /*< A mapping of session_id->MXS_SESSION. The map

View File

@ -1014,3 +1014,11 @@ json_t* mxs_rworker_list_to_json(const char* host)
RoutingWorker::execute_concurrently(task);
return task.resource();
}
// static
RoutingWorker* RoutingWorker::pick_worker()
{
static int id_generator = 0;
int id = this_unit.id_min_worker + (atomic_add(&id_generator, 1) % this_unit.nWorkers);
return get(id);
}

View File

@ -311,17 +311,25 @@ mysql_auth_authenticate(DCB *dcb)
}
else if (dcb->service->log_auth_warnings)
{
// Enough to hold the error message and the database name
char extra[256] = {};
if (auth_ret == MXS_AUTH_FAILED_DB)
{
snprintf(extra, sizeof(extra), "Unknown database: %s", client_data->db);
}
if (dcb->path)
{
MXS_LOG_EVENT(maxscale::event::AUTHENTICATION_FAILURE,
"%s: login attempt for user '%s'@[%s]:%s, authentication failed.",
dcb->service->name, client_data->user, dcb->remote, dcb->path);
"%s: login attempt for user '%s'@[%s]:%s, authentication failed. %s",
dcb->service->name, client_data->user, dcb->remote, dcb->path, extra);
}
else
{
MXS_LOG_EVENT(maxscale::event::AUTHENTICATION_FAILURE,
"%s: login attempt for user '%s'@[%s]:%d, authentication failed.",
dcb->service->name, client_data->user, dcb->remote, dcb_get_port(dcb));
"%s: login attempt for user '%s'@[%s]:%d, authentication failed. %s",
dcb->service->name, client_data->user, dcb->remote, dcb_get_port(dcb), extra);
}
if (is_localhost_address(&dcb->ip) &&

View File

@ -53,8 +53,8 @@ void cache_config_finish(CACHE_CONFIG& config)
config.hard_ttl = 0;
config.soft_ttl = 0;
config.debug = 0;
config.thread_model = CACHE_THREAD_MODEL_MT;
config.selects = CACHE_SELECTS_VERIFY_CACHEABLE;
config.thread_model = CACHE_DEFAULT_THREAD_MODEL;
config.selects = CACHE_DEFAULT_SELECTS;
}
/**
@ -79,6 +79,9 @@ void cache_config_free(CACHE_CONFIG* pConfig)
void cache_config_reset(CACHE_CONFIG& config)
{
memset(&config, 0, sizeof(config));
config.thread_model = CACHE_DEFAULT_THREAD_MODEL;
config.selects = CACHE_DEFAULT_SELECTS;
}
/**
@ -163,7 +166,7 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
static MXS_MODULE info =
{
MXS_MODULE_API_FILTER,
MXS_MODULE_IN_DEVELOPMENT,
MXS_MODULE_GA,
MXS_FILTER_VERSION,
"A caching filter that is capable of caching and returning cached data.",
VERSION_STRING,
@ -177,7 +180,7 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
{
"storage",
MXS_MODULE_PARAM_STRING,
CACHE_DEFAULT_STORAGE
CACHE_ZDEFAULT_STORAGE
},
{
"storage_options",
@ -186,32 +189,32 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
{
"hard_ttl",
MXS_MODULE_PARAM_COUNT,
CACHE_DEFAULT_HARD_TTL
CACHE_ZDEFAULT_HARD_TTL
},
{
"soft_ttl",
MXS_MODULE_PARAM_COUNT,
CACHE_DEFAULT_SOFT_TTL
CACHE_ZDEFAULT_SOFT_TTL
},
{
"max_resultset_rows",
MXS_MODULE_PARAM_COUNT,
CACHE_DEFAULT_MAX_RESULTSET_ROWS
CACHE_ZDEFAULT_MAX_RESULTSET_ROWS
},
{
"max_resultset_size",
MXS_MODULE_PARAM_SIZE,
CACHE_DEFAULT_MAX_RESULTSET_SIZE
CACHE_ZDEFAULT_MAX_RESULTSET_SIZE
},
{
"max_count",
MXS_MODULE_PARAM_COUNT,
CACHE_DEFAULT_MAX_COUNT
CACHE_ZDEFAULT_MAX_COUNT
},
{
"max_size",
MXS_MODULE_PARAM_SIZE,
CACHE_DEFAULT_MAX_SIZE
CACHE_ZDEFAULT_MAX_SIZE
},
{
"rules",
@ -220,33 +223,33 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
{
"debug",
MXS_MODULE_PARAM_COUNT,
CACHE_DEFAULT_DEBUG
CACHE_ZDEFAULT_DEBUG
},
{
"cached_data",
MXS_MODULE_PARAM_ENUM,
CACHE_DEFAULT_THREAD_MODEL,
CACHE_ZDEFAULT_THREAD_MODEL,
MXS_MODULE_OPT_NONE,
parameter_cached_data_values
},
{
"selects",
MXS_MODULE_PARAM_ENUM,
CACHE_DEFAULT_SELECTS,
CACHE_ZDEFAULT_SELECTS,
MXS_MODULE_OPT_NONE,
parameter_selects_values
},
{
"cache_in_transactions",
MXS_MODULE_PARAM_ENUM,
CACHE_DEFAULT_CACHE_IN_TRXS,
CACHE_ZDEFAULT_CACHE_IN_TRXS,
MXS_MODULE_OPT_NONE,
parameter_cache_in_trxs_values
},
{
"enabled",
MXS_MODULE_PARAM_BOOL,
CACHE_DEFAULT_ENABLED
CACHE_ZDEFAULT_ENABLED
},
{MXS_END_MODULE_PARAMS}
}

View File

@ -38,37 +38,39 @@
#define UINT64_MAX (18446744073709551615UL)
#endif
// Count
#define CACHE_DEFAULT_MAX_RESULTSET_ROWS "0"
// Bytes
#define CACHE_DEFAULT_MAX_RESULTSET_SIZE "0"
// Seconds
#define CACHE_DEFAULT_HARD_TTL "0"
// Seconds
#define CACHE_DEFAULT_SOFT_TTL "0"
// Integer value
#define CACHE_DEFAULT_DEBUG "0"
// Positive integer
#define CACHE_DEFAULT_MAX_COUNT "0"
// Positive integer
#define CACHE_DEFAULT_MAX_SIZE "0"
// Thread model
#define CACHE_DEFAULT_THREAD_MODEL "shared"
// Cacheable selects
#define CACHE_DEFAULT_SELECTS "verify_cacheable"
// Storage
#define CACHE_DEFAULT_STORAGE "storage_inmemory"
// Transaction behaviour
#define CACHE_DEFAULT_CACHE_IN_TRXS "all_transactions"
// Enabled
#define CACHE_DEFAULT_ENABLED "true"
typedef enum cache_selects
{
CACHE_SELECTS_ASSUME_CACHEABLE,
CACHE_SELECTS_VERIFY_CACHEABLE,
} cache_selects_t;
// Count
#define CACHE_ZDEFAULT_MAX_RESULTSET_ROWS "0"
// Bytes
#define CACHE_ZDEFAULT_MAX_RESULTSET_SIZE "0"
// Seconds
#define CACHE_ZDEFAULT_HARD_TTL "0"
// Seconds
#define CACHE_ZDEFAULT_SOFT_TTL "0"
// Integer value
#define CACHE_ZDEFAULT_DEBUG "0"
// Positive integer
#define CACHE_ZDEFAULT_MAX_COUNT "0"
// Positive integer
#define CACHE_ZDEFAULT_MAX_SIZE "0"
// Thread model
#define CACHE_ZDEFAULT_THREAD_MODEL "thread_specific"
const cache_thread_model CACHE_DEFAULT_THREAD_MODEL = CACHE_THREAD_MODEL_ST;
// Cacheable selects
#define CACHE_ZDEFAULT_SELECTS "assume_cacheable"
const cache_selects_t CACHE_DEFAULT_SELECTS = CACHE_SELECTS_ASSUME_CACHEABLE;
// Storage
#define CACHE_ZDEFAULT_STORAGE "storage_inmemory"
// Transaction behaviour
#define CACHE_ZDEFAULT_CACHE_IN_TRXS "all_transactions"
// Enabled
#define CACHE_ZDEFAULT_ENABLED "true"
typedef enum cache_in_trxs
{
// Do NOT change the order. Code relies upon NEVER < READ_ONLY < ALL.

View File

@ -404,7 +404,7 @@ MXS_MODULE* MXS_CREATE_MODULE()
{
PARAM_NEWLINE,
MXS_MODULE_PARAM_QUOTEDSTRING,
" ",
"\" \"",
MXS_MODULE_OPT_NONE
},
{

View File

@ -356,6 +356,11 @@ bool RWSplitSession::route_single_stmt(GWBUF *querybuf)
MXS_INFO("Delaying routing: %s", extract_sql(querybuf).c_str());
}
else
{
MXS_ERROR("Could not find valid server for target type %s, closing "
"connection.", STRTARGET(route_target));
}
}
if (succp && m_router->config().connection_keepalive &&
@ -806,11 +811,12 @@ SRWBackend RWSplitSession::handle_slave_is_target(uint8_t cmd, uint32_t stmt_id)
if (it->second->in_use())
{
target = it->second;
MXS_INFO("COM_STMT_FETCH on %s", target->uri());
MXS_INFO("COM_STMT_FETCH on %s", target->name());
}
else
{
MXS_INFO("Old target not in use, cannot proceed");
MXS_ERROR("Old COM_STMT_EXECUTE target %s not in use, cannot "
"proceed with COM_STMT_FETCH", it->second->name());
}
}
else
@ -818,8 +824,7 @@ SRWBackend RWSplitSession::handle_slave_is_target(uint8_t cmd, uint32_t stmt_id)
MXS_WARNING("Unknown statement ID %u used in COM_STMT_FETCH", stmt_id);
}
}
if (!target)
else
{
target = get_target_backend(BE_SLAVE, NULL, rlag_max);
}