Skip to content

Commit 40aa7e8

Browse files
authored
Merge pull request #136 from SpineEventEngine/inbox-version-column
Update to Spine Core `1.2.5`
2 parents eea8265 + 0a4643f commit 40aa7e8

File tree

11 files changed

+228
-29
lines changed

11 files changed

+228
-29
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ dependencies {
1414
implementation (
1515
1616
// Datastore Storage support library.
17-
"io.spine.gcloud:spine-datastore:1.2.0",
17+
"io.spine.gcloud:spine-datastore:1.2.5",
1818
1919
// Stackdriver Trace support library.
20-
"io.spine.gcloud:spine-stackdriver-trace:1.2.0",
20+
"io.spine.gcloud:spine-stackdriver-trace:1.2.5",
2121
2222
// Datastore-related test utilities (if needed).
23-
"io.spine.gcloud:testutil-gcloud:1.2.0"
23+
"io.spine.gcloud:testutil-gcloud:1.2.5"
2424
)
2525
}
2626
```

datastore/config/index.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ indexes:
1414
properties:
1515
- name: inbox_shard
1616
- name: when_received
17+
- name: version
1718

1819
# Indexes for the Aggregates.
1920
#

datastore/src/main/java/io/spine/server/storage/datastore/DsInboxStorage.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@
3535
import io.spine.string.Stringifiers;
3636

3737
import java.util.Iterator;
38+
import java.util.Optional;
3839

3940
import static com.google.cloud.Timestamp.fromProto;
4041
import static com.google.cloud.datastore.StructuredQuery.CompositeFilter.and;
4142
import static com.google.cloud.datastore.StructuredQuery.OrderBy.asc;
4243
import static com.google.cloud.datastore.StructuredQuery.PropertyFilter.eq;
4344
import static com.google.common.base.Preconditions.checkNotNull;
45+
import static io.spine.server.delivery.InboxMessageStatus.TO_DELIVER;
4446

4547
/**
4648
* {@link InboxStorage} implementation based on Google Cloud Datastore.
@@ -67,17 +69,40 @@ MessageColumn<InboxMessage>[] columns() {
6769
public Page<InboxMessage> readAll(ShardIndex index, int pageSize) {
6870
checkNotNull(index);
6971

72+
EntityQuery.Builder builder = queryInShard(index);
73+
builder.setOrderBy(asc(Column.whenReceived.columnName()),
74+
asc(Column.version.columnName()));
75+
Iterator<InboxMessage> iterator = readAll(builder, pageSize);
76+
return new InboxPage(iterator, pageSize);
77+
}
78+
79+
@Override
80+
public Optional<InboxMessage> oldestMessageToDeliver(ShardIndex index) {
7081
int indexValue = index.getIndex();
7182
int totalValue = index.getOfTotal();
7283
EntityQuery.Builder builder =
7384
Query.newEntityQueryBuilder()
7485
.setFilter(and(
7586
eq(Column.shardIndex.columnName(), indexValue),
76-
eq(Column.ofTotalShards.columnName(), totalValue)
87+
eq(Column.ofTotalShards.columnName(),totalValue),
88+
eq(Column.status.columnName(), TO_DELIVER.toString())
7789
))
78-
.setOrderBy(asc(Column.whenReceived.columnName()));
79-
Iterator<InboxMessage> iterator = readAll(builder, pageSize);
80-
return new InboxPage(iterator, pageSize);
90+
.setLimit(1);
91+
Iterator<InboxMessage> iterator = read(builder);
92+
if(iterator.hasNext()) {
93+
return Optional.of(iterator.next());
94+
}
95+
return Optional.empty();
96+
}
97+
98+
private static EntityQuery.Builder queryInShard(ShardIndex index) {
99+
int indexValue = index.getIndex();
100+
int totalValue = index.getOfTotal();
101+
return Query.newEntityQueryBuilder()
102+
.setFilter(and(
103+
eq(Column.shardIndex.columnName(), indexValue),
104+
eq(Column.ofTotalShards.columnName(), totalValue)
105+
));
81106
}
82107

83108
/**
@@ -124,6 +149,10 @@ private enum Column implements MessageColumn<InboxMessage> {
124149

125150
whenReceived("when_received", (m) -> {
126151
return TimestampValue.of(fromProto(m.getWhenReceived()));
152+
}),
153+
154+
version("version", (m) -> {
155+
return LongValue.of(m.getVersion());
127156
});
128157

129158
/**

datastore/src/main/java/io/spine/server/storage/datastore/DsMessageStorage.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,32 @@ public void writeAll(Iterable<M> messages) {
188188
* @see DatastoreWrapper#readAll(StructuredQuery, int)
189189
*/
190190
Iterator<M> readAll(EntityQuery.Builder queryBuilder, int readBatchSize) {
191-
StructuredQuery<Entity> query =
192-
queryBuilder.setKind(kind.value())
193-
.build();
191+
StructuredQuery<Entity> query = queryBuilder.setKind(kind.value())
192+
.build();
194193
Iterator<Entity> iterator = datastore.readAll(query, readBatchSize);
195-
Iterator<M> transformed =
196-
Iterators.transform(iterator, (e) -> Entities.toMessage(e, typeUrl));
194+
Iterator<M> transformed = Iterators.transform(iterator,
195+
(e) -> Entities.toMessage(e, typeUrl));
197196
return transformed;
198197
}
199198

199+
/**
200+
* Reads the messages from the storage.
201+
*
202+
* <p>The caller is responsible for setting the query limits and interpreting the results.
203+
* This call does not trigger reading of the entire dataset page-by-page.
204+
*
205+
* @param queryBuilder the partially composed query builder
206+
* @see DatastoreWrapper#read(StructuredQuery)
207+
* @see #readAll(EntityQuery.Builder, int)
208+
*/
209+
Iterator<M> read(EntityQuery.Builder queryBuilder) {
210+
StructuredQuery<Entity> query = queryBuilder.setKind(kind.value())
211+
.build();
212+
DsQueryIterator<Entity> iterator = datastore.read(query);
213+
Iterator<M> result = Iterators.transform(iterator, (e) -> Entities.toMessage(e, typeUrl));
214+
return result;
215+
}
216+
200217
/**
201218
* Removes all the messages from the storage by their identifiers.
202219
*
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
* Copyright 2019, TeamDev. All rights reserved.
3+
*
4+
* Redistribution and use in source and/or binary forms, with or without
5+
* modification, must retain the above copyright notice and the following
6+
* disclaimer.
7+
*
8+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
11+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
13+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
14+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
15+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
16+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
18+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19+
*/
20+
21+
package io.spine.server.storage.datastore;
22+
23+
import io.spine.server.ServerEnvironment;
24+
import io.spine.server.delivery.DeliveryTest;
25+
import io.spine.testing.SlowTest;
26+
import io.spine.testing.server.storage.datastore.TestDatastoreStorageFactory;
27+
import org.junit.jupiter.api.AfterEach;
28+
import org.junit.jupiter.api.BeforeEach;
29+
import org.junit.jupiter.api.Disabled;
30+
import org.junit.jupiter.api.DisplayName;
31+
import org.junit.jupiter.api.Test;
32+
33+
/**
34+
* Smoke tests on {@link Delivery} functionality running on top of Datastore-backed storage.
35+
*
36+
* <p>The tests are extremely slow, so only a tiny portion of the original {@link DeliveryTest}
37+
* is launched.
38+
*/
39+
@DisplayName("Datastore-backed `Delivery` should ")
40+
@SlowTest
41+
public class DsDeliverySmokeTest extends DeliveryTest {
42+
43+
private TestDatastoreStorageFactory factory;
44+
45+
@BeforeEach
46+
@Override
47+
public void setUp() {
48+
super.setUp();
49+
factory = TestDatastoreStorageFactory.local();
50+
ServerEnvironment.instance()
51+
.configureStorageForTests(factory);
52+
}
53+
54+
@AfterEach
55+
@Override
56+
public void tearDown() {
57+
super.tearDown();
58+
if (factory != null) {
59+
factory.tearDown();
60+
}
61+
}
62+
63+
@Test
64+
@DisplayName("deliver messages via multiple shards to multiple targets in a multi-threaded env")
65+
@Override
66+
public void manyTargets_manyShards_manyThreads() {
67+
super.manyTargets_manyShards_manyThreads();
68+
}
69+
70+
@Test
71+
@Disabled
72+
@Override
73+
public void markDelivered() {
74+
}
75+
76+
@Test
77+
@Disabled
78+
@Override
79+
public void singleTarget_singleShard_manyThreads() {
80+
}
81+
82+
@Test
83+
@Disabled
84+
@Override
85+
public void manyTargets_singleShard_manyThreads() {
86+
}
87+
88+
@Test
89+
@Disabled
90+
@Override
91+
public void singleTarget_manyShards_manyThreads() {
92+
}
93+
94+
@Test
95+
@Disabled
96+
@Override
97+
public void singleTarget_manyShards_singleThread() {
98+
}
99+
100+
@Test
101+
@Disabled
102+
@Override
103+
public void singleTarget_singleShard_singleThread() {
104+
}
105+
106+
@Test
107+
@Disabled
108+
@Override
109+
public void manyTargets_singleShard_singleThread() {
110+
}
111+
112+
@Test
113+
@Disabled
114+
@Override
115+
public void manyTargets_manyShards_singleThread() {
116+
}
117+
118+
@Test
119+
@Disabled
120+
@Override
121+
public void withCustomStrategy() {
122+
}
123+
124+
@Test
125+
@Disabled
126+
@Override
127+
public void calculateStats() {
128+
}
129+
130+
@Test
131+
@Disabled
132+
@Override
133+
public void returnOptionalEmptyIfPicked() {
134+
}
135+
136+
@Test
137+
@Disabled
138+
@Override
139+
public void notifyDeliveryMonitorOfDeliveryCompletion() {
140+
}
141+
142+
@Test
143+
@Disabled
144+
@Override
145+
public void deliverInBatch() {
146+
}
147+
148+
@Test
149+
@Disabled
150+
@Override
151+
public void deliverMessagesInOrderOfEmission() {
152+
}
153+
}

datastore/src/test/java/io/spine/server/storage/datastore/DsInboxStorageTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@
5757
@DisplayName("`DsInboxStorage` should")
5858
class DsInboxStorageTest extends InboxStorageTest {
5959

60-
private final TestDatastoreStorageFactory factory =
61-
TestDatastoreStorageFactory.local();
60+
private final TestDatastoreStorageFactory factory = TestDatastoreStorageFactory.local();
6261

6362
@Override
6463
@BeforeEach

license-report.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
# Dependencies of `io.spine.gcloud:spine-datastore:1.2.1`
3+
# Dependencies of `io.spine.gcloud:spine-datastore:1.2.5`
44

55
## Runtime
66
1. **Group:** com.fasterxml.jackson.core **Name:** jackson-core **Version:** 2.9.9
@@ -689,12 +689,12 @@
689689
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
690690

691691

692-
This report was generated on **Mon Nov 11 19:27:23 EET 2019** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
692+
This report was generated on **Tue Nov 19 17:37:41 EET 2019** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
693693

694694

695695

696696

697-
# Dependencies of `io.spine.gcloud:spine-stackdriver-trace:1.2.1`
697+
# Dependencies of `io.spine.gcloud:spine-stackdriver-trace:1.2.5`
698698

699699
## Runtime
700700
1. **Group:** com.fasterxml.jackson.core **Name:** jackson-core **Version:** 2.9.6
@@ -1380,12 +1380,12 @@ This report was generated on **Mon Nov 11 19:27:23 EET 2019** using [Gradle-Lice
13801380
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
13811381

13821382

1383-
This report was generated on **Mon Nov 11 19:27:24 EET 2019** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
1383+
This report was generated on **Tue Nov 19 17:37:46 EET 2019** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
13841384

13851385

13861386

13871387

1388-
# Dependencies of `io.spine.gcloud:spine-testutil-gcloud:1.2.1`
1388+
# Dependencies of `io.spine.gcloud:spine-testutil-gcloud:1.2.5`
13891389

13901390
## Runtime
13911391
1. **Group:** com.fasterxml.jackson.core **Name:** jackson-core **Version:** 2.9.9
@@ -2095,4 +2095,4 @@ This report was generated on **Mon Nov 11 19:27:24 EET 2019** using [Gradle-Lice
20952095
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
20962096

20972097

2098-
This report was generated on **Mon Nov 11 19:27:26 EET 2019** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
2098+
This report was generated on **Tue Nov 19 17:37:47 EET 2019** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).

pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ all modules and does not describe the project structure per-subproject.
1212

1313
<groupId>io.spine.gcloud</groupId>
1414
<artifactId>spine-gcloud-java</artifactId>
15-
<version>1.2.1</version>
15+
<version>1.2.5</version>
1616

1717
<inceptionYear>2015</inceptionYear>
1818

@@ -40,7 +40,7 @@ all modules and does not describe the project structure per-subproject.
4040
<dependency>
4141
<groupId>io.spine</groupId>
4242
<artifactId>spine-server</artifactId>
43-
<version>1.2.1</version>
43+
<version>1.2.5</version>
4444
<scope>compile</scope>
4545
</dependency>
4646
<dependency>
@@ -58,7 +58,7 @@ all modules and does not describe the project structure per-subproject.
5858
<dependency>
5959
<groupId>io.spine</groupId>
6060
<artifactId>spine-testutil-server</artifactId>
61-
<version>1.2.1</version>
61+
<version>1.2.5</version>
6262
<scope>test</scope>
6363
</dependency>
6464
<dependency>
@@ -114,12 +114,12 @@ all modules and does not describe the project structure per-subproject.
114114
<dependency>
115115
<groupId>io.spine.tools</groupId>
116116
<artifactId>spine-errorprone-checks</artifactId>
117-
<version>1.2.1</version>
117+
<version>1.2.3</version>
118118
</dependency>
119119
<dependency>
120120
<groupId>io.spine.tools</groupId>
121121
<artifactId>spine-protoc-plugin</artifactId>
122-
<version>1.2.1</version>
122+
<version>1.2.3</version>
123123
</dependency>
124124
<dependency>
125125
<groupId>net.sourceforge.pmd</groupId>

stackdriver-trace/src/main/java/io/spine/server/trace/stackdriver/SignalSpan.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ protected Span asTraceSpan(ProjectId gcpProjectId) {
100100
}
101101

102102
private String displayName() {
103-
TypeName signalType = signal.typeUrl()
103+
TypeName signalType = signal.enclosedTypeUrl()
104104
.toTypeName();
105105
ClassName className = ClassName.of(receiverType.getJavaClassName());
106106
return format("%s handles %s", className.toSimple(), signalType.simpleName());

0 commit comments

Comments
 (0)