OS info:
dgraph.exe version
[Decoder]: Using assembly version of decoder
Dgraph version : v20.03.0
Dgraph SHA-256 : 2dd8a84711404f19a13375c377084795321f5e022eefafb869dbba6822b4d4fd
Commit SHA-1 : 147c8df9
Commit timestamp : 2020-03-30 17:28:31 -0700
Branch : HEAD
Go version : go1.14.1
For Dgraph official documentation, visit https://docs.dgraph.io.
For discussions about Dgraph , visit http://discuss.dgraph.io.
To say hi to the community , visit https://dgraph.slack.com.
Licensed variously under the Apache Public License 2.0 and Dgraph Community License.
Copyright 2015-2020 Dgraph Labs, Inc.
find bugs in logs
day one:
// do query
2020-08-13 16:32:18.530 INFO 4380 --- [http-nio-3003-exec-1] app.settings.UserSettingsImpl : userId: foo
settings: {"settings":[{"userId":"foo","nickname":"bar","language":"en","background":"../../static/bg/bg.png","lng":"121.4879","lat":"31.24916","is_first":true,"collectedInfo":"{}"}]}
// do update
2020-08-13 16:32:18.584 INFO 4380 --- [http-nio-3003-exec-2] app.settings.UserSettingsImpl : save user setting request is :{userId=foo, language=en, background=../../static/bg/bg.png, lat=31.24916, lng=121.4879}
2020-08-13 16:32:18.639 INFO 4380 --- [http-nio-3003-exec-2] app.settings.UserSettingsImpl : Save UserSettings JSON is {"uid":"0x1ea34","APP#usersettings":true,"APP#usersettings/userId":"foo","APP#usersettings/lat":"31.24916","APP#usersettings/language":"en","APP#usersettings/background":"../../static/bg/bg.png","APP#usersettings/lng":"121.4879","APP#dataSet#APP":true}
// do query again
2020-08-13 16:32:18.662 INFO 4380 --- [http-nio-3003-exec-2] app.settings.UserSettingsImpl : userId: foo
2020-08-13 16:32:18.711 INFO 4380 --- [http-nio-3003-exec-2] app.dgraph.DGraphService : query is
query x{
settings(func: has(<APP#usersettings>)) @filter(eq(<APP#usersettings/userId>, <foo>)){
userId: <APP#usersettings/userId>
nickname: <APP#usersettings/nickname>
userJobTitle: <APP#usersettings/userJobTitle>
language: <APP#usersettings/language>
feeling: <APP#usersettings/feeling>
background: <APP#usersettings/background>
lng: <APP#usersettings/lng>
lat: <APP#usersettings/lat>
is_first: <APP#usersettings/is_first>
collectedInfo: <APP#usersettings/collectedInfo>
}
}
,and response time is:
StopWatch '': running time = 47697800 ns
---------------------------------------------
ns % Task name
---------------------------------------------
047697800 100% Query and Response
// the response of query
2020-08-13 16:32:18.712 INFO 4380 --- [http-nio-3003-exec-2] app.settings.UserSettingsImpl : userId: foo
settings: {"settings":[{"userId":"foo","nickname":"bar","language":"en","background":"../../static/bg/bg.png","lng":"121.4879","lat":"31.24916","is_first":true,"collectedInfo":"{}"}]}
day two:
// do query
2020-08-14 11:32:48.262 INFO 4380 --- [http-nio-3003-exec-5] app.settings.UserSettingsImpl : userId: foo
2020-08-14 11:32:48.291 INFO 4380 --- [http-nio-3003-exec-5] app.dgraph.DGraphService : query is
query x{
settings(func: has(<APP#usersettings>)) @filter(eq(<APP#usersettings/userId>, <foo>)){
userId: <APP#usersettings/userId>
nickname: <APP#usersettings/nickname>
userJobTitle: <APP#usersettings/userJobTitle>
language: <APP#usersettings/language>
feeling: <APP#usersettings/feeling>
background: <APP#usersettings/background>
lng: <APP#usersettings/lng>
lat: <APP#usersettings/lat>
is_first: <APP#usersettings/is_first>
collectedInfo: <APP#usersettings/collectedInfo>
}
}
,and response time is:
StopWatch '': running time = 25138600 ns
---------------------------------------------
ns % Task name
---------------------------------------------
025138600 100% Query and Response
// the response of query, and not response as expected.
2020-08-14 11:32:48.291 INFO 4380 --- [http-nio-3003-exec-5] app.settings.UserSettingsImpl : userId: foo
settings: {"settings":[]}
// bugs here
expect: settings: {"settings":[{"userId":"foo","nickname":"bar","language":"en","background":"../../static/bg/bg.png","lng":"121.4879","lat":"31.24916","is_first":true,"collectedInfo":"{}"}]}
but got: settings: {"settings":[]}
It’s not 100% happens,but sometimes.
and I can’t provide steps to re-produce this bug.
Java dependency
<dependency>
<groupId>io.dgraph</groupId>
<artifactId>dgraph4j</artifactId>
<version>20.03.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
The code of DGraphService
package app.dgraph;
import io.dgraph.DgraphClient;
import io.dgraph.DgraphGrpc;
import io.dgraph.DgraphProto;
import io.dgraph.Transaction;
import io.grpc.*;
import io.grpc.netty.NettyChannelBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
*
*/
@Component
public class DGraphService {
/**
*
*/
private static final int DEFAULT_DEADLINE_SECS = 10;
/**
*
*/
@Value("${dgraph.deadline}")
private int defaultDeadlineSecs = DEFAULT_DEADLINE_SECS;
/**
* @Description: dgraphHost
*/
@Value("${dgraph.AlphaHost}")
private String dgraphHost = "localhost";
/**
*
*/
private static final int DEFAULTDGRAPHPORT = 9080;
/**
* @Description: port
*/
@Value("${dgraph.AlphaGrpcPort}")
private int port = DEFAULTDGRAPHPORT;
/**
* @Description: LOGGER
*/
private static final Logger LOGGER
= LoggerFactory.getLogger(DGraphService.class);
/**
* @return DgraphClient
*/
public DgraphClient client() {
return clientWithTimeout(defaultDeadlineSecs);
}
/**
* @param maxBody max body size
* @param deadlineSecs deadlineSecs
* @return client
*/
public DgraphClient clientWithTimeoutAndMaxBody(
final int deadlineSecs,
final int maxBody
) {
ManagedChannel channel = NettyChannelBuilder
.forAddress(dgraphHost, port)
.usePlaintext()
.maxInboundMessageSize(maxBody)
.build();
DgraphGrpc.DgraphStub stub = DgraphGrpc.newStub(channel);
stub.withDeadlineAfter(deadlineSecs, TimeUnit.MILLISECONDS);
stub.withInterceptors(new TimeOutInterceptor(deadlineSecs));
return new DgraphClient(stub);
}
/**
* @param deadlineSecs d
* @return DgraphClient
*/
public DgraphClient clientWithTimeout(final int deadlineSecs) {
ManagedChannel channel = NettyChannelBuilder
.forAddress(dgraphHost, port)
.usePlaintext()
.build();
DgraphGrpc.DgraphStub stub = DgraphGrpc.newStub(channel);
stub.withDeadlineAfter(deadlineSecs, TimeUnit.MILLISECONDS);
stub.withInterceptors(new TimeOutInterceptor((deadlineSecs)));
return new DgraphClient(stub);
}
/**
* @param xdgraphHost set host
*/
public void setDgraphHost(final String xdgraphHost) {
this.dgraphHost = xdgraphHost;
}
/**
* @param xport set port.
*/
public void setPort(final int xport) {
this.port = xport;
}
/**
* @param query query
* @param vars vars
* @return String
*/
public String response(
final String query,
final Map<String, String> vars) {
return response(client(), query, vars);
}
/**
* @param query query
* @param client client
* @param vars vars
* @return String
*/
public String response(
final DgraphClient client,
final String query,
final Map<String, String> vars) {
try (
Transaction trx = client.newTransaction();
) {
StopWatch sw = new StopWatch();
sw.start("Query and Response ");
String ret = trx.queryWithVars(query, vars)
.getJson().toStringUtf8();
sw.stop();
String sp = sw.prettyPrint();
LOGGER.info("query is \n{}\n ,and response time is: \n{}",
query, sp);
return ret;
} catch (StatusRuntimeException e) {
LOGGER.error(
"error query is\n {} \nand params is {}"
+
",and hostinfo is {},{} ",
query, vars, dgraphHost, port);
throw e;
}
}
/**
* @param query query
* @param timeout timeout
* @param maxBody maxbody
* @param vars vars
* @return response
*/
public String responseWithTimeoutAndMaxBody(
final String query,
final int timeout,
final int maxBody,
final Map<String, String> vars) {
DgraphClient client = clientWithTimeoutAndMaxBody(timeout, maxBody);
return response(client, query, vars);
}
/**
* @param query query
* @param timeout timeoutSec
* @param vars vars
* @return String
*/
public String responseWithTimeout(
final String query,
final int timeout,
final Map<String, String> vars) {
try (
Transaction trx = clientWithTimeout(timeout).newTransaction();
) {
StopWatch sw = new StopWatch();
sw.start("Query and Response ");
String ret = trx
.queryWithVars(query, vars)
.getJson().toStringUtf8();
sw.stop();
String sp = sw.prettyPrint();
LOGGER.info("query is {} ,and response time is {}",
query, sp);
return ret;
} catch (StatusRuntimeException e) {
LOGGER.error(
"error query is\n {} \nand params is {}"
+
",and hostinfo is {},{} ",
query, vars, dgraphHost, port);
throw e;
}
}
/**
* @param query query
* @param keyVals keyVals
* @return String
*/
public String response(final String query, final String... keyVals) {
return response(client(), query, keyVals);
}
/**
* @param query query
* @param client client
* @param keyVals keyVals
* @return String
*/
public String response(
final DgraphClient client,
final String query, final String... keyVals) {
Map<String, String> vars = new HashMap<>();
for (int i = 0; i < keyVals.length; i = i + 2) {
vars.put(keyVals[i], keyVals[i + 1]);
}
return response(client, query, vars);
}
/**
* @param query query
* @param timeout 超時時間
* @param keyVals keyVals
* @return String
*/
public String responseWithTimeout(
final String query, final int timeout, final String... keyVals) {
Map<String, String> vars = new HashMap<>();
for (int i = 0; i < keyVals.length; i = i + 2) {
vars.put(keyVals[i], keyVals[i + 1]);
}
return responseWithTimeout(query, timeout, vars);
}
/**
* @param mutation mutation
*/
public void doMutate(final DgraphProto.Mutation mutation) {
try (
Transaction ts = this.client().newTransaction();
) {
ts.mutate(mutation);
ts.commit();
ts.discard();
} catch (Exception e) {
LOGGER.error(
"exception when domutation {},and the error mutation is {}",
e, mutation.getSetJson().toStringUtf8());
}
}
}
/**
*
*/
class TimeOutInterceptor implements ClientInterceptor {
/**
*
*/
private int deadlineSecs = 0;
/**
* @param deadline deadline in seconds.
*/
TimeOutInterceptor(final int deadline) {
this.deadlineSecs = deadline;
}
@Override
public <T, P> ClientCall<T, P> interceptCall(
final MethodDescriptor<T, P> method,
final CallOptions callOptions,
final Channel next) {
return next.newCall(method, callOptions.withDeadlineAfter(
deadlineSecs, TimeUnit.MILLISECONDS));
}
}
MODERATOR EDITS
@chewxy: Potentially similar issue: Queries returning empty results randomly - #13 by BlankRain