Skip to content

Spanner stale read #831

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Aug 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion spanner/cloud-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ limitations under the License.
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner</artifactId>
<version>0.21.1-beta</version>
<version>0.22.0-beta</version>
<exclusions>
<exclusion> <!-- exclude an old version of Guava -->
<groupId>com.google.guava</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,47 +16,29 @@

package com.example.spanner;

// [START transaction_import]
import static com.google.cloud.spanner.TransactionRunner.TransactionCallable;
// [END transaction_import]

import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.DatabaseAdminClient;
import com.google.cloud.spanner.DatabaseClient;
import com.google.cloud.spanner.DatabaseId;
// [START transaction_import]
import com.google.cloud.spanner.Key;
// [END transaction_import]
// [START read_import]
import com.google.cloud.spanner.KeySet;
// [END read_import]
// [START write_import]
import com.google.cloud.spanner.Mutation;
// [END write_import]
import com.google.cloud.spanner.Operation;
// [START read_only_transaction_import]
import com.google.cloud.spanner.ReadOnlyTransaction;
// [END read_only_transaction_import]
// [START query_import]
import com.google.cloud.spanner.ResultSet;
// [END query_import]
import com.google.cloud.spanner.Spanner;
import com.google.cloud.spanner.SpannerOptions;
// [START query_import]
import com.google.cloud.spanner.Statement;
// [END query_import]
// [START transaction_import]
import com.google.cloud.spanner.Struct;
import com.google.cloud.spanner.TimestampBound;
import com.google.cloud.spanner.TransactionContext;
// [END transaction_import]
import com.google.spanner.admin.database.v1.CreateDatabaseMetadata;

// [START write_import]

import java.util.ArrayList;
// [END write_import]
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
* Example code for using the Cloud Spanner API. This example demonstrates all the common
Expand All @@ -67,11 +49,14 @@
* <li> Writing data using a read-write transaction.
* <li> Using an index to read and execute SQL queries over data.
* </ul>
*
*/
public class SpannerSample {
/** Class to contain singer sample data. */

/**
* Class to contain singer sample data.
*/
static class Singer {

final long singerId;
final String firstName;
final String lastName;
Expand All @@ -83,8 +68,11 @@ static class Singer {
}
}

/** Class to contain album sample data. */
/**
* Class to contain album sample data.
*/
static class Album {

final long singerId;
final long albumId;
final String albumTitle;
Expand Down Expand Up @@ -116,22 +104,22 @@ static class Album {

static void createDatabase(DatabaseAdminClient dbAdminClient, DatabaseId id) {
Operation<Database, CreateDatabaseMetadata> op = dbAdminClient
.createDatabase(
id.getInstanceId().getInstance(),
id.getDatabase(),
Arrays.asList(
"CREATE TABLE Singers (\n"
+ " SingerId INT64 NOT NULL,\n"
+ " FirstName STRING(1024),\n"
+ " LastName STRING(1024),\n"
+ " SingerInfo BYTES(MAX)\n"
+ ") PRIMARY KEY (SingerId)",
"CREATE TABLE Albums (\n"
+ " SingerId INT64 NOT NULL,\n"
+ " AlbumId INT64 NOT NULL,\n"
+ " AlbumTitle STRING(MAX)\n"
+ ") PRIMARY KEY (SingerId, AlbumId),\n"
+ " INTERLEAVE IN PARENT Singers ON DELETE CASCADE"));
.createDatabase(
id.getInstanceId().getInstance(),
id.getDatabase(),
Arrays.asList(
"CREATE TABLE Singers (\n"
+ " SingerId INT64 NOT NULL,\n"
+ " FirstName STRING(1024),\n"
+ " LastName STRING(1024),\n"
+ " SingerInfo BYTES(MAX)\n"
+ ") PRIMARY KEY (SingerId)",
"CREATE TABLE Albums (\n"
+ " SingerId INT64 NOT NULL,\n"
+ " AlbumId INT64 NOT NULL,\n"
+ " AlbumTitle STRING(MAX)\n"
+ ") PRIMARY KEY (SingerId, AlbumId),\n"
+ " INTERLEAVE IN PARENT Singers ON DELETE CASCADE"));
Database db = op.waitFor().getResult();
System.out.println("Created database [" + db.getId() + "]");
}
Expand Down Expand Up @@ -413,6 +401,22 @@ static void readOnlyTransaction(DatabaseClient dbClient) {
}
// [END read_only_transaction]

// [START read_stale_data]
static void readStaleData(DatabaseClient dbClient) {
ResultSet resultSet =
dbClient
.singleUse(TimestampBound.ofExactStaleness(10, TimeUnit.SECONDS))
.read("Albums",
KeySet.all(),
Arrays.asList("SingerId", "AlbumId", "MarketingBudget"));
while (resultSet.next()) {
System.out.printf(
"%d %d %s\n", resultSet.getLong(0), resultSet.getLong(1),
resultSet.isNull(2) ? "NULL" : resultSet.getLong("MarketingBudget"));
}
}
// [END read_stale_data]

static void run(DatabaseClient dbClient, DatabaseAdminClient dbAdminClient, String command,
DatabaseId database) {
switch (command) {
Expand Down Expand Up @@ -458,6 +462,9 @@ static void run(DatabaseClient dbClient, DatabaseAdminClient dbAdminClient, Stri
case "readonlytransaction":
readOnlyTransaction(dbClient);
break;
case "readstaledata":
readStaleData(dbClient);
break;
default:
printUsageAndExit();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,14 @@

import static com.google.common.truth.Truth.assertThat;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

/**
* Tests for quickstart sample.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,14 @@
import com.google.cloud.spanner.Spanner;
import com.google.cloud.spanner.SpannerOptions;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

/**
* Unit tests for {@code SpannerSample}
*/
Expand All @@ -43,6 +42,7 @@ public class SpannerSampleIT {
private final String databaseId = System.getProperty("spanner.sample.database");
DatabaseId dbId;
DatabaseAdminClient dbClient;
private long lastUpdateDataTimeInMillis;

private String runSample(String command) throws Exception {
PrintStream stdOut = System.out;
Expand Down Expand Up @@ -83,12 +83,17 @@ public void testSample() throws Exception {

out = runSample("query");
assertThat(out).contains("1 1 Total Junk");

runSample("addmarketingbudget");

// wait for 10 seconds to elapse and then run an update, and query for stale data
lastUpdateDataTimeInMillis = System.currentTimeMillis();
while (System.currentTimeMillis() < lastUpdateDataTimeInMillis + 11000) {
Thread.sleep(1000);
}
runSample("update");

out = runSample("readstaledata");
assertThat(out).contains("1 1 NULL");
runSample("writetransaction");

out = runSample("querymarketingbudget");
assertThat(out).contains("1 1 300000");
assertThat(out).contains("2 2 300000");
Expand Down